From 7fd15219b923a52efdd7c2dc5e6ca9a2fbf5b7ec Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sun, 29 Mar 2015 14:50:27 +0200 Subject: [PATCH] ttf: get rid of slow xmls --- lib/ttf.jar | Bin 814960 -> 138651 bytes .../flash/exporters/FontExporter.java | 9 +- libsrc/ttf/src/fontastic/FContour.java | 21 +- libsrc/ttf/src/fontastic/FGlyph.java | 10 +- libsrc/ttf/src/fontastic/FPoint.java | 17 +- libsrc/ttf/src/fontastic/Fontastic.java | 115 +- libsrc/ttf/src/fontastic/PVector.java | 27 - libsrc/ttf/src/fontatest/FontaTest.java | 61 +- .../src/org/doubletype/ossa/ActiveList.java | 199 - .../src/org/doubletype/ossa/AppSettings.java | 55 - .../ttf/src/org/doubletype/ossa/Engine.java | 501 +- .../src/org/doubletype/ossa/GlyphColor.java | 67 - .../org/doubletype/ossa/GlyphFileFilter.java | 60 - .../src/org/doubletype/ossa/ImageSizer.java | 91 - .../ttf/src/org/doubletype/ossa/Memento.java | 89 - .../org/doubletype/ossa/ModuleManager.java | 96 - .../src/org/doubletype/ossa/MyTableModel.java | 73 - .../ttf/src/org/doubletype/ossa/Renderer.java | 44 - .../ttf/src/org/doubletype/ossa/Tabbable.java | 5 - .../ossa/TabbedPaneCloseButtonUI.java | 188 - .../doubletype/ossa/TypefaceFileFilter.java | 59 - .../ttf/src/org/doubletype/ossa/UiBridge.java | 12 - .../org/doubletype/ossa/UnicodeBuilder.java | 184 - .../doubletype/ossa/adapter/CubicSegment.java | 598 +- .../org/doubletype/ossa/adapter/EContour.java | 329 +- .../ossa/adapter/EContourPoint.java | 517 +- .../ossa/adapter/EControlPoint.java | 311 +- .../ossa/adapter/EGlyphFactory.java | 109 - .../org/doubletype/ossa/adapter/EHint.java | 195 - .../ossa/adapter/EIncludeInvoke.java | 167 - .../ossa/adapter/EModuleInvoke.java | 288 - .../org/doubletype/ossa/adapter/EObject.java | 158 - .../org/doubletype/ossa/adapter/Emulator.java | 361 - .../doubletype/ossa/adapter/GlyphObject.java | 51 - .../ossa/adapter/PointAggregate.java | 49 - .../ossa/adapter/QuadraticSegment.java | 375 +- .../org/doubletype/ossa/module/GlyphFile.java | 890 +- .../doubletype/ossa/module/GlyphIterator.java | 237 - .../doubletype/ossa/module/GlyphModule.java | 90 - .../org/doubletype/ossa/module/Rectangle.java | 192 - .../ossa/module/SelectionIterator.java | 69 - .../doubletype/ossa/module/TypefaceFile.java | 367 +- .../org/doubletype/ossa/module/VarStack.java | 112 - .../doubletype/ossa/module/VarStackFrame.java | 53 - .../org/doubletype/ossa/module/empty.glyph | 21 - .../doubletype/ossa/truetype/CmapWriter.java | 28 +- .../ossa/truetype/FontFileWriter.java | 2 +- .../ossa/truetype/FontFormatWriter.java | 346 +- .../doubletype/ossa/truetype/GlyfWriter.java | 20 +- .../doubletype/ossa/truetype/HdmxWriter.java | 234 +- .../doubletype/ossa/truetype/HeadWriter.java | 312 +- .../doubletype/ossa/truetype/HheaWriter.java | 216 +- .../doubletype/ossa/truetype/HmtxWriter.java | 178 +- .../doubletype/ossa/truetype/LocaWriter.java | 134 +- .../doubletype/ossa/truetype/MaxpWriter.java | 274 +- .../doubletype/ossa/truetype/NameWriter.java | 366 +- .../doubletype/ossa/truetype/OS2Writer.java | 484 +- .../doubletype/ossa/truetype/PostWriter.java | 152 +- .../doubletype/ossa/truetype/TTCodePage.java | 378 +- .../org/doubletype/ossa/truetype/TTGlyph.java | 782 +- .../doubletype/ossa/truetype/TTPixelSize.java | 214 +- .../ossa/truetype/TTUnicodeRange.java | 8 +- .../ossa/xml/AbstractGlyphFactory.java | 3291 ------ .../ossa/xml/DefaultGlyphFactory.java | 394 - .../org/doubletype/ossa/xml/GlyphFactory.java | 55 - .../doubletype/ossa/xml/IGlyphFactory.java | 2279 ----- .../src/org/doubletype/ossa/xml/IRNode.java | 51 - .../org/doubletype/ossa/xml/RInterleave.java | 753 -- .../src/org/doubletype/ossa/xml/RStack.java | 286 - .../org/doubletype/ossa/xml/Relaxer.README | 2 - .../org/doubletype/ossa/xml/Relaxer.manifest | 2 - .../doubletype/ossa/xml/Relaxer.properties | 8 - .../src/org/doubletype/ossa/xml/UJAXP.java | 1016 -- .../src/org/doubletype/ossa/xml/URelaxer.java | 8788 ----------------- .../src/org/doubletype/ossa/xml/XBody.java | 1194 --- .../src/org/doubletype/ossa/xml/XContour.java | 759 -- .../doubletype/ossa/xml/XContourPoint.java | 1015 -- .../doubletype/ossa/xml/XControlPoint.java | 666 -- .../org/doubletype/ossa/xml/XGlyphFile.java | 632 -- .../src/org/doubletype/ossa/xml/XHead.java | 2546 ----- .../org/doubletype/ossa/xml/XHeadGlobal.java | 684 -- .../org/doubletype/ossa/xml/XHeadLocal.java | 684 -- .../src/org/doubletype/ossa/xml/XHint.java | 607 -- .../src/org/doubletype/ossa/xml/XInclude.java | 612 -- .../src/org/doubletype/ossa/xml/XInvoke.java | 930 -- .../org/doubletype/ossa/xml/XInvokeArg.java | 618 -- .../org/doubletype/ossa/xml/XInvokePos.java | 548 - .../org/doubletype/ossa/xml/XInvokeVarg.java | 637 -- .../src/org/doubletype/ossa/xml/XModule.java | 799 -- .../org/doubletype/ossa/xml/XParamList.java | 452 - .../doubletype/ossa/xml/XParamListParam.java | 618 -- .../src/org/doubletype/ossa/xml/XPoint2d.java | 627 -- .../ossa/xml/XStartGlyphElement.java | 587 -- .../ttf/src/org/doubletype/ossa/xml/glyph.rng | 217 - 94 files changed, 2990 insertions(+), 41017 deletions(-) delete mode 100644 libsrc/ttf/src/fontastic/PVector.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/ActiveList.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/AppSettings.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/GlyphColor.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/GlyphFileFilter.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/ImageSizer.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/Memento.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/ModuleManager.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/MyTableModel.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/Renderer.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/Tabbable.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/TabbedPaneCloseButtonUI.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/TypefaceFileFilter.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/UiBridge.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/UnicodeBuilder.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/EGlyphFactory.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/EHint.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/EIncludeInvoke.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/EModuleInvoke.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/EObject.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/Emulator.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/GlyphObject.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/adapter/PointAggregate.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/GlyphIterator.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/GlyphModule.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/Rectangle.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/SelectionIterator.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/VarStack.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/VarStackFrame.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/module/empty.glyph delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/AbstractGlyphFactory.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/DefaultGlyphFactory.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/GlyphFactory.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/IGlyphFactory.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/IRNode.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/RStack.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/Relaxer.README delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/Relaxer.manifest delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/Relaxer.properties delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/UJAXP.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/URelaxer.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XBody.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XContour.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XContourPoint.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XControlPoint.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XGlyphFile.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XHead.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XHeadGlobal.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XHeadLocal.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XHint.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XInclude.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XInvoke.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XInvokeArg.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XInvokePos.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XInvokeVarg.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XModule.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XParamList.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XParamListParam.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XPoint2d.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/XStartGlyphElement.java delete mode 100644 libsrc/ttf/src/org/doubletype/ossa/xml/glyph.rng diff --git a/lib/ttf.jar b/lib/ttf.jar index 4cae30b2976eb1a65937eba572fbd1f56271c3bb..4c9f4963a5da204eef70497fbd77073971489d76 100644 GIT binary patch delta 37834 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�!-vphkuZkwiMS-0hggk`hrPj-B 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 literal 814960 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

n7_PE0 zb~1Cr*gpi8mSXG-(94UIgJioSvMZNP@DLariXZ-v)Kqzy)z+$|AY=5aUWGqSt_ znt23f934%ZZ($`SYtOHM1b`Dt!Ip?I5fcIJDuUS2xzaQ{&E^7Z{u^(OwlIjSDu?^~kkt^9pkRGsGUgHiQ% z{=Ors-pSv0F?lzWhhpkI>R~4DJjyRUOmddU*{3@#cgTMc2tN)6sU&rKn^$)iCO-y>&KEGA} z&6mGp@;_1ad;b0*U;VH8V+_fkc>64G|4g{g@fI;s4|C^+WhvXTY%3>bMXcNyyczx> zCPP-9ZP{>f0&LtwndCExF~gsjwE&PThd}a}6f!9yxME(#`L-lxm0B~9Xaua8d{M@v zoNs5vtl3rtlR11gm&rUP^HFUJAw_>=E#z$_GgsQyqL|!AbcR7eke+q27BfLK)x*|O zCd-&CXM!ozVGC2J!`3P$t8ELjsCS}ia8n(Vhb?F%4_mdig(KW7YfXVHwAR`d^pZ!c z_2})^20p%m$wnqu+SVr9+6=yxF3P8<0YwKpn>uf0KcT3VVK!Hyu9(qn4oJdb~X zw7a>bsi&>It7mun!L~*{@r0z*PyHtf+F)l>eMiIIo?YENO^54S541GlTld+)w&sTR zMm#8XAM9)H?BNqavmniH>FG1U?hf>yOb&G7tSzlY1EpJfMw2>Jjfs$ET}L-fKYNG& zj`?qb_s=aow+{~wLJ`21F3fB3fUlvzM8=}0hu|md&PALb?S%O}06V6ufVcuZR=@g4vN1PjwXJ;Mxmf@0tT1Ro7A1HLe= z{$kTgLI@n{p<`}ZbdsxUG0IGTSK*qJTp7I{e)rBFB?Re0U#Cuzw_BMbK ziW?j|RzHA%FMX$)+%Px53J=?cy?zLy=qF8sBjcxZKkMor*IwKDv3_D26Nuu=hW^ps zi2;TZMW5G@_UTg^p_qj@7hW{nW7goi>1L9&a5dlpzLCf%q|=4oEnrYZLo0Fy9TNzu z=wJe~d#LSRG#Sr~U~-~U*a_Xkk;iqS!{{+y?o+a=eyAL_{26}oY2f`xi@Kb!Va3kP ze&o55T~h2_FEc*&V(*5}?0oMab{o%~2w!Cla9b6IFtgP69~7T8D-H4EW|c|78L z*G8iG26;2jj@*TgO;Z_6G4P%|qVJ&m28zkZ33)JfeE5WC+HXYg;$fPkVD3K%MvQoy zVRL++6KktrLi236UD83-L1AWE#yTriLs5I5~fUoMfpVN>!aJUT z!TsRKW@<8pdzlG~KQl%E;O{|Cg(3#^3soG!lqk7-ba*g;$ZT(9x$b3tvG9)xt#qbr zSegw0@YW%f_0-D^*F6Pegl*D{H-Q6K(YC<&`ydX;o_>~?d-7On2`)M~4EOKkQHZcS zULHgoWBsgg_yh=)&u1Mb!fk}tXnnV%5QSsO;lVo1c-J+0mIJWt@dQRpinM9Dz^lzZfG}ma3umBHAnH2ez>ea~WsVjt`o_Vt>l$&w@^1YcnS*;# ztZl#xLd1>RtJx;{ii7pop%kmlhdb`X=n%q|hnSNwMtpNJm$y=%W${xE(V2sAQTSR@aGM-pv2?rDQ4&+)JjNF^O>(ptT)-$&ogvf~jaI*;Xm@CKgi1>u znE+2^DC6SPAma`vkP()!e6ES>lA$f57o^J0=6oL36Vdtctp;OkH6fwvX-MkO>Tfm| z@esN)Sfcp|@$I#KmFl6ktNUTL2;9*fxI%OQG}X<)IFIJ0$dEVnHn`;}By4(EWc1Kz z=N!1f*ycJAU-*O|B#JE>o;yKv2D#@hXE1RRQ$o&Ig0aw@!QqK9xGW^GeuY`hf&e!) znt3bVYxADRQT1~r#PGni~;!l>t!CJf~wM}CGVU{WwN zTsiJeC=o50k7gd@ajum(&;g;1`^PE~S$iCt5Pz<-n|Bm$DD)S6RMP7z>Xq&w0q9@y zMLR6|qv%nU&7JKv>(;DWSF`T`;W29W*u==l@aTB5uQql-H@x?8C8P*H8pCqqC>~b! za{Y7!R$chx|GRu0ahv5U4#Ozf)=tN&w{|&JgVl)W$?{Fxg1i2&tlbFfEPv}@_x$f1 zrIh7Zdq^A|)HhwDcC5Wtvt#YE_B-;g@?FPjv05Fg4YyXib-+PL3_QD$iYL+%*>!H9E$GXXCg{Or-uTGo( zW+;&8Q3}u#j&;Q9^?FpgcIsGt1fH~x+SW10I&Sqti*u}-Ekv~qxbqvpjy0gVm23~| z!!$1OE}Nzi%B z1!`!WbX1M1&9XftM8=RR>!93Xu;?ARYKWDZlTz0@`?=FMrL;l0IfZ{v{B#~YB>C31 z5Cs29>vl&Ct8Pb)5RBcCJjRKxW4(x^f3ah|#Ja<=UaIyv>K5d(UWQw>Q`I}x%h||x zg8K4L@@>}}%j?oX^8}czF4xsJZR-_|br;~F8W6k7!y3bry%cfy!}7Uf-EFvWz;oy9$W4%pvIo4^ud(e8jW4*(Ar(?Yf$e}S22EJE81}q7~P!Ea#dTNj` z9%Awy>tV-wFO&DFF)%}3J;LPuxV0YTWGXbmZ-``ctPk+R56W*H>qF!lW>X925b5H? zL5v}=fDc=bUBp*`9quEJ^-*vl6PW(93_t$`c|2{ncnfcrvu+ofH*_xU`b%h$oHqP} zv$2Z@FRuz~mw=25YRX`D{&=Lyr)1?tzV;=gM;H>lYj}9zmVSI)0u|1k^!U&Gc|ss3 zR2w>kn&9ezY3~wGZZmHh4g5^_^dcL~Ku3THs|U?FW_vQAczaTT2YouiH!X#1X@rpp zy7KgatN;JE!!W;ptb>L}YInq*TgWiCZI~F<>#HL)mK(>?5R(oRLbj$pEDWqGbe^R9 zSumY~Tn7Qpi$l-S$dq=_y+8|Nxglj>{4-{Y@C}%5 ztZBHz`lBkm6B{+2hB%mE!1!7N>T=o_!J+TEiDn-f?I&Q@*J}P$7gSE&Qst%j+ImDu z>Ezi_z$!y{)f!>0-#w7Hji)d;W4b4Jw~Mm?PJM#W$lb?YW%&X-<+9Nv@LkXw*sTUk zG??j`n+&5`ajFk$k3WcYlxkGCK;MRq5ohKdt82k8=jiO)-gRyEzOBba`nRZ;kxc3D zAfsUN$?I&w8Fo$Zx-j&ang^ff03fF`S+kfI!EqIM(sg`v_=L9MvB#JBEf-Y1U{2M? zuwqW3-)C61Fi?VpgZ41s28u9)9++mF1QsgF15zk8*^VCU?5Xc;Xoi(3oNI@Ch4KRK zA$AMSx*6)h*|lMT|7V~(U=rTnt8-~KfDw0bhxO1M3x$~Wq|_T|EQUCqes>g#nQL?i z_&DkzSwu^AJ1k0`6&vC2{RZ*9VYaRU88{X^p2NZ*EKw{yXFLT^@1CGNR#(S2=Vdvw zA(N|Z)u&pNxF)}@VU}S=LAHZS3e22bmj?HxVT9~ilkFIcKyw9E4K&$IE^Z)#&{*&} zW$)DfL=jtzhD*;G2q6=?0lGD4H^XcyiyDxYjd+3Hux-Gv-#sqE5WOH^bwhtM=SOrQ z%uobJM_@dWc^IV$rx2vtQk%}8SmCXvm%D=IagLB-9#VaPXQT-Klsuvsa`qf_kw(Z8 zyi6UBmvO`#RkF;J@MuFy9mkM%@El>KOjb17fm;1X`}Klx47aeqv;pWqa+J1l zN=Nu;`#sv|;b#4;$#(_3xED8x%5`K}1Ye;KW37HA9FjgJkHbI8xXYfw{S$%vCvkr^ zaF0Ma*qN5f&-dp8_k90U;QkZ1zYw_pB<>ktoI$=m9eDm3++$LppMNg!{PXaB!8`%a zV>AWf*P;bL|1uyo?-@{50b5xeb2`S`;H!5UzRYij>)kux z#rJj$uy^ZHO|YodZmIO>`;(4MUWkn;&*EqT3q+VJ&!Ma5=;kXF>p3a5<#`)+>e+DK zff>)Bsknihel`!gEyHc(|U^G6LXlA=DtEKZno%FVH-{LKpdu0HX19MA33I?z+HxSr`D#4FE?!-}<0m z&bCxJrV)OPa(;tyehVk#|Av$C?=gD+5GZeMpgeRdcsnXJ(=YJ2Tj0E~0w-lVw#n^C zm1wr3{Rt&LixU5g5}%V93NsfB=ea5;Q0lypQent;tN9a9io9uOSgCr9U)54ox^q(M z8A9WN?CM6`yoOffuBgUnZp4N;`a19C2EJOvIN5>#9ESEA!LI~^#>N1NVpx=_d|>DR zyFyut&WDrk5tnEt0>{siEikQbRpoLOSdusVwqiGVIo^>a?R4uf7hlarM`u~3szS{{ zulY6JFF+*Y7>Aph%YeK&wwi}aTVemXtrj3ao?7VDSaE2x#@Bf@RxPDFb%j9TJuOx2 zNL6QK?^Dvu*xLKBImfF$qB@((@>A4)|D!Uit<;*7*7MSKM%wYX6vQ|{L05>zzXHTS zEK&Wt6+7m4BUpzaP8)sD)m#u~9*8p^;ocYEc!)((uCU8dEdi01A}G@`S*x(iQB`5{ z-AY7-UIjv}2BB)DL9IpT%sSbl*5Fk8b(&}lN4^nT?G4fPfY{}LNb+6hk}rlh$%_FU zdakr-LK^bT5*r7{l-g=3s8+rUB+K1rt7S7lH>?04J5`2jL2HiD5|3{D#fZ2%)hRV! zP*9+q@j2P_Ck{hd@fgJY7!v#6qT~&Qfy4z|>ubt$%dlBpkI>&YNF&Z=Xv3KehgCvuP)Bs7I0Sf{no-_xrPgb1 z!K)4Em=?A%>_+GO3cB4Y45};9Nh7)&f*(UFZpPQ-7Kp5*wxYdE?Y($SlruQ!>=vpi z_;pWhAdz*P8kGcrkD~pL1zOE*|1`+ke8^{@T60WY4TytZl-cN}LkKlG+bJ#4*tlZ*WphOv=gga*79<@$Q`5o+72*DX4Bn``?0t z9)@JK8io#VE72=yfcs88Rkm`0ExA9_dyE_8q&hndWmbwa!<@d$%K$%Km zxz6qVX}Uxit8At%hCjRQPl_>)yq`j$PTk0A0?iZVPZ zUpOf*P7&1%s=LuQUy1g94aoA^KuMm&1vJ%!lU+|>QK0JK0hC|bwz}q=yv#lI zBQ-qU2SgtM$sX14DmA%1_K2@t1oO2@^Hs@7BUP*4P_IR)EN$7s^YZex8dvQr1OK>l zQeNSX3HSD{REueSNqrc7;xV9sT~(Oo&c;lx0+DH!swV>|E%Rx%%ta|zDpebfxG^&* z?9+G_A%oR{q5y^#7inF3?87gILJ^w~Z0~MHAbVx1dzuk|=)*X7qfmW97j2r$WAXS_ zT?OkyaIh)W35IC8OVXu5$$5EIYc-(18YD*<0g{^@`YGs8Pou7%Mlb!WF38LmgQEDL z=8zGfat+QO;EplslxP4He;9mss`N(>)trZwdrgYOrpUiSmwX0w`x098%YnL0E%Mi( zkt_YL1z$JiAaa>*-nEJ<8OK63r=Mj|G+xW!NqHR(HkldJx)iE@08?g|)SzuG@D)(Q z`M!#o&flWR|4s_j*P#=A1B3P37$)DuM(1zg{HX8vWLXG|J%w|v-wD>L>mh6~U&8je zXCZQo#-w8&71*k$1IiNSHtHsyr}GdE>KvTpdMpI9lGnRZvpij2L=cR7KAxhXo=B+g zgN8o<4Sxi6{$C*UehjYtQ;nw?g;g$gq#)QzbWxxuDwTjRG{g)J>$1#Y{ciz)sbLK# z0r%rnoH9-Jdo#cP_rUj27a;}5>!TrsmuG(b>%hmU!r{!|ew@bI%SoRgYyTaF@&9ND zX50i>yB;@akmEjcdoLP<9Aj5E6y6VUXfG)V9vo`} z8VU9kjORPkRi%{ZHl(_8jON8gqMM~_=EO8}DMBp?Fr}9}fmtW$o7cKFD%o5k2 z#I-1K14_K&@=F}WQ9-(|Vh*1R`-4cY;nqejOv+pK8D{;~&ABU9z3m;6yK3)>*|~3h zm*maP-OE=iRzdB58?Q{p)8^;FV=M6d?YxDlr~7J1Os?iJ=OX=<5(W(CCu- zWFTu3>arPi*@n7omkR4DY_i-bi>wA&X*EifwHMJanx)a&C;RZ*YVF6~%yzlXYLy$T zHaTJ)(Dmok;RZc>9)|!#g?tInt5!l!hUbiQs@rgtBNf;edIDFudg@RFGKA8#_XOyqyxS#|U;k+dmO+j6uwd`>si7_3Rwt;@1!^1uH4bCL zcsD3ZXK7M)=}AI9g{s)zfXZ(0SfH(DX`b4z$TXhi*Qy| zCIu=%ftD#0xLv)-<>@Ad(Nz1nH5llCp8Xuz)QiL6PRTt!uZmdlPJ$2WZV!IB6J{~v;muNQ61(v+5+u*A*5x=)>S!aCQ5^7MJ| zIF<0DC}lB9dkolr1lNzSSo~|j9{EaO)1iK*elGbL@edwo%Pm67@NX$HhqUcg&=bNfVRZO!hF@%cL2z5l)P-P6(3gpYDMxDP$Dr=uR8w~>bKdOXXmzxE)VWpcWBm)F_c z0_PbllJBZ-*uSTP`_Yl7p`*RC6Tb)Ao7=jOtL{-ZCX1OY zVX~CTGA7HJtYET|$zdj|n7|z7V37(*6_aWvHB4%m)G=AZWG!Yo;hvW%bUmL??T%zz zut3d~&CSj9m&iS|x48@CjkPrI+1u5_<^{fU(Pa@&UGiBKT;;Pi`WF?_zo?V`MYZ%V zYNmftIsJ?J>0eY)|Du-q7ZugNsHXl!CG{`rsee&b{fpY_UsPECqR#pk)z-hLIexje ziFQD`0e7kSkbjyGdAT-ofQB1!ZCFvRj@Hi5;+wsXakMQ4H~#%67t7-(aSk0~7-GpB zc229iM1B^(HD0P8*M%O-^cWQafw_gk$37R1$>edKUyMR)%T78@YNDI9Y3m{=oS4E`C*CtphSMG9~GUE z;wL12MoONLQUtz#LS~$inNLXB8OeV_%Fl@Ngv^3L@(G!((~2_^c|zt;b2RY>%~~rX zG}fXA)S+*!K{WQYSUF#ZHP!WUD`@-*aML$|kdJ_X=dl>{v}}c+#WtARwqvby2i7L9 z!kXbuIC$4%OAHOGTL9mZt?B&q&ey%6X9di0{9A<#S@|h_e((pM`r2M@XZgx=pLiPi z*E13rBKtBFFk*eomH9dfXH+Wry9nn!+B^hv>0gFxEDLpE)dMVrA9?5t3qzQ>js69N z8l0Jdj?1HPfSoPN$Y@rO$IL?PAMzC(X_!}gjGL9nV5;e?q<1bI1-Zc{FJ%(}{JH5? zG`){q#%>CfgRPDIqu81~Jc=zI#%Vj?GdN`v48FL`fPa|Tp=abtqc})ApnB!Ho5{E%# zqtJW|p4sTHTr6Z6#-K3|E7ft_0U{O(VXK83i&orb(>H|P;0kA z$=Z&dbQL@ycH-!gdYn1XsPXPF82Na2;0uOL1(slqb2W4A05hBm_po`r1&a$+GiGOX7t)VY7{)FG0U1|68g9-$gXDn~5h3PD*_7FP$^y z{aa$`5A#I$mu+5`>Z}DVMjL&#)=bb$7o z1@bcJ=|2KAHodh%RKwSFO#;P#PJPh7=w0~m9f?2|_?kttbh zD*X!z z;@F$it#eiiIkmI&MBex>?gdM&0Tye(UYo(H_kn5e$F(O`wt?C5Bm?JJaNhz@2tyjQtSqNic3{RmM2hTdA1;NO!HeHC(RcR++A!N6)#wr1EZB6#M^5icn^W*hw-*MfZE0YYNe9*XJPPVjHz&TSi3JcbT6(JH)dBFim=d7o_?YJyn2)#W4gpH6o_j4$OQ(P}E#}!Q zQmupF)^6+Yc!F}M5zu@$cCb?ed#8= z;ol;>4O7folTg9Nhcm<@P6(but7ZkQniX2i#X!CWuw?{amA#0y9D`P{k2m|7v@mI9 z!b5i$VEq6;fHkv1I$~frUA&?x)0RVw#C|x2fz-|9T3fEO5y=#BA`nh65T!pfx*_5O zQfhkPS*+`JX=yq<+K(NE2_4?jsOt!Wh>DG#>Vl4mCkP4Q&sDsE9^B)1-LA`*nmPT$ z0G;hL9M^0)KU5!f$qqSQh*(*{T4T(eMPA(n7=E5Yk}RDFj*^9Zj6V_I>{V z8UV<-y??~dr}skPLEW|eBN_S91+gaj4Yn*W8jLwgZHc#9$BB;uOOCVHbT#uh~=2q2Ag* zfOxEWYKkH6P5d*uF>#_E8mPb=ug6cV0osnTUE6rr>u_a3G#C>$I-tHs`{I{oE1s^P zPxw*g;DDH%$YF{>?y0a=S3eCc;DSWp+mefb<9Xfi#xVCZp& zNg-F+5vLp{^3ahieimNd=cV+l%;2K?B1}K)!EST(glPwiNdn0dfo#c#kSK<^cNWaO zi!jZrg~qS}+QDW_^Y~3YrZWwg>g`2(08_m~aL!tRuNk+z0UFFoNKIPR4?}ixdlj#$ zQG4nUhq<5uD&S-`z^y~+i%<$BcLb%=GG;xGSGoEe2cA!ZgB@U@fXBaVqI5Lpqb@_v zM^FYehNTMrKQrN9TSldzSn{GEXug;#aQm7Rx<~*_v)*Ce^3LSwONJ( z@aAAU(0oi>7obLqA$3?E`u?!>c%~|k(}?JrQ9t8>MJ9y$V&J|V(24sD;yzz2jXMrd z1v1PJx|YEb9sIqX0A5ptxd9<2}F6WE6TAx83PGh zFj?Sl8;ul@;&C}(V_QN-Oy^6Bu!lgwW|uSuV=yf8-o)7PalL~c+IVOGv7rP)He#?} z9S|sf9uph2E+`p7#i=Q&PTSGVUSu6^%tpjyV-;`zOF^eR(y+OII3yzPrS6cKRvNQ&T%XLV<7b3^&AuLQI>^ zW6{`;VrV4&|0yJ7mTl*k9Q!*jIRq^dwVfB*%S`k+XgJx{nM)1T-7u5xG7gMoVAB^J z++0;&?kN>o2>GMH0sn$c7uGbcFfZr)y^H6fLyCn4wVFzIDBWD4?$$>VI)cMjFELz; z1Cg=brb<&uCCSm90Me9=<;YC}Wo#K$qh->YCYnRc1ip?0e&U5Kz}EMSXa(j&efU=n zx^YJA8}DtPGrEtUKcqTn1D6{yDZ(~-6NO<}=qSke01aC(lswTqG&Y_XqW+Ptnfe9g zK=sKuT+w|u6|G=k4Aqr6p!;_q;6l z3=V9sI?vO_i*QNLdAo}0%prFtIZHG4jRvg3HKGBU0dpU8trlHsrPhyX-BJbmma$(f zh5?_~!WfCLs) zX0Hve#h2Hi?_Cc_H|nB|>o#^=>Ncd(W~x71SD)L)BItn|(egR4NNn<37~4w$)f{i^ zI+(E-qovX9jk|p;*^;i4Rsa32-(ScP;UAT{u#t%4Kd8Te*Cz)uR5Glz=E)+i5iDl1 zgc{aTEaKz*9!L#ZBrZw5VEKT03z%OhD+uy;t&aq>gp0=m$*Orwr&@$Bx&|phv4~^I z+zQeU0!~#EgF_97fd+O7?FHsn#zN^BKH)xN@Ds%9o=DasLpg22QyC~GjR_p!fH;>l z-=c(G4HY#;tZ$s4madujEH)PgB1#XVG^N=RN`hFsGP;2NSXe4|Fy5nj=B~omOoQJ- zgp$pAUKCoXt*bwRP+f@QlIkMhj=AU+>}(N&$5n)7;Wrmo1?b1z^NV=^a&Vj$>**rG zX;_>y<`|wt{{zG3*5IRB09XsYv`)|W%;=<7LJ4vK0CHmAF8(wA2?SoP?}0?FF)$LI z84Fiv7-q&|xiIL{K+gt#xxxK159^2#z01u)$y}HtvYUa;)&PV&AA<3OAcVt!K!y+{ z1l8v5gdz;XYp%lEdSKI_;g|s*^=lK=qKJbz3dUZ6Qn@da^Kfn*;XK^nnGpgcRl&Uh z^q{0@BEet=fRpj=7M-z3cW0=9xI;HiZ`b4BIr4sIYeJzx{yZnLcbt#52#YpArqohqe)0b z{<9(=FX)0%^5e!PvQ*T3=DE4uE(3;t!RKRDJA%C(HnjLKsvB?^OV|5yVobV% zRJgfOdhEcW#&wSL@o`d)a`~c%KI(u}%j7tdenFO-1%b}DTn1_xEolpMwJU-O)5t*L zXx$OUk*w3vBvVx3DCKDh?ifWMNWayms%obi6BJLs)iLpKu8EoadRp0Zh3Ewi&y_>F zlU(kQ!8naTi9M_tqI=Vg)^R_-& zjC!AK;Afu4hWGFaK7^n(k%HYbl2%@7Uy@3&ahf%#Uek3=;K)a_hMqM;kK|O5t2qaB z4!kyNHJGmEthUZ#KfV5z3Zv1$-vFU>A5@NeplrMm&^>h|4mF1}VnA@sCdN0yKyP)S zm#oJ8*E%n`fV>)In;xqa-+Vjfn$W8B& zW&e-8HvzD#s?z=UuDW$k)vZ&NN>WLxGS5R*0+~oig@lYiLJ}YeLqJW6R3(HYRiRRW zFwY>91BehNBZ4TR(xM@XV$`QTyW3W~TW$3@wcYLPQ@ibM2ju;}z0W!K+?!iNAkh8( z?;ogh&#;HJ_g;Hi>sxE{TUWcKqU}9q_^8Tvn<1m>2E50~T}YvR2nsIe9i-eX$h{c@ zAZ;ADF#P> zuF>UMU9Jnv^)k!2K@T@pad(sMZr0_N90IP}bh%xRZ`R!%O6X2K-X#;cyQ}C8oCti6 zc`HY>8cyrGx0<@SPodrs7|sU1$GlSy4+Q4H9Bq9dFb}b&?qlgNVCUv&+C6LAHn*YI z(x~VxRqAIj>;9daukzm9Any1^e$P3c@e}b+TtDS(vO4hP@yvqEJKOD-5qZh6Kjz0<7p=UyTQ5F)7pizcgbLO>@e&9-V}myb?G5r(R|@_< z2(vz&YuPQMz65~h?AU0~+&0`8$8T$sLUeYyja6m*!kTj<$#!8`O3qlT@8|}6 zU3Sa8=lf-@&hSpWl7n;ETb9h!8$X}|!1uO}T5NBN=H`s5fmlbU=shL-L`NL`*_}Y> zzYah8tBx=9AFJHQjZ~F2Z6#^Tx0>_%T==-Q9XI$}_b!auHm%Xf2UH{YMZ2pWEzRA& zR=}j5#?eS0onPYz(OAOzPQ1zRlFuM=M;+|;)F8Sn{1#KmAmUDwDil#B%F}`AE)l_5 zN6;fmCno9XVDB^Bt#;#+fvp)EBUi-Msr7Iif{q-oqh9G6w+JkKd>6GbamRD98mH+N zq49%TTE-7R8Ky}$*_Oc@$uZS}5@)y%s?yw<)aG*9UDlez2Q?)To3(}1CN z%wJ-M0~6=1p0BvXp~(g+2e%81=PU+l775X$oVJT_uiSQzgE)8X^5b-%>Br&Fb8W3% zJ2za?+9o|iWm{M46|zj{R$bHwme!RDUZxXWm?)a3ruu1q#F>`wy!n@D+ot4gev{Ml zrp_x-cJJxzVE&bkWLR>hj{183hyynP7YpZ(buTOR?@0b6XCEZiW`QadSQ)F~LE`e{ zc^c0!eDd7PGrXTX&maz+#Kjd{T4~52S-)^Tzk>-&58|q2@gq)jYs@;Q>#f73ctuly zeN$6i?Z-e@*Wq=%QX4VB=c_R1{#MZ4VpKATKN_OMk z;AuE(_5rNq>$na?zcGj%U_HBoA<#6Goy9PE_XyO8u`TI3l!@LWAjWhNr5|UtFLCvx zA(aPAtX+?h08mj(#VVows>`rsPyWf8ICHigvlgSWgIP{D&uGoRT&i3qAKHz z5q!#j8CB2{Rmi}kLIU=Gs+mJ(kguW4knEP^QMW^)Akpi5<9XHiY|1i+4aHn)PBv=N z_Zqf+s=Fl#l}nPkTawh>lBDjIBz3nWsk zWvaMhAhFFxkVdX?Z4fnX+o(qniZlsNP|xM~3%oNx1}-!!}L z8NQ_gX4+ibeCKhl0-+`YJ>V7TK&$9Ls~MHfqy%eV>$M=W*QFSuEvbRFqz2lO8fe3Y z#CN8)gdy4zhGKf@v%l~)%$}8v=g6|*3;-d_Do5~EeADn5(|EwlNFI-v#+Ita zs*mFp5RuXl_1;Ftp~h@uFa!r5BmP1I`QIG%n)qcyDrUD-iLWc)Em$IKPS zj9(~b9MZ*Xl8JCR&Nq)LO1>kV$5bZ=%md73#8q49K&^C?iy17o(K#+*5ZD1qN}9hZ7hs;}8J0vZmW+%|2UY_S@l{(x8#}7Dm2NEFa!T`c^KxTLyi#7JQI zqo0X>>&ClDGCh@F$3T5OtA!gN>P94px4KG@o4OIKD^v*@%ukMs$*&5h>GNb)kTQ3t z!j-!zno&ji?H$yuWta`dQ;DxVKFWtf^o38X>l5ojYn zUDT!`SJ28VbBK&pNr}k#;w{X%bmToShbKLqa|Dm?E9b6Plk?tJlXLeg&Y9NO=W6D1 zC(@N_cMKh1e6bN;+2Xb9X2Z<-n@)t1B8ccHYJs`<`>*ww(}TL`C=#_LldfkE80kg=vGzd02r zv~lWpPkB(Wg@5RTR7U@kA*vlZDGI(}Z z=brYi?knSy29NP%)B?t>Npcj2^dQTL!@NqIO!xbiO}~oT*Wc8hDxd@5b{qJZ9lH>> z7gfWN925Jtz-$-V?~SlAhE~un#mP+bQX`}8Ijdz=S0`ry}dw&#CH=4KQkVsq-n77k0cW%BEDAOgaT~47? z(y*ma!z2Of-ks6GiAZx|fvb~0uj%aA&X{&=`knq7npC(W5-sO0`Y|*u@h(8iMpWc+ zejsH#_jKc02L+8(X3nm1ZR;LnSi*1Bx`dZqxpIH2T#z_lI&Q#9=MYJ=(#4G9C6ytx z&A1eC-ksxVoL|`5oqzx_Qe)W|$6ZbByYmhc2ydih%Vz{rp+RI`p`|XEIeX^G8#|L6 z2TxsHg0S*V8D&IYT#x2wr%75Uc_~tLcQPW8{T~fr`z5IEu2l8rWEJ_|#P;vGo69o|iU4j=W^4;aI&REk}jP>pd zoc0t>ruug5rRFy5+q0*$3zbcb!7J7?dS{svOR74eI*htHnHCI8g9|@LK+t!Z2f%>l zdE?xUy)g-#z1qb&v7H@B`TWJY>E9L|~qj82zcxyiYRp)pDCsv#hmk?CMn;#)|(= z(3htj8j2~sRKkVz!5qG7!&x(C&zwDb#%k;$?+ZCi^BEc_1RU_8P)BNpKo33=;??$} zA?Mj03c(Z{M)@6rLij{rUI;nV?qP5nu9(HlP>L5r&dp>&^P>55iFu&lm0u$PLM@rL z8|b{p7G;}f)VR)ziOF-OKg+d*p<|zRO4(f)1IR@h3UEfCtU8{A*n;mY*N;0h7mXm} zu-HK+0I7i_TJ^1(MrSNx+QpL5n|AfER{Ve9^yy8*D!TiG~^$ZWq>iB zhI-Mpyr)2wdph^-@RMPEA@%VDk!^EhwL9}Z=|cH_5<9I^_R1}xFW;&1ui<#O6Rthl zp+Uj;UDCC}g{TOIvQ|N=fwp5_%Q3ja^vWkW9v z+(f(&R6NTit4r{#6A+X;Mb3CKFlGtswx!5Idl9(-;#JrN5tw;G6v|^l6Mj6aZbjcCA%&;GW9ZH& zoeN0eqNMP|jq+12NLO-vW^N)`WpEc6h^P}>1_x0%sgy2{y1K)rT6wG)BwXBKGvFhf zMgtOVAVp_Vaag}F%HDfx+D!Ia_|k?vs2!=mHn#pdlA?2529>ki6-Ztgq!ANQIDxNO zi-kUfF<(Z6eKsO&NdaL^jwlT5bSC296kUS`%h0YzQe`_Alj;TQyCJm$QoCTVZphsS zG;Tkku7nA%f~;#D*<&f*Fc|YRT2lu+<_oYSRe+(Uyyj2HMa>y66AFF7DqU8g~uH=%#?nD}Azo9~@hHA836&Zy%=qKW)W^gm17&k&H1lg^(3$4oxI zF+;#9ExE?rAv5(cGf3^+nB&tl$4v6L;l4Gy7QTjs%46&#JcGT7iZJFjM3A>rb$7BG zy$gNjJ@nSMA_;mM;qFBnaUY_|cOoW#5a{&*1ey;ai+mVi)1z#C9s{HJZbYV!vrBmo zZ=d4Lljb0+l_wFjN?0bv)-B|-2Hi%EFSu_YO&P;HMRlLWZ!M{wjQ~_0$==~qL^}H7 zElyjLfsR|ya-2oHCK~X3?(ic|C``afS-dvZWGi2W&9a#w_P|7!Gx%a$ZI=b+jakBh z6ZehgY^;cc!$ulwx>SZ<*5_4*ALI#B@F=XzK-E<%5L?cW^x0z{{eYw+qz<_v`VD*q zlHRQ@xi%NFy$}a^|MEBdH?(gTSgmjuYuRT0 zK?1rzYJd8tz`PWgKg%@pWnKb5;M`x{|FP1R@oUTVGNVfcHk>w#F_#T=snlatU~_t? z)+Nkw(rJzEY87*U0@UTG5T|;0S0Yuv25aNzQ&DoKp z%7s)X+R@ole?Woxr|)9|JGRn}%b8|7K6~m<{DBI~nVqGF+0}NAt{2GA zHLKRGgj=*h1;8e|dv6e0t~`NAEI)Vsc`NlmGga^0+}(-Aj1VH@jQAy3g(eDyf}eZ#=b9usZxuxxg%NfPMl5 z?C$E^<=)IX>dkBxK{E4gi;~BZS7Juqc6Ua+$+mJ)X&GzG$#Jgns>6AMaIU|E>4J=7 z6E;-l$&sZ?m27BTsd}<6K8g-j@3FOQ+LcS1r0gEmCuN&@QOO$JzkAn-7ZlZIF5M7A z3y*%F(jrmCQokuEtc21wMKR&&p};w7DHMM&8U*Glh5;%g<$-3$t7(;EB&e#pGpY>7 z4Q|O(HM#Ez9N3IX63Q>q~i2lZ#q5RsukwYdlx8~Qk5)v;-PXy z=RPN!EHWQlkirRXZ|~fFq6?2@?TQuAeotVy^p}Y~C78Qnk00fS`H~k0Bt%&o=6hvr znDfau!P*`1zX@__RxX@$-xnSR!1}!IO{Oi`Hv#4hkSY}vkL2k zaZIO?ePUhfo;_Wi`*Dlg-R^oXoqg&>E2dp^(F(X^tCmX|gJKq2-U)Ub{wdSvvOVxu z*`7JNwCZv(yV^ZlDFjzOapfD=xw^Kx_pR=IEAR6nfx?xaGGYcNx4JXIk!v zs*)jwtD(TWsJe+|+=a=!0!C|K`rWf@M|Uw7Qr_}CGadP}9Qm_dky)FR?OCR8OSul* zwxerrcX|Ls39uJ|K}TER%PJS}jMiP-D4q}CA1ZezjCJ#CG!*r3x^R_CGvxN{Y2WR= zWgtiNyp|Wgv%=7KSP9`9f@v+3N_%~aXWW%%5Qub3%bk-@arSV58>?YjH%yb$9`#l- z-5ap~u+ypa1RtO8m92eLo=?B`q1K1#xxZ#wH>EDN;)wAYR&4BWR)mcU#W@E z&%H*qU$XqkC{(~g#}Kq9Zu|QG{iP_;eoPW+_Z|b&Q(fe#z)Qai88kF+waY`i+_15q z*6$ILePeH7(|MDDd0S{tvmCoIvA0O^PJxMKs}?(8Kj4l*6vj z?zSC)?F`Ki%#T9W3YP`8E3|uUcWC!F=O)_4nOAZ;O1RUk9ZD_U%^gKRa=iic@cemhW zMIj=^r`y^3Lu9-H)hm^TBx_=~T#J$ui|@irs7Ifbb>yXj#LUY~-BfziO3D!jb!Jm} zFBfbM^njO(?9>a{f-#C0C(hhIfRYziTtBPLrFcmz7?C`=q(~(IDy%E|Ksn@NqA2XN z9u{Xumknr5sSbElKn8}s(oBg7i%EjYTT0hQB3R7n`gEW`XZ2IKH-dZyX z#p-ZuDY9MONlF=d7XDviPi{QXHLCfMJk#$Lbgn{Nn%+haR~`)Zd(6})qU3y~2hOM5 zS?o4TgQ61mEM^?qjtdZg=TH)DLM3I!~4ke7aunhr{ipdH!T&MfL*a^Mq>q@Q}A|jeq+VDTQYbq z`HnjcJLBwePH-B=Q&8$GLbJIT71^oSJ}g6hy&RSH3Utvc%~EukD|lXwlCld*l9W9|nHGOnku%+Enfy4w=Ex zZ$183Te7lUJ7k77>qLQJ`qJJ=Jmr?Q^4R7b$b@NBO#+-%8TBf)-*bpfc|w zZken5k*4C$^1yg^fIr8VOcN+N>VN9*&1BrN5SnFVRP{57p%m{xW!cz-=gnGO2I|tF z%kZZ1kKu_JZ=AJF(|JVqKk^|{M~#nq2;af__!s_NPVWwwWlb60>D2+5-< z{B#}Fem!SA+(6ae3`5_7w)i$0=XNUm4l4O>V&B7;w^E_^x~i5!p915*=nj5$cP|wz zz3m+|$Bw89hsmoA=N$Q}qxOuc8JQU-EC#DRUwi0t<(vP}7s~=%Z%DL$ve@W}FVBsI^>%KX1ls$Z3AIiBqd4JWF^#-gq0; z$Kb?+SXaFp&V3xy=_eg+-Z|^^h_*_;`7tCvUg*sMsL^;)DGmH&#*1i(@NSSEi)vcE zP9?2>!A#u5m@sL|R<4t$ZN+1es3~(j)GOtmPBn8qu9FV(U8jP-+h}yx-Q(QJ(>Gwr zDE&p0N3~GZ)Ld_-9yU$IiGCp{P96)Qr0%3b1qPZaGU))5^t*lP z&aDeFBAGXn_3Pen2=~NI4Vi{)K`}g#=Oc9a=cu%grW$%?lJm?cXYv6#u?6A>fmL{# zy9{vz(A)wYIfK&#PgmJ{plT4K?R8Br)>S@kIE%Y^)1c`f6+Z3iw0u@mW)@^HFHyr4 zvzoGcTI-&ISxuFC!lyOg>aw$%>H!g+eN<%kwjWvxxlul|H7<|gi+f*KWGGHF4hLrUT@cd3*zp0{efP2pBck=oTn=(FB z7=_~3g{q4}@vBf3J`@-zmlnS+6jt6mXB+udsH_i#F}w@KuM4HhP$*Tx`VHbMKb>66 zNG9J~0Y{P#1RpyF$mJYvx(=x8?=& zb-w}JP9xC^xMBX$tZ zS!kD&;z8(IV`l^8JqQn-XQ$!=O!%8tI|@EL2sd43Yg{MNX!w%rL{(7ruW;x=mK_h6 z9|Qe82=6@$m4~>ifxg3(@E~LNSIGS^cLSjHy`X{*Le&q!1bu?Lfo=c*m^Kh%*y3~D z1IbsAlvYY#ibkfjw^&Y(Q>$uNVz#DT{armR%N^~&yR5(CUBI1Y_4S)7{T=V>^m({@ zS*P#Z)~`Qo=C9+vwk1gIY_x*FjxJO+3i>K+}~oh^GowZ zTjttN%d-xau3D5;s5+9t{!4I;7POUw*U(x#Uy+lNG?;Ez*wAs*H|*U@>zO-^)m|3@(ftV=Gi>in>`o{A&3d_`F%LRu2RDYv5s> z9vb*#vRKfPX_}5D>4KJuCd`g?lWkH*)m;#se^@)6H^K9!rKM7D8Us4L8kG1gm@Ze2 zV5R|#R^@)H8*}Qz3(s$i5Rb{MiA8P=MHp@?%~aq_Gi|k50HZFq1I)R$4wo*2%pN-! zi`^mS20P4E=~cccNk!fqRb&losn5Atb2!)k;bzULtm;1RDsm?4zAtcB0cvwKopJ|N zvfL~&|C2j`%ub+b?w~O)0ZaIo+{p%bu=y(*CdXg3`D=I8?5CO0f5Qo3^z8s4@)eI* z$q(E1E>e^$@jIKE8LUrX2!$-IbCaL?vPn>z+|5?^O|+Pv?V*;{{~G|K5e1&mnG>B%{_0HGZ<$Y85mdGQVACy zY|P|`Fn8#d9bp1HlA~TmgXtP;PO#%liyd#4+KCt*Ofu{2R0fl292?hcw%h6EDmw#4 z8*6U2Gn2Mx0bBVM^HpkWDfRg^2Dco0jKKVz`FmRGJaCy;GuUNe=?N?Zzs{G5tf|!@ zG|}FfwBw!T8?=Sy_&d!vxznMVH#6X9XlrC3y@Gccc7!_^GWXMt>Ilsy^D@a{^`&@SGJm z&bnIu1By7yF_UMk^OUjUDUGNDJ$I>BH~3qP)5HC3Rzrgy6jrr_;yba~BwZ$Z&Z}u| zWUlp$cVlWNwvK*f?5Sp$U1Fx&rDnce26S(wxxk)g+U@B~RAU>bY^fHge*DA4NRy9K^A@(_|TQqh~=a(<(e;dM4ez zAUnhHsm%Ui+U*M}8?v;;uXgMEEE+Z(c-3v$Hdjbie%y`i#m zLD-OM2#L*t?b(L#iYU>YQIM?-IiKs!t#L90-`=^PmT0vRK|B4YtqbZJD;jDWSahu? zF$&`sO3T~=<_%_ueG~A|&G;DI!jh#GyQ;0`blb+Fg_9@kCA9hubEUo1T!TR2UfW^b zXFJWO>}BQ)wksKF3a8JwdwnVDUi$h^v|+g_()_b)*C8x#)a5wNgoV?;xMlTR_EtaU zu96XHr}+tYIe6y+Ci5-u$@>^#v=FalD)tNUI@hjsru@%lNnpNRUS9o@Ik8-w7*zpR zRy%NtKPLczgp&)cYnnm7-0-~F*ffKFsv9?a_&Ra!c82vR7u#{XikrGD&_#)&u1I>Gs{u7nvN&UXp?QwN^e_)=@!4n_QYs>&Y zm|b!XdGJrC0X(6%AJQE-Y-^saG=Gs}C-IyfKB{ORt73ETe2(3~$MxF9qf=fsC8K(!*ct@?~BAM%lbCyTs8X zs_-SK_g_)Ouj=k=y8Nx8{+;grJ}_U;F@8h)0`m>seY2WD|697S82FA}|1Z7%ZjSZI z_jGZgzOQ#b2+R-l<{$O&BL)3lVE!pE{~VZqaoBC4y&O`p2X~l-0B~>#J2yM6Ex~tk zLh`oOeY?8P-m$+uIpVpTg4MC?_f9coS$Jwsn7uyK4^h)2?>{zRH7KS%ec=le;B@Ju zoQl~G8e+_1KVZBmm6HSgtpG;_k}*NudL?FbOarIFmFfV}W~|?!Q+J&z#Urz}qM9As zS8%ZOJ34k?!tB}x#7ZH`nkK~1TZ;Esc~`~BNF95z#cQ|bD17D8ZQDQ)aq@4+UXJbC z-GBHq6uWcBP|rR(CrOgLfji4IQm#_7+M z?YrfaS^kOp;Lj+W`iS?!KfIV6uMt}jbCH9IQJ4hbORX>KceNMQWIAm;8^oEzWuj!O|sw$h!VxLdl=u4HM%^2%e0+)Ih7ci=ocu}HyDbg6#Y z14+Gxb?4zG5P@jXh{%i_1*&y+U(^fywlfx5DYkl%+>Yl;eY+XO<1jk0}WzAbxbL zD<%%U?6qBsaY58ejhig)LV<_!!$iR(JOIc{kZ6>f4`b_L?X1hM`4{SE% zb7g3&EN2K_XRZ&W!whY;C1%h1d<{vVt+BNsV!B_42$UiC-)$Ymv;#wPw;iOTd7$H7 zyiM4_gkzC=AKHF5&lTbBY`q;4%DNEl3T*??Y@;21EWkQD!j25>C_6f|W9-<_jweM7E#!h@9tKt&*$SBZ8Kpu+>fdT?fu!mY)QKCo%Ts?s}B?`I*wY?T-1qaJ|IJ-(lKzY4Os7 zukQ^j*Q{K=aV5**jGTHGhVx4#t;r^oA};2@l`&FK_@Sj>qAr)OxbZ#ASUx~xrdhJk z`4ByfV@bxz(oB{~`BSO;oGkN8wQ9dNiWZOkBek&d^~M}EAfdRjdDX_&io7!kA7M_f!bT=4&TUV71$$M^jHlG`v)RC zjwY{}{sUucqh(fNaW}n(t{e9|w@omNI;gY}Ma>z!S%n0m483h5 zim?2%zI(^v{`*=)jaA@r&LYOy2<&MF{xfE83^i#URE|><&=3`?xnvhqykLS&(;6z! zYgMk*IoVay>P_|5)knQ<031-gwTJNAj}Gs22W2>oFks>8xXwp*domK*MQ9QhL$-YE zE7q1=@B3sk(-`N(&xDh zz1s-+rZ|rfN=QB`s8?FXAD^7lp=vrq`KXjOk@bbN#YHY956sC$DM>))eOQ!f-5900 ziZn%BEe%umMQ9v^c0D6mZn>*QPvI8YvlYe3))a-cQMy}QSTwO5c!OfvlR7s_R_=D{ z)cS+uQp2~5NAGM)B^8s%FlDw!DSRFRBwcNZm}u>ECFR*@ut!Zwe=lG4pe6%!A5OxH zyY?!Fmi$q4_`Iswd+oW@wO$<-3qwHTjX@eel~$h3{mCqL)z*^dPNkaEu4?s`r0QB6 z22?8e*{=P|NMn-W#7L-YApKo%O@`_LJ!Z=OY#IXRHqwrvFr8%NE9K1uktT5hZnTF0 zP^3V^Pz>_~dSPf?-Qwn^>EIt5@ez}60Pk)`TGDG^mut!Q26DWSJa2L|du8H;gwhF= zsf!HB#?h<;0juHPHBcHg)et_j_>ZWX9W@pHX+}WN$l`{&HPuj3gm|tLVAPlD4C0rQ z9b5@Aa3pS}pXDjt)OWZP#`;hRp}D9^#g|t=o_L#`MwIGWLMzqk!)6RkkGq@5LA2V_ zds?}N%6w}o>FOluYL_5uB5KW}SS@LvP)_3lAL5e^;?@pCC?%epQg3oRyJpld=$g6?q4NYCHrUqY{F>oi;8Og5_Vl_aB% z7XUXoY)&X14Zf7B?jWHFPz7C4+!;iJjs4lx{mxB+w_U5JYJ z320HzS|l1C!i5ta(B=R}pSuQkXeZ&gX)Vg|`If%f$j!-?23fGK88u;xKuJ%%{7=n? z%_(ZojGG=uQ(%KmA8juc`dyYv-*X_2lTg{8jMiUch@)RVPnc_41@uZwKg77ubP0Gg>aR>g7UfysZy#pvCV{y}^rC zy=|zHkSiz2mF`CA-Dus7(Yvv_j8k^wa}s3f>m*$!>oP?bTw>MBC04y$VvW|<(RQ-) zi#6Y#Na68^MRfdO1^O2Fn6vd^PR`E74HkFvbeSL6lf`oShYzsPc0taz$oJJ~d|&Z> zQMFlX7wdupta`gd1zw67rylBawwdI)Ojd5o6>7OYtdKLVmAX4EyJVA3ToF&#t20E! zDrL}6Evr@)agE}y)z@`7dzL-B(w+UHzF5wU<-MzF_vZcn*j1hpxA1&r{ER=W z*0xKrEtSvWo*l82)bbW8h1G@7_!g@-y))?nI99icjSYiF1ADiWT=wwS0~(W0at`%#WKuEa4;&l`II zr-RZ`DV^+bmiZl%OO%Kd2OA zZr0bBb7N!4I_E6izjX>~YnJpa9_>pP{aS02Da~iQoRQZZ@-K9kI z8Q-6(cI;iRlN&Vz)pU1m-@dCodBzo6M1mKPc_Ygqc>~ww`{;)qk;!FGhOhFJ^XiOW z-D!_LD^J3tJ_J><&mBcnjKmgqa-Rmb3a$!I%xow3BwJ0^3{ezs(%#$$X=#Be!&? zlrr~Nh=}>l>VT;(*Nm#++^NC(z+XfnbV%nMfWj$Zm}h7ww=Dcp%38k2fPOY3sD?Zy zoy=5c5nk;lp_o7*0-halT3I-x9i!-*(L&Q%pD+P3T-w#%%Hoe{(E$`HqLa)Sk5^A) zb-`TW44)A+2rpB;Z67eCRUM~y?Vx+-_6Q^v8LRsdYr~cPsAd&$g?!Pc)C=+K*gq&p z9NH-HqqaEFg$u#XLWl-VzT9p<`&=N}66-odVB5~q!rMV$w-+dL6SE=Q?<6F<# zZSo)Th7gA#I1kxuw}iHp3%jZB%h|>ULVK|VWpymROWG8x-EIr*c6@U5BWkRN59}o& z^X{b~n{$pM{g-eI1AXcKqV68ryX@V8y(hG9v2P`L`?e4RnlFd;?e^Z#-e+;Ra=(2i?<|LO9D{m1 zv=3U&=lHhj=^>Hy9kJ(?_TkVzVkyEd(Tu;E$Lza8d(gf+1hDdW;{lrh1(&7SXJ@RyK{}0rH%yy&@WdH{-BWr=tlo!h>Lns?@Guhkn7*C z#9>59ZxAKif%NH3BpGQK?sn`wO%4cAjZ=*D2+!bsOkP}y<0v1=lYpCw+MM@f$h7oUAHJ0uRz?i;A<)TD5ND@x)qWPG7$iaYAJZaIMRE2VN=E?qn9I)7<>u5lHN&B zmN|(#o!1Fq`YNHduMlH$te!Yu3j}W->7F>n>Kkg7V-x0Gg0k!xT|APcSJ%!56MHp} z9RiM5nrGu-CB6H4UC}M61HRU_>gXq}w^t*yu1A3E9R*b(K9^!x8WvU=?w56g`(??% zZ<*5x>sP8;{jykgzbvfyZA7;!o$(d!-F^&?ty5!4iD`fxU_sAsJpceJ&n#t4wVaHs zi__bCyD6__T!MIhE_AdY&R+;nVJXTmuWFEc45=`MFkqF=RcW`9wp62yLKsvOB~E@> zuYr?cmekH_EXJUVcN(M^VxgjXxXr~Bvkf-zCjw1G z7ubvm>>T>TDfETqte?+h*}Rc@z7U?5Y4sf=sEn(|fhO}Ob4p+y81@o6j=(%9 zXvP85@17GEN6njU8bOE3vzFI0UqiOnrdleS5Rk<`kGiTwf&XZf);VM@GOL@Ws9#Pi z=$BsQeggq+q(nElM7{F5I!UxT;mPWVC(E=SjFP{RxY85I+PhpfyzBH3Gt@mHeo1E4ujGXr(*A9oz}vceZBa9c2OU0vP0OcR(Ka0WOs`-qtgCIEJ7@Hm&L{%M+j;=R6sfeD?j zu4WYP?q+(v3wei0ZzqfUsIPa>HSTBVc_$<815o}Dn!tz6JZfhV^>Z3Tt-)W3_{f`P zu1!j_miO<0WC(TTlGglmjJfZH{2ZM5B+Zy1^%lIAJVgzw>kTlOKO5{L-v__Ezh;2+ z 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%0A>*;<>101Ov5c$!%Y@pl5Ns47N*ZzE#z$) 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%0Ab@}ChVGL3fT6!=v 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π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 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java index 37bc23c6d..e801010c5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java @@ -36,7 +36,6 @@ import com.jpexs.helpers.Helper; import fontastic.FGlyph; import fontastic.FPoint; import fontastic.Fontastic; -import fontastic.PVector; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -187,19 +186,19 @@ public class FontExporter { @Override public void moveTo(double x, double y) { finalizePath(); - path.add(new FPoint(new PVector(transformX(x), transformY(y)))); + path.add(new FPoint(transformX(x), transformY(y))); } @Override public void lineTo(double x, double y) { - path.add(new FPoint(new PVector(transformX(x), transformY(y)))); + path.add(new FPoint(transformX(x), transformY(y))); } @Override public void curveTo(double controlX, double controlY, double anchorX, double anchorY) { path.add(new FPoint( - new PVector(transformX(anchorX), transformY(anchorY)), - new PVector(transformX(controlX), transformY(controlY)) + new FPoint(transformX(anchorX), transformY(anchorY)), + new FPoint(transformX(controlX), transformY(controlY)) )); } diff --git a/libsrc/ttf/src/fontastic/FContour.java b/libsrc/ttf/src/fontastic/FContour.java index 63f44d05a..38745865c 100644 --- a/libsrc/ttf/src/fontastic/FContour.java +++ b/libsrc/ttf/src/fontastic/FContour.java @@ -46,27 +46,20 @@ public class FContour { this.points = new ArrayList<>(); } - FContour(PVector[] points) { + FContour(FPoint[] points) { this.points = new ArrayList<>(); - for (PVector p : points) { - this.points.add(new FPoint(p)); + for (FPoint p : points) { + this.points.add(p); } } - FContour(PVector[] points, PVector[] controlpoints) { + FContour(FPoint[] points, FPoint[] controlpoints) { this.points = new ArrayList<>(); for (int i=0; i(); - for (int i=0; i getPoints() { return points; } @@ -76,10 +69,10 @@ public class FContour { return pointsArray; } - public void setPoints(PVector[] points) { + public void setPoints(FPoint[] points) { this.points = new ArrayList<>(); - for (PVector p : points) { - this.points.add(new FPoint(p)); + for (FPoint p : points) { + this.points.add(p); } } diff --git a/libsrc/ttf/src/fontastic/FGlyph.java b/libsrc/ttf/src/fontastic/FGlyph.java index b2b0a53c7..e5dacaf7b 100644 --- a/libsrc/ttf/src/fontastic/FGlyph.java +++ b/libsrc/ttf/src/fontastic/FGlyph.java @@ -52,15 +52,11 @@ public class FGlyph { contours.add(new FContour()); } - public void addContour(PVector[] points) { - contours.add(new FContour(points)); - } - public void addContour(FPoint[] points) { contours.add(new FContour(points)); } - public void addContour(PVector[] points, PVector[] controlPoints) { + public void addContour(FPoint[] points, FPoint[] controlPoints) { contours.add(new FContour(points, controlPoints)); } @@ -97,10 +93,6 @@ public class FGlyph { return contours.size(); } - public void setContour(int index, PVector[] points) { - contours.set(index, new FContour(points)); - } - public void setContour(int index, FPoint[] points) { contours.set(index, new FContour(points)); } diff --git a/libsrc/ttf/src/fontastic/FPoint.java b/libsrc/ttf/src/fontastic/FPoint.java index e2bd71bcb..c6d98b023 100644 --- a/libsrc/ttf/src/fontastic/FPoint.java +++ b/libsrc/ttf/src/fontastic/FPoint.java @@ -35,42 +35,45 @@ package fontastic; * Stores a point with x and y coordinates and optional PVector controlPoint1 and controlPoint2. * */ -public class FPoint extends PVector { +public class FPoint { - public PVector controlPoint; + public double x; + public double y; + + public FPoint controlPoint; private boolean hasControlPoint; public FPoint() { } - public FPoint(PVector point) { + public FPoint(FPoint point) { this.x = point.x; this.y = point.y; this.hasControlPoint = false; } - public FPoint(float x, float y) { + public FPoint(double x, double y) { this.x = x; this.y = y; this.hasControlPoint = false; } - public FPoint(PVector point, PVector controlPoint) { + public FPoint(FPoint point, FPoint controlPoint) { this.x = point.x; this.y = point.y; this.controlPoint = controlPoint; this.hasControlPoint = true; } - public void setControlPoint(PVector controlPoint1) { + public void setControlPoint(FPoint controlPoint1) { this.controlPoint = controlPoint1; this.hasControlPoint = true; } public void setControlPoint(float x, float y) { - this.controlPoint = new PVector(x,y); + this.controlPoint = new FPoint(x, y); this.hasControlPoint = true; } diff --git a/libsrc/ttf/src/fontastic/Fontastic.java b/libsrc/ttf/src/fontastic/Fontastic.java index bf07e4c77..45f5106f9 100644 --- a/libsrc/ttf/src/fontastic/Fontastic.java +++ b/libsrc/ttf/src/fontastic/Fontastic.java @@ -32,11 +32,7 @@ import org.doubletype.ossa.adapter.*; import java.io.*; import java.util.ArrayList; -import java.util.Map; import java.util.List; -import java.util.Scanner; -import java.util.regex.Pattern; -import java.util.regex.Matcher; /** * Fontastic A font file writer to create TTF and WOFF (Webfonts). @@ -45,55 +41,30 @@ import java.util.regex.Matcher; */ public class Fontastic { - private org.doubletype.ossa.module.TypefaceFile typeface; private org.doubletype.ossa.Engine m_engine; - private String fontname; + private String fontName; private List glyphs; private int advanceWidth = 512; - private File ttffile; - private File outfile; + private File ttfFile; + private File outFile; private File tempDir; - public final static String VERSION = "0.4"; - - /** - * Uppercase alphabet 26 characters * - */ - public final static char alphabet[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', 'W', 'X', 'Y', 'Z'}; - /** - * Lowercase alphabet 26 characters * - */ - public final static char alphabetLc[] = {'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z'}; - - /** - * Return the version of the library. - * - * @return String - */ - public static String version() { - return VERSION; - } - /** * Constructor * * @example Fontastic f = new Fontastic(this, "MyFont"); * - * @param theParent Your processing sketch (this). - * @param fontname Font name + * @param fontName Font name + * @param outFile * */ - public Fontastic(String fontname, File outfile) throws IOException { - this.fontname = fontname; - this.outfile = outfile; + public Fontastic(String fontName, File outFile) throws IOException { + this.fontName = fontName; + this.outFile = outFile; intitialiseFont(); this.glyphs = new ArrayList<>(); } @@ -104,7 +75,7 @@ public class Fontastic { * @return String */ public String getFontname() { - return fontname; + return fontName; } private static File createTempDirectory() @@ -132,27 +103,17 @@ public class Fontastic { private void intitialiseFont() throws IOException { tempDir = createTempDirectory(); - /*if (!tempDir.exists()) { - if(!tempDir.mkdirs()){ - if (!tempDir.exists()) { - throw new IOException("Cannot create temp dir"); - } - } - } else { - //deleteFolderContents(tempDir, false); - }*/ - - m_engine = Engine.getSingletonInstance(); - m_engine.buildNewTypeface(fontname, tempDir); + m_engine = new Engine(); + m_engine.buildNewTypeface(fontName, tempDir); - this.setFontFamilyName(fontname); + this.setFontFamilyName(fontName); this.setVersion("CC BY-SA 3.0 http://creativecommons.org/licenses/by-sa/3.0/"); // default // license - String directoryName = tempDir + File.separator + "bin" + File.separator; + String directoryName = tempDir + File.separator; - ttffile = new File(directoryName + fontname + ".ttf"); + ttfFile = new File(directoryName + fontName + ".ttf"); } /** @@ -160,12 +121,11 @@ public class Fontastic { * template for previewing the WOFF. If debug is set (default is true) then * you'll see the .ttf and .woff file name in the console. */ - public void buildFont() throws FileNotFoundException { + public void buildFont() { // Create TTF file with doubletype //m_engine.fireAction(); //m_engine.addDefaultGlyphs(); - List glyphFiles = new ArrayList<>(glyphs.size()); for (FGlyph glyph : glyphs) { m_engine.checkUnicodeBlock(glyph.getGlyphChar()); @@ -200,18 +160,16 @@ public class Fontastic { glyphFile.addContour(econtour); } - - glyphFiles.add(glyphFile); } m_engine.getTypeface().addRequiredGlyphs(); - m_engine.buildTrueType(false); + m_engine.buildTrueType(); // End TTF creation - if(outfile.exists()){ - outfile.delete(); + if(outFile.exists()){ + outFile.delete(); } - ttffile.renameTo(outfile); + ttfFile.renameTo(outFile); cleanup(); } @@ -229,14 +187,14 @@ public class Fontastic { /** * Sets the author of the font. */ - public void setAuthor(String author) throws FileNotFoundException { + public void setAuthor(String author) { m_engine.setAuthor(author); } /** * Sets the copyright year of the font. */ - public void setCopyrightYear(String copyrightYear) throws FileNotFoundException { + public void setCopyrightYear(String copyrightYear) { m_engine.setCopyrightYear(copyrightYear); } @@ -244,7 +202,7 @@ public class Fontastic { * Sets the version of the font (default is "0.1"). */ public void setVersion(String version) { - m_engine.getTypeface().getGlyph().getHead().setVersion(version); + m_engine.getTypeface().setVersion(version); } /** @@ -252,14 +210,14 @@ public class Fontastic { * changed with setFontFamilyName() it won't affect folder the font is * stored in. */ - public void setFontFamilyName(String fontFamilyName) throws FileNotFoundException { + public void setFontFamilyName(String fontFamilyName) { m_engine.setFontFamilyName(fontFamilyName); } /** * Sets the sub family of the font. */ - public void setSubFamily(String subFamily) throws FileNotFoundException { + public void setSubFamily(String subFamily) { m_engine.getTypeface().setSubFamily(subFamily); } @@ -267,21 +225,21 @@ public class Fontastic { * Sets the license of the font (default is "CC BY-SA 3.0 * http://creativecommons.org/licenses/by-sa/3.0/") */ - public void setTypefaceLicense(String typefaceLicense) throws FileNotFoundException { + public void setTypefaceLicense(String typefaceLicense) { m_engine.setTypefaceLicense(typefaceLicense); } /** * Sets the baseline of the font. */ - public void setBaseline(float baseline) throws FileNotFoundException { + public void setBaseline(float baseline) { m_engine.setBaseline(baseline); } /** * Sets the meanline of the font. */ - public void setMeanline(float meanline) throws FileNotFoundException { + public void setMeanline(float meanline) { m_engine.setMeanline(meanline); } @@ -294,7 +252,7 @@ public class Fontastic { this.advanceWidth = advanceWidth; } - public void setTopSideBearing(float topSideBearing) throws FileNotFoundException { + public void setTopSideBearing(float topSideBearing) { try { m_engine.getTypeface().setTopSideBearing(topSideBearing); } catch (OutOfRangeException e) { @@ -305,7 +263,7 @@ public class Fontastic { } } - public void setBottomSideBearing(float bottomSideBearing) throws FileNotFoundException { + public void setBottomSideBearing(float bottomSideBearing) { try { m_engine.getTypeface().setBottomSideBearing(bottomSideBearing); } catch (OutOfRangeException e) { @@ -316,7 +274,7 @@ public class Fontastic { } } - public void setAscender(float ascender) throws FileNotFoundException { + public void setAscender(float ascender) { try { m_engine.getTypeface().setAscender(ascender); } catch (OutOfRangeException e) { @@ -327,7 +285,7 @@ public class Fontastic { } } - public void setDescender(float descender) throws FileNotFoundException { + public void setDescender(float descender) { try { m_engine.getTypeface().setDescender(descender); } catch (OutOfRangeException e) { @@ -338,7 +296,7 @@ public class Fontastic { } } - public void setXHeight(float xHeight) throws FileNotFoundException { + public void setXHeight(float xHeight) { try { m_engine.getTypeface().setXHeight(xHeight); } catch (OutOfRangeException e) { @@ -357,7 +315,7 @@ public class Fontastic { * // 2 px setBottomSideBearing(0); // 0px * */ - public void setDefaultMetrics() throws FileNotFoundException { + public void setDefaultMetrics() { m_engine.getTypeface().setDefaultMetrics(); } @@ -383,7 +341,7 @@ public class Fontastic { * * @param c Character of the glyph. * - * @param FContour Shape of the glyph as FContour. + * @param contour Shape of the glyph as FContour. * * @return The glyph FGlyph that has been created. You can use this to store * the glyph and add contours afterwards. Alternatively, you can call @@ -405,7 +363,7 @@ public class Fontastic { * * @param c Character of the glyph. * - * @param FContour [] Shape of the glyph in an array of FContour. + * @param contours Shape of the glyph in an array of FContour. * * @return The FGlyph that has been created. You can use this to store the * glyph and add contours afterwards. Alternatively, you can call @@ -417,7 +375,6 @@ public class Fontastic { glyphs.add(glyph); for (FContour contour : contours) { - // if (debug) System.out.println(p.x + " - " + p.y); glyph.addContour(contour); } glyph.setAdvanceWidth(advanceWidth); @@ -471,7 +428,7 @@ public class Fontastic { * @return The .ttf file name, which is being created when you call build() */ public String getTTFfilename() { - return ttffile.toString(); + return ttfFile.toString(); } private static void deleteFolderContents(File folder, diff --git a/libsrc/ttf/src/fontastic/PVector.java b/libsrc/ttf/src/fontastic/PVector.java deleted file mode 100644 index 42786aab2..000000000 --- a/libsrc/ttf/src/fontastic/PVector.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -package fontastic; - -/** - * - * @author JPEXS - */ -public class PVector { - public double x; - public double y; - - public PVector() { - } - - - - public PVector(double x, double y) { - this.x = x; - this.y = y; - } - -} diff --git a/libsrc/ttf/src/fontatest/FontaTest.java b/libsrc/ttf/src/fontatest/FontaTest.java index 801ba5211..3753646f5 100644 --- a/libsrc/ttf/src/fontatest/FontaTest.java +++ b/libsrc/ttf/src/fontatest/FontaTest.java @@ -1,31 +1,30 @@ -package fontatest; - -import fontastic.FPoint; -import fontastic.Fontastic; -import fontastic.PVector; -import java.io.File; -import java.io.IOException; - - -public class FontaTest { - - /** - * @param args the command line arguments - */ - public static void main(String[] args) throws IOException { - File file=new File("example.ttf"); - file.delete(); - Fontastic f = new Fontastic("ExampleFont",file); - f.setAuthor("Nobody"); - FPoint[] points = new FPoint[]{ // Define a PVector array containing the points of the shape - new FPoint(0, 0), - new FPoint(512,0), - //new FPoint(256, 1024), - new FPoint(new PVector(256,1024), new PVector(512,512)), - new FPoint(0, 0) - }; - f.addGlyph('P').addContour(points); // Assign contour to character A - f.buildFont(); - } - -} +package fontatest; + +import fontastic.FPoint; +import fontastic.Fontastic; +import java.io.File; +import java.io.IOException; + + +public class FontaTest { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws IOException { + File file=new File("example.ttf"); + file.delete(); + Fontastic f = new Fontastic("ExampleFont",file); + f.setAuthor("Nobody"); + FPoint[] points = new FPoint[]{ // Define a FPoint array containing the points of the shape + new FPoint(0, 0), + new FPoint(512,0), + //new FPoint(256, 1024), + new FPoint(new FPoint(256,1024), new FPoint(512,512)), + new FPoint(0, 0) + }; + f.addGlyph('P').addContour(points); // Assign contour to character A + f.buildFont(); + } + +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/ActiveList.java b/libsrc/ttf/src/org/doubletype/ossa/ActiveList.java deleted file mode 100644 index dfacfb5fa..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/ActiveList.java +++ /dev/null @@ -1,199 +0,0 @@ - /* - * $Id: ActiveList.java,v 1.7 2004/11/15 03:39:38 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.util.*; - -import org.doubletype.ossa.adapter.*; - -/** - * @author e.e - */ -public class ActiveList { - private static ActiveList s_actives = null; - - public static ActiveList getSingletonInstance() { - if (s_actives == null) - s_actives = new ActiveList(); - - return s_actives; - } - - // -------------------------------------------------------------- - - public ArrayList m_activeObjects = new ArrayList<>(); - - public void unselectAll() { - m_activeObjects.clear(); - } - - public boolean hasSelected() { - return size() > 0; - } - - public int size() { - return m_activeObjects.size(); - } - - public GlyphObject get(int a_index) { - return m_activeObjects.get(a_index); - } - - public boolean isSelected(Object a_value) { - int i; - - // use equal method to compare this will catch XContour etc... - for (i = 0; i < size(); i++) { - if (get(i) == a_value) { - return true; - } // if - } // for i - - return false; - } - - public void addActive(GlyphObject a_object) { - if (isSelected(a_object)) { - return; - } // if - - m_activeObjects.add(a_object); - } - - public void setActives(ActiveList a_actives) { - unselectAll(); - - int i; - for (i = 0; i < a_actives.size(); i++) { - addActive(a_actives.get(i)); - } // for i - } - - private GlyphObject getTheActive() { - GlyphObject retval = null; - - if (m_activeObjects.size() == 1) { - retval = get(0); - } // if - - return retval; - } - - public boolean hasActiveModule() { - return (getTheActive() instanceof EModuleInvoke); - } - - public EModuleInvoke getActiveModule() { - if (hasActiveModule()) { - return (EModuleInvoke) getTheActive(); - } else { - return null; - } // if-else - } - - public boolean hasActiveContour() { - return (getTheActive() instanceof EContour); - } - - public EContour getActiveContour() { - if (getTheActive() instanceof EContour) { - return (EContour) getTheActive(); - } else { - return null; - } // if-else - } - - public boolean hasActiveInclude() { - return (getTheActive() instanceof EIncludeInvoke); - } - - public EIncludeInvoke getActiveInclude() { - if (hasActiveInclude()) { - return (EIncludeInvoke) getTheActive(); - } // if - - return null; - } - - public boolean hasActiveControlPoint() { - return (getTheActive() instanceof EControlPoint); - } - - public EControlPoint getActiveControlPoint() { - if (hasActiveControlPoint()) { - return (EControlPoint) getTheActive(); - } // if - - return null; - } - - public boolean hasActivePoint() { - return (getTheActive() instanceof EContourPoint); - } - - public EContourPoint getActivePoint() { - if (hasActivePoint()) { - return (EContourPoint) getTheActive(); - } else { - return null; - } // if - } - - public boolean hasActiveHint() { - return (getTheActive() instanceof EHint); - } - - public String getSelectedAsString() { - String retval = ""; - - if (!hasSelected()) { - return retval; - } // if - - retval = ""; - - int i; - for (i = 0; i < size(); i++) { - GlyphObject active = get(i); - retval += active.toString(); - } // for i - - retval += ""; - - return retval; - } - -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/AppSettings.java b/libsrc/ttf/src/org/doubletype/ossa/AppSettings.java deleted file mode 100644 index f5ca77e1e..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/AppSettings.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - */ -package org.doubletype.ossa; - -import java.io.*; -import java.util.Properties; - -/** - * @author e.e - */ -public class AppSettings extends Object { - private static String k_lastTypefaceFile = "lastTypefaceFile"; - - private static File s_fileName = new File("./.properties"); - private static Properties s_properties; - - public static String getLastTypefaceDir() { - loadPropertyFile(); - return s_properties.getProperty(k_lastTypefaceFile, "./"); - } - - public static void setLastTypefaceDir(String a_value) { - loadPropertyFile(); - s_properties.setProperty(k_lastTypefaceFile, a_value); - savePropertyFile(); - } - - private static void loadPropertyFile() { - if (s_properties != null) { - return; - } // if - - s_properties = new Properties(); - if (s_fileName.exists()) { - try { - s_properties.load(new FileInputStream(s_fileName)); - } catch (IOException e) { - e.printStackTrace(); - } // try-catch - } // if - } - - private static void savePropertyFile() { - if (s_properties == null) { - return; - } // if - - try { - s_properties.store(new FileOutputStream(s_fileName), - "DoubleType AppSetting File"); - } catch (IOException e) { - e.printStackTrace(); - } // try-catch - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/Engine.java b/libsrc/ttf/src/org/doubletype/ossa/Engine.java index 16e459f68..768b428f4 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/Engine.java +++ b/libsrc/ttf/src/org/doubletype/ossa/Engine.java @@ -35,23 +35,13 @@ package org.doubletype.ossa; -import java.awt.*; -import java.awt.datatransfer.*; -import java.awt.event.*; -import java.awt.geom.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.io.*; -import java.net.MalformedURLException; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.*; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.*; -import javax.swing.event.*; -import org.doubletype.ossa.adapter.*; import org.doubletype.ossa.module.*; import org.doubletype.ossa.truetype.*; @@ -59,252 +49,14 @@ import org.doubletype.ossa.truetype.*; * @author e.e */ public class Engine { - // -------------------------------------------------------------- - - // used by findFile - public static final int USER_CANCELLED = -1; - public static final int FILE_NOT_FOUND = 0; - public static final int FILE_FOUND = 1; - - // used by Find - public static final int SEARCH_BY_EXAMPLE = 0; - public static final int SEARCH_UNICODE = 1; - public static final int SEARCH_JIS_CODE = 2; - - // public static final double k_fontSizes [] = {9, 10, 11, 12, 14, 18, 24, 36, 72}; - public static final int k_defaultPixelSize = 16; - public static final int k_resolutions [] = {96, 72, 75, 100}; - public static final int k_defaultResolution = 96; - public static final int k_zooms [] = {25, 50, 100}; - public static final int k_defaultZoom = 100; - - // -------------------------------------------------------------- - - private static int s_em = 1024; - private static Engine s_singleton = null; - - public static Engine getSingletonInstance() { - if (s_singleton == null) - s_singleton = new Engine(); - return s_singleton; - } - - public static int getEm() { - return TTPixelSize.getEm(); - } - - // -------------------------------------------------------------- - - private UiBridge m_ui; - private TypefaceFile m_typeface; private GlyphFile m_root; - private ActiveList m_actives; - private ArrayList m_listeners = new ArrayList<>(); - - private String m_foundFileName; - private Clipboard m_clipboard; - private JFileChooser m_gifChooser; - private JFileChooser m_chooser; - - private Action m_deleteAction; - private Action m_addPointAction; - private Action m_toggleAction; - private Action m_hintAction; - private Action m_contourAction; - private Action m_moduleAction; - private Action m_includeAction; - private Action m_selectNextAction; - private Action m_roundAction; - private Action m_propertyAction; - private Action m_convertControlPointAction; - private Action m_convertContourAction; - - private String m_msgAlreadyExists = " already exists!"; - private String m_msgNoTypeface = "no typeface"; - private String m_msgEmptyGlyphTitle = "glyph title is empty"; - private String m_msgGlyphName = "glyph name?"; - private String m_msgCircular = "circular include!"; - private String m_msgNoJis = "Charset ISO-2022-JP is not supported.\n" - + "Please include charsets.jar in classpath."; // -------------------------------------------------------------- - private Engine() { - //GlyphFactory.setFactory(new EGlyphFactory()); - - - - m_typeface = null; - m_root = null; - - m_clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - m_actives = ActiveList.getSingletonInstance(); - - initActions(); + public Engine() { } - private void initActions() { - - } - - public Action [] buildCommands() { - ArrayList actions = buildCommandsArrayList(); - Action [] retval = new Action[actions.size()]; - int i; - for (i = 0; i < actions.size(); i++) { - retval[i] = (Action) actions.get(i); - } // for i - - return retval; - } - - private ArrayList buildCommandsArrayList() { - ArrayList retval = new ArrayList<>(); - - if (m_root == null) { - return retval; - } // if - - if (m_actives.hasActiveContour()) { - retval.add(m_convertContourAction); - } - - if (m_actives.hasActiveControlPoint()) { - EControlPoint controlPoint = m_actives.getActiveControlPoint(); - retval.add(m_convertControlPointAction); - } - - if (m_actives.hasActivePoint()) { - EContourPoint point = m_actives.getActivePoint(); - - retval.add(m_toggleAction); - - if (!point.isRounded()) { - retval.add(m_hintAction); - } // if - - if (!point.hasHintForCurrentPpem()) { - retval.add(m_roundAction); - } // if - } // if - - if (m_actives.size() > 0) { - // retval.add(m_propertyAction); - retval.add(m_deleteAction); - } // if - - if (m_actives.hasActivePoint()) { - retval.add(m_addPointAction); - } // if - - /*if (!GlyphAction.isPointVisible()) { - retval.add(m_moduleAction); - retval.add(m_contourAction); - retval.add(m_includeAction); - } // if*/ - - return retval; - } - - public void localize(ResourceBundle a_bundle) { - m_msgAlreadyExists = a_bundle.getString("msgAlreadyExists"); - m_msgNoTypeface = a_bundle.getString("msgNoTypeface"); - m_msgEmptyGlyphTitle = a_bundle.getString("msgEmptyGlyphTitle"); - m_msgGlyphName = a_bundle.getString("msgGlyphName"); - m_msgCircular = a_bundle.getString("msgCircular"); - } - - private void showPropertyDialog() { - if (m_actives.size() != 1) { - return; - } // if - - m_ui.showPropertyDialog(m_actives.get(0)); - } - - public void setUi(UiBridge a_ui) { - m_ui = a_ui; - } - - - - public void selectNext() { - if (m_root == null) { - return; - } // if - - m_root.selectNext(); - } - - public void delete() { - if (m_root == null) - return; - if (!m_actives.hasSelected()) { - return; - } // if - - m_root.remove(); - } - - public void cutToClipboard() { - if (m_root == null) - return; - if (!m_actives.hasSelected()) { - return; - } // if - - copyToClipboard(); - delete(); - } - - public void copyToClipboard() { - if (m_root == null) - return; - if (!m_actives.hasSelected()) { - return; - } // if - - String s = m_actives.getSelectedAsString(); - if (s.equals("")) { - return; - } // if - - StringSelection selection = new StringSelection(s); - - try { - m_clipboard.setContents(selection, selection); - } catch (Exception e) { - e.printStackTrace(); - } // try-catch - } - - public void pasteFromClipboard() { - if (m_root == null) - return; - Transferable content = null; - String s = ""; - - try { - content = m_clipboard.getContents(this); - if (content == null) - return; - s = (String) content.getTransferData(DataFlavor.stringFlavor); - if (s.equals("")) { - return; - } // if - } catch (Exception e) { - e.printStackTrace(); - return; - } // try-catch - - try { - m_root.addObjectFromClipboard(s); - } catch (GlyphFile.CircularIncludeException e) { - Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, m_msgCircular, e); - } - } - public void setAdvanceWidth(int a_value) { if (m_root == null) return; @@ -312,34 +64,10 @@ public class Engine { m_root.setAdvanceWidth(a_value); } - public void moveLeft() { - move(new Point2D.Double(-1, 0)); - } - - public void moveUp() { - move(new Point2D.Double(0, 1)); - } - - public void moveDown() { - move(new Point2D.Double(0, -1)); - } - - public void moveRight() { - move(new Point2D.Double(1, 0)); - } - - private void move(Point2D a_delta) { - if (m_root == null) { - return; - } // if - - m_root.move(a_delta); - } - public void buildNewTypeface(String a_name, File a_dir) throws FileNotFoundException { if (a_name == null || a_name.equals("")) { return; - } // if + } TypefaceFile typeface = new TypefaceFile(a_name, a_dir); typeface.setAuthor("no body"); @@ -353,68 +81,20 @@ public class Engine { setTypeface(typeface); } - public void addDefaultGlyphs() throws FileNotFoundException { + public void addDefaultGlyphs() { m_typeface.addRequiredGlyphs(); m_typeface.addBasicLatinGlyphs(); } - public void openTypeface() throws FileNotFoundException { - if (m_chooser == null) { - m_chooser = new JFileChooser(new File(AppSettings.getLastTypefaceDir())); - } // if - - m_chooser.setFileFilter(new TypefaceFileFilter()); - int returnVal = m_chooser.showOpenDialog(null); - - if (returnVal != JFileChooser.APPROVE_OPTION) { - return; - } // if - - AppSettings.setLastTypefaceDir(m_chooser.getSelectedFile().toString()); - openTypeface(m_chooser.getSelectedFile()); - } - - private void openTypeface(File a_file) throws FileNotFoundException { - setTypeface(new TypefaceFile(a_file)); - - if (m_typeface.addRequiredGlyphs()) { - } // if - } - public void setTypeface(TypefaceFile a_typeface) { m_typeface = a_typeface; } - public void changeUnicode(long a_unicode) throws FileNotFoundException { - if (m_typeface == null || m_root == null) { - return; - } // if - - m_typeface.setGlyphUnicode(m_root, a_unicode); - } - - public int findFile(long a_unicode) { - if (m_typeface == null) - return USER_CANCELLED; - - m_foundFileName = m_typeface.unicodeToFileName(a_unicode); - if (m_foundFileName != null) { - return FILE_FOUND; - } // if - - return FILE_NOT_FOUND; - } - - public String getFoundFileName() { - return m_foundFileName; - } - - /** * Create glyph out of given unicode, and add it to the typeface. * @param a_unicode */ - public GlyphFile addNewGlyph(long a_unicode) throws FileNotFoundException { + public GlyphFile addNewGlyph(long a_unicode) { GlyphFile retval; retval = m_typeface.createGlyph(a_unicode); @@ -423,7 +103,7 @@ public class Engine { return retval; } - public void checkUnicodeBlock(long a_unicode) throws FileNotFoundException { + public void checkUnicodeBlock(long a_unicode) { TTUnicodeRange range = TTUnicodeRange.of(a_unicode); if (range == null){ return; @@ -435,53 +115,26 @@ public class Engine { m_typeface.addUnicodeRange(range.toString()); } - private void addGlyphToTypeface(GlyphFile a_file) throws FileNotFoundException { + private void addGlyphToTypeface(GlyphFile a_file) { m_typeface.addGlyph(a_file); setRoot(a_file); } - public GlyphFile openGlyphFile(String a_fileName) { - ModuleManager manager = ModuleManager.getSingletonInstance(); - GlyphFile retval = manager.getReloadedGlyphFile(a_fileName); - setRoot(retval); - - return retval; - } - - public void removeGlyphFromTypeface(String a_fileName) { + public void buildTrueType() { if (m_typeface == null) return; - m_typeface.removeGlyph(a_fileName); - } - - public Font buildTrueType(boolean a_isDebug) { - Font retval = null; - - if (m_typeface == null) - return retval; - try { - m_typeface.buildTTF(a_isDebug); - retval = m_typeface.getFont(); + m_typeface.buildTTF(); + m_typeface.getFont(); } catch (Exception e) { Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null,e); } // try-catch - return retval; - } - - public void saveGlyph() throws FileNotFoundException { - if (m_root == null) - return; - - if (m_root.getGlyphTitle().equals("")) { - Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, m_msgEmptyGlyphTitle); - return; - } // if + return; } public TypefaceFile getTypeface() { @@ -501,84 +154,69 @@ public class Engine { m_root = a_file; } - public String includeFileName() { - String retval = ""; - - JFileChooser chooser = new JFileChooser(getGlyphPath()); - chooser.setFileFilter(new GlyphFileFilter()); - - int returnVal = chooser.showOpenDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - retval = chooser.getSelectedFile().getName().toString(); - } // if - - return retval; - } - - public void addCodePage(String a_codePage) throws FileNotFoundException { + public void addCodePage(String a_codePage) { if (m_typeface == null) { return; - } // if + } m_typeface.addCodePage(a_codePage); } - public void removeCodePage(String a_codePage) throws FileNotFoundException { + public void removeCodePage(String a_codePage) { if (m_typeface == null) { return; - } // if + } m_typeface.removeCodePage(a_codePage); } - public void setAuthor(String a_value) throws FileNotFoundException { + public void setAuthor(String a_value) { if (m_typeface == null) { return; - } // if + } m_typeface.setAuthor(a_value); } - public void setCopyrightYear(String a_value) throws FileNotFoundException { + public void setCopyrightYear(String a_value) { if (m_typeface == null) { return; - } // if + } m_typeface.setCopyrightYear(a_value); } - public void setFontFamilyName(String a_value) throws FileNotFoundException { + public void setFontFamilyName(String a_value) { if (m_typeface == null) { return; - } // if + } m_typeface.setFontFamilyName(a_value); } - public void setTypefaceLicense(String a_value) throws FileNotFoundException { + public void setTypefaceLicense(String a_value) { if (m_typeface == null) { return; - } // if + } m_typeface.setLicense(a_value); } - public void setBaseline(double a_value) throws FileNotFoundException { + public void setBaseline(double a_value) { if (m_typeface == null) { return; - } // if + } double min = m_typeface.getBottomSideBearing(); double max = m_typeface.getMeanline(); if (a_value < min) { a_value = min; - } // if + } if (a_value > max) { a_value = max; - } // if + } try { m_typeface.setDescender(a_value - min); @@ -591,10 +229,10 @@ public class Engine { } // try-catch } - public void setMeanline(double a_value) throws FileNotFoundException { + public void setMeanline(double a_value) { if (m_typeface == null) { return; - } // if + } double min = m_typeface.getBaseline(); double max = m_typeface.getEm() @@ -602,11 +240,11 @@ public class Engine { if (a_value < min) { a_value = min; - } // if + } if (a_value > max) { a_value = max; - } // if + } try { m_typeface.setXHeight(a_value - min); @@ -615,83 +253,4 @@ public class Engine { e.printStackTrace(); } // try-catch } - - public void mousePressed(MouseEvent a_event) { - - } - - - public void mouseDragged(MouseEvent a_event) { - - } - - public void mouseReleased(MouseEvent a_event) { - - } - - public void setAction(String a_key) { - - } - - public void keyPressed(KeyEvent a_event) { - if (a_event.getModifiers() == 0) { - if (a_event.getKeyCode() == KeyEvent.VK_TAB) { - - m_selectNextAction.actionPerformed(null); - } // if - } else if (a_event.getModifiers() == KeyEvent.SHIFT_MASK) { - - } // if - } - - private JFileChooser createImageChooser() { - JFileChooser retval; - - retval = new JFileChooser(new File(AppSettings.getLastTypefaceDir())); - retval.setFileFilter(new javax.swing.filechooser.FileFilter() { - public boolean accept(File a_file) { - if (a_file.isDirectory()) - return true; - - String s = a_file.toString().toLowerCase(); - if (s.endsWith(".gif") - || s.endsWith(".jpg") - || s.endsWith(".jpeg") - || s.endsWith(".png")) - return true; - - return false; - } - - //The description of this filter - public String getDescription() { - return "Image Files"; - } - }); - - return retval; - } - - - - - public ArrayList getPixelSizes() { - return TTPixelSize.getList(); - } - - class MyTreeListener implements TreeSelectionListener { - public void valueChanged(TreeSelectionEvent a_event) { - TreePath path = a_event.getPath(); - Object obj = path.getLastPathComponent(); - String s = obj.toString(); - - TreePath parent = path.getParentPath(); - if (parent != null) { - obj = parent.getLastPathComponent(); - s = obj.toString() + "->" + s; - } // if - - } - } - } diff --git a/libsrc/ttf/src/org/doubletype/ossa/GlyphColor.java b/libsrc/ttf/src/org/doubletype/ossa/GlyphColor.java deleted file mode 100644 index fa6bb987a..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/GlyphColor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * $Id: GlyphColor.java,v 1.6 2004/07/11 06:25:11 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.awt.*; - - -/** - * @author e.e - */ -public class GlyphColor { - public static Color MAROON = new Color(120, 21, 11); - public static Color ORANGE = new Color(231, 113, 18); // (238, 176, 55); - public static Color OLIVE = new Color(98, 106, 7); - public static Color INDIGO = new Color(22, 16, 149); - public static Color GREEN = new Color(21, 142, 5); - public static Color RED = new Color(250, 0, 0); - public static Color GRAY = new Color(0x33, 0x33, 0x33); - public static Color CYAN = new Color(15, 187, 157); // 15, 108, 140 - public static Color AZURE = new Color(0x00, 0x66, 0xcc); - public static Color TAN = new Color(0xcc, 0x99, 0x66); - public static Color SILVER = new Color(0xe0, 0xdf, 0xe3); - - - public static Color BACKGROUND = Color.WHITE; - public static Color CROSS = Color.LIGHT_GRAY; - public static Color POINT = ORANGE; - public static Color NUMBER = Color.GRAY; - public static Color SELECTED = RED; - public static Color CONTOUR = AZURE; - public static Color HINT = OLIVE; - public static Color INCLUDE = OLIVE; - public static Color MODULE = MAROON; -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/GlyphFileFilter.java b/libsrc/ttf/src/org/doubletype/ossa/GlyphFileFilter.java deleted file mode 100644 index b93ba5a42..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/GlyphFileFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * $Id: GlyphFileFilter.java,v 1.2 2004/01/20 03:35:27 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.io.File; -import javax.swing.filechooser.FileFilter; - -/** - * @author e.e - */ -public class GlyphFileFilter extends FileFilter { - public boolean accept(File a_file) { - if (a_file.isDirectory()) { - return false; - } // if - - if (! (a_file.toString().toLowerCase().endsWith(".glyph"))) - return false; - - return true; - } - - //The description of this filter - public String getDescription() { - return "glyph files"; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/ImageSizer.java b/libsrc/ttf/src/org/doubletype/ossa/ImageSizer.java deleted file mode 100644 index dd409e8f7..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/ImageSizer.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * $Id: ImageSizer.java,v 1.1 2004/03/04 12:52:50 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.awt.*; -import java.awt.image.*; - -/** - * @author e.e - */ -public class ImageSizer { - private Dimension m_size = new Dimension(-1, -1); - private boolean m_isImcomplete; - - private ImageObserver m_observer = new ImageObserver() { - public synchronized boolean imageUpdate( - Image a_image, - int a_flag, - int a_x, - int a_y, - int a_width, - int a_height) { - if ((a_flag & WIDTH) != 0) - m_size.width = a_width; - if ((a_flag & HEIGHT) != 0) - m_size.height = a_height; - if ((a_flag & (ERROR | ABORT)) != 0) - m_isImcomplete = true; - - boolean retval = !resultKnown(); - if (!retval) { - notifyAll(); - } // if - - return retval; - } - }; - - public ImageSizer(Image a_image) { - m_size.width = a_image.getWidth(m_observer); - m_size.height = a_image.getHeight(m_observer); - } - - private boolean resultKnown() { - return m_size.width != -1 - && m_size.height != -1 - || m_isImcomplete; - } - - //returns null iff error or abort - public Dimension getImageSize() throws InterruptedException { - synchronized (m_observer) { - while (!resultKnown()) - m_observer.wait(); - return m_isImcomplete ? null : new Dimension(m_size); - } - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/Memento.java b/libsrc/ttf/src/org/doubletype/ossa/Memento.java deleted file mode 100644 index 19661eedc..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/Memento.java +++ /dev/null @@ -1,89 +0,0 @@ - /* - * $Id: Memento.java,v 1.1 2004/09/05 17:08:03 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003 - 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.io.*; -import java.util.zip.*; - -/** - * @author e.e - */ -public class Memento { - private String m_description; - private byte [] m_compressed; - private int m_originalSize; - private long m_entryTime; - - public Memento(String a_description, byte [] a_data) { - m_description = a_description; - m_originalSize = a_data.length; - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - ZipOutputStream zip = new ZipOutputStream(out); - - try { - zip.putNextEntry(new ZipEntry(a_description)); - zip.write(a_data); - zip.closeEntry(); - zip.close(); - } - catch (IOException ioe) { - ioe.printStackTrace(); - } - - m_compressed = out.toByteArray(); - m_entryTime = System.currentTimeMillis(); - } - - public InputStream getData() { - ZipInputStream zip = null; - - try { - zip = new ZipInputStream( - new ByteArrayInputStream(m_compressed)); - ZipEntry entry = zip.getNextEntry(); - } - catch (IOException ioe) { - ioe.printStackTrace(); - } - - return zip; - } - - public String toString() { - return m_description; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/ModuleManager.java b/libsrc/ttf/src/org/doubletype/ossa/ModuleManager.java deleted file mode 100644 index f1a6e7f92..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/ModuleManager.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * $Id: ModuleManager.java,v 1.5 2004/01/14 06:49:39 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.util.*; -import org.doubletype.ossa.module.*; -import java.io.*; - -/** - * @author e.e - */ -public class ModuleManager { - private static ModuleManager s_singleton = null; - - public static ModuleManager getSingletonInstance() { - if (s_singleton == null) - s_singleton = new ModuleManager(); - return s_singleton; - } - - - private Hashtable m_modules = new Hashtable<>(); - private Hashtable m_files = new Hashtable<>(); - - private ModuleManager() { - } - - public void clear() { - m_modules.clear(); - m_files.clear(); - } - - public GlyphModule getModule(String a_name) throws Exception { - if (m_modules.containsKey(a_name)) { - return (GlyphModule) m_modules.get(a_name); - } // if - - GlyphModule retval; - - retval = (GlyphModule) Class.forName(a_name).newInstance(); - m_modules.put(a_name, retval); - - return retval; - } - - public GlyphFile getGlyphFile(String a_name) { - if (m_files.containsKey(a_name)) { - return (GlyphFile) m_files.get(a_name); - } // if - - return getReloadedGlyphFile(a_name); - } - - public GlyphFile getReloadedGlyphFile(String a_name) { - GlyphFile retval; - - Engine engine = Engine.getSingletonInstance(); - retval = new GlyphFile(new File(engine.getGlyphPath(), a_name)); - m_files.put(a_name, retval); - - return retval; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/MyTableModel.java b/libsrc/ttf/src/org/doubletype/ossa/MyTableModel.java deleted file mode 100644 index 24f671dd6..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/MyTableModel.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * $Id: MyTableModel.java,v 1.1 2004/02/09 05:34:17 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import javax.swing.table.*; -import org.doubletype.ossa.module.*; - -/** - * @author e.e - */ -public class MyTableModel extends AbstractTableModel { - protected Engine m_engine; - protected GlyphFile m_file = null; - - protected MyTableModel(Engine a_engine) { - m_engine = a_engine; - } - - public int getColumnCount() { - return 2; - } - - public int getRowCount() { - reset(); - - return 0; - } - - public Object getValueAt(int a_row, int a_column) { - reset(); - - Object retval = null; - - return retval; - } - - protected void reset() { - - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/Renderer.java b/libsrc/ttf/src/org/doubletype/ossa/Renderer.java deleted file mode 100644 index 623e6739f..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/Renderer.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * $Id: Renderer.java,v 1.1 2004/06/18 09:14:01 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -/** - * @author e.e - */ -public interface Renderer { - boolean isRenderNeeded(); - void render(java.awt.Graphics2D a_graphics); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/Tabbable.java b/libsrc/ttf/src/org/doubletype/ossa/Tabbable.java deleted file mode 100644 index bc9f0e23c..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/Tabbable.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.doubletype.ossa; - -public interface Tabbable { - boolean isClosable(); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/TabbedPaneCloseButtonUI.java b/libsrc/ttf/src/org/doubletype/ossa/TabbedPaneCloseButtonUI.java deleted file mode 100644 index 0d9504efc..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/TabbedPaneCloseButtonUI.java +++ /dev/null @@ -1,188 +0,0 @@ -// http://forums.sun.com/thread.jspa?forumID=257&threadID=453521 - -package org.doubletype.ossa; - -import java.awt.Color; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.plaf.basic.BasicTabbedPaneUI; - -public class TabbedPaneCloseButtonUI extends BasicTabbedPaneUI { - private final int k_xButtonOffset = 19; - private final int k_yButtonOffset = 4; - private final int k_wButton = 14; // was 13 - private final int k_hButton = 13; // was 12 - - private int m_lastKnownSelected = -1; - private Color m_red = new Color(217, 76, 74); - private Color m_selectedColor = Color.white; - private Color m_unselectedColor = new Color(160, 197, 241); - - public TabbedPaneCloseButtonUI() { - super(); - } - - protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) - { - if (isSelected) - { - g.setColor(m_selectedColor); - } - else - { - g.setColor(m_unselectedColor); - } - - g.fillRect(x, y, w, h); - } - - protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) - { - return fontHeight + 4; - } - - protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) - { - g.setColor(darkShadow); - g.drawLine(x, y + h - 2, x, y); - g.drawLine(x, y, x + w, y); - g.drawLine(x + w, y + h - 2, x + w, y); - } - - protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, - int tabIndex, Rectangle iconRect, Rectangle textRect) { - - super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect); - } - - protected void paintFocusIndicator(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect, boolean isSelected) - { - } - - protected void paintContentBorderTopEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) - { - if (selectedIndex < 0) { - return; - } // if - - Rectangle rect = getTabBounds(selectedIndex, calcRect); - g.setColor(darkShadow); - g.drawLine(x, y, rect.x, y); - g.drawLine(rect.x + rect.width, y, x + w, y); - g.setColor(m_selectedColor); - g.drawLine(rect.x + 1, y, rect.x + rect.width -1, y); - } - - protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) - { - } - - protected void paintContentBorderRightEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) - { - } - - protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement, int selectedIndex, int x, int y, int w, int h) - { - } - - protected void paintText(Graphics g, int tabPlacement, java.awt.Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, boolean isSelected) - { - if (tabPane.getComponentAt(tabIndex) instanceof Tabbable) { - Tabbable tabbable = (Tabbable) tabPane.getComponentAt(tabIndex); - if (!tabbable.isClosable()) { - super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect, isSelected); - return; - } // if - } // if - - if (isSelected) // isSelected - { - super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect, isSelected); - Rectangle rect = rects[tabIndex]; - g.setColor(m_red); - int xButton = rect.x + rect.width - k_xButtonOffset; // -19 - int yButton = rect.y + k_yButtonOffset; // +4 - g.fillRect(xButton, yButton, k_wButton, k_hButton); - g.setColor(Color.white); - g.drawLine(xButton + 3, rect.y + 7, xButton + 9, rect.y + 13); - g.drawLine(xButton + 9, rect.y + 7, xButton + 3, rect.y + 13); - g.drawLine(xButton + 4, rect.y + 7, xButton + 10, rect.y + 13); - g.drawLine(xButton + 10, rect.y + 7, xButton + 4, rect.y + 13); - - m_lastKnownSelected = tabIndex; - } - else - { - super.paintText(g, tabPlacement, font, metrics, tabIndex, title, textRect, isSelected); - } - } - - protected int calculateTabWidth(int tabPlacement, int tabIndex, - FontMetrics metrics) { - if (tabPane.getComponentAt(tabIndex) instanceof Tabbable) { - Tabbable tabbable = (Tabbable) tabPane.getComponentAt(tabIndex); - if (!tabbable.isClosable()) { - return super.calculateTabWidth(tabPlacement, tabIndex, metrics); - } // if - } // if - - return super.calculateTabWidth(tabPlacement, tabIndex, metrics) + 34; // +24 - } - - protected MouseListener createMouseListener() { - return new MyMouseHandler(); - } - - class MyMouseHandler extends MouseHandler { - private int m_selectedOnPressed = -1; - - public MyMouseHandler() { - super(); - } - - public void mousePressed(MouseEvent e) { - m_selectedOnPressed = m_lastKnownSelected; - super.mousePressed(e); - } - - public void mouseReleased(MouseEvent e) { - int x = e.getX(); - int y = e.getY(); - int tabIndex = -1; - int tabCount = tabPane.getTabCount(); - for (int i = 0; i < tabCount; i++) { - if (rects[i].contains(x, y)) { - tabIndex = i; - break; - } // if - } // for i - - // skip if this is not current. - if (tabPane.getSelectedIndex() != tabIndex) { - return; - } // if - - if (m_selectedOnPressed != tabIndex) { - return; - } // if - - if (tabIndex >= 0 && !e.isPopupTrigger()) { - Rectangle tabRect = rects[tabIndex]; - y = y - tabRect.y; - - int xButton = tabRect.x + tabRect.width - k_xButtonOffset; - if ((x >= xButton + 1) - && (x <= xButton + k_wButton - 2) - && (y >= k_yButtonOffset + 1) - && (y <= k_yButtonOffset + k_hButton - 2)) { - tabPane.remove(tabIndex); - } - } - } - } - -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/TypefaceFileFilter.java b/libsrc/ttf/src/org/doubletype/ossa/TypefaceFileFilter.java deleted file mode 100644 index 446cdad16..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/TypefaceFileFilter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * $Id: TypefaceFileFilter.java,v 1.1 2004/01/20 03:35:27 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.io.File; -import javax.swing.filechooser.FileFilter; - -/** - * @author e.e - */ -public class TypefaceFileFilter extends FileFilter { - public boolean accept(File a_file) { - if (a_file.isDirectory()) - return true; - - if (! (a_file.toString().toLowerCase().endsWith(".dtyp"))) - return false; - - return true; - } - - //The description of this filter - public String getDescription() { - return "typeface files"; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/UiBridge.java b/libsrc/ttf/src/org/doubletype/ossa/UiBridge.java deleted file mode 100644 index c49d75c7d..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/UiBridge.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - */ -package org.doubletype.ossa; - -import org.doubletype.ossa.adapter.*; - -/** - * @author e.e - */ -public interface UiBridge { - void showPropertyDialog(GlyphObject a_object); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/UnicodeBuilder.java b/libsrc/ttf/src/org/doubletype/ossa/UnicodeBuilder.java deleted file mode 100644 index b10718938..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/UnicodeBuilder.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * $Id: UnicodeBuilder.java,v 1.1 2004/09/11 10:09:07 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa; - -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.util.logging.Level; -import java.util.logging.Logger; - - -/** - * @author e.e - */ -public class UnicodeBuilder { - public static final String k_jisCharset = "ISO-2022-JP"; - - /** - * pops dialog and asks user for unicode. - * @return true on success, false otherwise. - */ - public static Long askUnicode() { - Engine engine = Engine.getSingletonInstance(); - - throw new UnsupportedOperationException(); - } - - public static Long build(String a_value, int a_option) { - if (a_value == null - || a_value.length() == 0) { - return null; - } // if - - switch (a_option) { - case Engine.SEARCH_BY_EXAMPLE: { - return buildByExample(a_value); - } // case - - case Engine.SEARCH_UNICODE: { - return buildByUnicode(a_value); - } // case - - case Engine.SEARCH_JIS_CODE: { - return buildByJisCode(a_value); - } // case - } // switch - - return null; - } - - private static Long buildByExample(String a_value) { - if (a_value.length() > 1) { - return null; - } // if - - return new Long((long) a_value.charAt(0)); - } - - private static Long buildByUnicode(String a_value) { - if (a_value.length() == 1) { - return buildByExample(a_value); - } // if - - try { - return new Long(Long.parseLong(a_value, 16)); - } catch (NumberFormatException e) { - Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null,e); - } - - return null; - } - - private static Long buildByJisCode(String a_value) { - if (a_value.length() == 1) { - return buildByExample(a_value); - } // if - - try { - Long retval = jisX0208ToUnicode(Long.parseLong(a_value, 16)); - - if (retval == null) { - Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, "Bad JIS Code."); - } // if - - return retval; - } catch (NumberFormatException e) { - Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, e); - } // try - - return null; - } - - /** - * converts JIS X0208 code into unicode using ISO-2022-JP decoder. - * @param a_value JIS code - * @return unicode - */ - public static Long jisX0208ToUnicode(long a_value) { - if (!isJisSupported()) { - return null; - } // if - - Charset jis = Charset.forName(k_jisCharset); - ByteBuffer in = ByteBuffer.allocate(5); - CharsetDecoder jisDecoder; - jisDecoder = jis.newDecoder(); - - long high = (0xff00 & a_value) >> 8; - long low = 0x00ff & a_value; - - if (high < 0x21 || high > 0x7e || low < 0x21 || high > 0x7e) { - return null; - } // if - - char c = (char) a_value; - - in.rewind(); - in.put((byte) 0x1b); - in.put((byte) 0x24); - in.put((byte) 0x40); - - in.putChar(c); - in.position(0); - - try { - CharBuffer out = jisDecoder.decode(in); - if (out.length() > 0) { - return new Long(out.get(0)); - } // if - } catch (CharacterCodingException e) { - e.printStackTrace(); - } // try-catch - - return null; - } - - public static boolean isJisSupported() { - return Charset.isSupported(k_jisCharset); - } - - /** - * - */ - public UnicodeBuilder() { - super(); - // TODO Auto-generated constructor stub - } - -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/CubicSegment.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/CubicSegment.java index 44c33e025..fd6c14485 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/CubicSegment.java +++ b/libsrc/ttf/src/org/doubletype/ossa/adapter/CubicSegment.java @@ -1,398 +1,200 @@ -/* - * $Id: CubicSegment.java,v 1.2 2004/12/27 04:56:02 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.util.*; -import java.awt.geom.*; - -import org.doubletype.ossa.xml.*; - -/** - * @author e.e - */ -public class CubicSegment { - public static final int LINE = 0; - public static final int CURVE = 1; - - private static final double k_tolerance = 5; - private static final double k_minTolerance = 10; - private static final int k_maxTrial = 3; - - /** - * converts cubic contour into cubic segments. - * @param a_contour - * @return - */ - public static ArrayList toSegments(EContour a_contour) { - ArrayList retval = new ArrayList<>(); - XContourPoint [] points = a_contour.getContourPoint(); - if (points.length < 2) { - return retval; - } // if - - EContourPoint startPoint = (EContourPoint) points[points.length - 1]; - for (int i = 0; i < points.length; i++) { - EContourPoint endPoint = (EContourPoint) points[i]; - retval.add(new CubicSegment(startPoint, endPoint)); - startPoint = endPoint; - } // for - - return retval; - } - - /** - * converts cubic segments into cubic contour. - * @param a_segments - * @return - */ - public static EContour toContour(ArrayList a_segments) { - EContour retval = new EContour(); - retval.setType(EContour.k_cubic); - - EControlPoint controlPoint1 = null; - for (int i = 0; i < a_segments.size(); i++) { - CubicSegment segment = (CubicSegment) a_segments.get(i); - EContourPoint startPoint = (EContourPoint) segment.m_startPoint.clone(); - - if (controlPoint1 != null) { - startPoint.setControlPoint1(controlPoint1); - controlPoint1 = null; - } // if - - if (segment.m_controlPoint1 != null) { - EControlPoint controlPoint2 = new EControlPoint(false, - segment.m_controlPoint1.getX(), - segment.m_controlPoint1.getY()); - startPoint.setControlPoint2(controlPoint2); - } // if - - retval.addContourPoint(startPoint); - - if (segment.m_controlPoint2 != null) { - controlPoint1 = new EControlPoint(true, - segment.m_controlPoint2.getX(), - segment.m_controlPoint2.getY()); - } - } // for i - - return retval; - } - - private EContourPoint m_startPoint = null; - private EContourPoint m_controlPoint1 = null; - private EContourPoint m_controlPoint2 = null; - private EContourPoint m_endPoint = null; - - private int m_type = LINE; - - - public CubicSegment(EContourPoint a_startPoint, EContourPoint a_endPoint) { - m_startPoint = a_startPoint; - m_endPoint = a_endPoint; - - if ((!a_startPoint.hasControlPoint2()) && (!a_endPoint.hasControlPoint1())) { - m_type = LINE; - return; - } // if - - if (a_startPoint.hasControlPoint2() || a_endPoint.hasControlPoint1()) { - m_type = CURVE; - - if (a_startPoint.hasControlPoint2()) { - m_controlPoint1 = (EContourPoint) a_startPoint.getControlPoint2().getContourPoint(); - } else { - m_controlPoint1 = a_startPoint; - } // if-else - - if (a_endPoint.hasControlPoint1()) { - m_controlPoint2 = (EContourPoint) a_endPoint.getControlPoint1().getContourPoint(); - } else { - m_controlPoint2 = a_endPoint; - } // if-else - } // if - } - - public CubicSegment(EContourPoint a_startPoint, EContourPoint a_controlPoint1, - EContourPoint a_controlPoint2, EContourPoint a_endPoint) { - m_startPoint = a_startPoint; - m_controlPoint1 = a_controlPoint1; - m_controlPoint2 = a_controlPoint2; - m_endPoint = a_endPoint; - m_type = CURVE; - } - - public ArrayList toQuadraticSegments() { - ArrayList retval = new ArrayList<>(); - - if (m_type == LINE) { - retval.add(new QuadraticSegment(m_startPoint, null, m_endPoint)); - return retval; - } // if - - return toQuadraticSegments(0); - } - - //JPEXS start - private static Point2D.Double movePoint(Point2D point, double dx, double dy) { - return new Point2D.Double(point.getX() + dx, point.getY() + dy); - } - - private static Point2D getMidPoint(Point2D p0, Point2D p1) { - return getPointOnSegment(p0, p1, 0.5); - } - - private static Point2D getPointOnSegment(Point2D p0, Point2D p1, double ratio) { - double x = p0.getX() + ((p1.getX() - p0.getX()) * ratio); - double y = p0.getY() + ((p1.getY() - p0.getY()) * ratio); - return new Point2D.Double(x, y); - } - private static double[][] approximateCubic(double[] cubicControlPointCoords) { - if (cubicControlPointCoords.length < 8) { - throw new IllegalArgumentException("Must have at least 8 coordinates"); - } - - //extract point objects from source array - Point2D p0 = new Point2D.Double(cubicControlPointCoords[0], cubicControlPointCoords[1]); - Point2D p1 = new Point2D.Double(cubicControlPointCoords[2], cubicControlPointCoords[3]); - Point2D p2 = new Point2D.Double(cubicControlPointCoords[4], cubicControlPointCoords[5]); - Point2D p3 = new Point2D.Double(cubicControlPointCoords[6], cubicControlPointCoords[7]); - - //calculates the useful base points - Point2D pa = getPointOnSegment(p0, p1, 3.0 / 4.0); - Point2D pb = getPointOnSegment(p3, p2, 3.0 / 4.0); - - //get 1/16 of the [P3, P0] segment - double dx = (p3.getX() - p0.getX()) / 16.0; - double dy = (p3.getY() - p0.getY()) / 16.0; - - //calculates control point 1 - Point2D pc1 = getPointOnSegment(p0, p1, 3.0 / 8.0); - - //calculates control point 2 - Point2D pc2 = getPointOnSegment(pa, pb, 3.0 / 8.0); - pc2 = movePoint(pc2, -dx, -dy); - - //calculates control point 3 - Point2D pc3 = getPointOnSegment(pb, pa, 3.0 / 8.0); - pc3 = movePoint(pc3, dx, dy); - - //calculates control point 4 - Point2D pc4 = getPointOnSegment(p3, p2, 3.0 / 8.0); - - //calculates the 3 anchor points - Point2D pa1 = getMidPoint(pc1, pc2); - Point2D pa2 = getMidPoint(pa, pb); - Point2D pa3 = getMidPoint(pc3, pc4); - - //return the points for the four quadratic curves - return new double[][]{ - {pc1.getX(), pc1.getY(), pa1.getX(), pa1.getY()}, - {pc2.getX(), pc2.getY(), pa2.getX(), pa2.getY()}, - {pc3.getX(), pc3.getY(), pa3.getX(), pa3.getY()}, - {pc4.getX(), pc4.getY(), p3.getX(), p3.getY()}}; - } - - //JPEXS end - - private ArrayList toQuadraticSegments(int a_trial) { - ArrayList retval = new ArrayList<>(); - - a_trial++; - - double[][] quadCoords =approximateCubic(new double[]{m_startPoint.getX(),m_startPoint.getY(),m_controlPoint1.getX(),m_controlPoint1.getY(),m_controlPoint2.getX(),m_controlPoint2.getY(),m_endPoint.getX(),m_endPoint.getY()}); - EContourPoint lastPoint=m_startPoint; - for (int i = 0; i < quadCoords.length; i++) { - retval.add(new QuadraticSegment( - lastPoint, - new EContourPoint(quadCoords[i][0], quadCoords[i][1], true), - new EContourPoint(quadCoords[i][2], quadCoords[i][3], false))); - lastPoint = new EContourPoint(quadCoords[i][2],quadCoords[i][3],true); - } - /*EContourPoint intersection = calculateIntersection(); - - double deltaX = 0.125 * (m_startPoint.getX() + m_endPoint.getX() + 4 * intersection.getX() - - 3 * (m_controlPoint1.getX() + m_controlPoint2.getX())); - double deltaY = 0.125 * (m_startPoint.getY() + m_endPoint.getY() + 4 * intersection.getY() - - 3 * (m_controlPoint1.getY() + m_controlPoint2.getY())); - double deltaSqr = (deltaX * deltaX + deltaY * deltaY); - - if (deltaSqr > (k_minTolerance * k_minTolerance) - || ((a_trial < k_maxTrial) && (deltaSqr > (k_tolerance * k_tolerance)))) { - return toSplitQuadraticSegments(a_trial); - } // if - - retval.add(new QuadraticSegment(m_startPoint, intersection, m_endPoint));*/ - return retval; - } - - private ArrayList toSplitQuadraticSegments(int a_trial) { - EContourPoint p01 = midPoint(m_startPoint, m_controlPoint1); - EContourPoint p12 = midPoint(m_controlPoint1, m_controlPoint2); - EContourPoint p23 = midPoint(m_controlPoint2, m_endPoint); - - EContourPoint pA = midPoint(p01, p12); - EContourPoint pB = midPoint(p12, p23); - - EContourPoint pAB = midPoint(pA, pB); - - CubicSegment firstCubicSegment = new CubicSegment(m_startPoint, p01, pA, pAB); - CubicSegment secondCubicSegment = new CubicSegment(pAB, pB, p23, m_endPoint); - - ArrayList firstHalf = firstCubicSegment.toQuadraticSegments(a_trial); - ArrayList secondHalf = secondCubicSegment.toQuadraticSegments(a_trial); - - firstHalf.addAll(secondHalf); - - return firstHalf; - } - - private EContourPoint midPoint(EContourPoint a_start, EContourPoint a_end) { - Point2D p = calculateMidPoint(a_start, a_end); - EContourPoint retval = new EContourPoint(p.getX(), p.getY(), true); - - ArrayList ppems = getPpems(a_start, a_end); - EPoint startPoint, endPoint; - for (int i = 0; i < ppems.size(); i++) { - Long ppemObject = (Long) ppems.get(i); - long ppem = ppemObject.longValue(); - - if (retval.hasHintForPpem(ppem)) { - continue; - } // if - - startPoint = a_start.getHintIfPossible(ppem); - endPoint = a_end.getHintIfPossible(ppem); - - p = calculateMidPoint(startPoint, endPoint); - EHint hint = new EHint(p.getX(), p.getY(), ppem); - retval.addHint(hint); - } // for i - - return retval; - } - - private Point2D calculateMidPoint(EPoint a_p1, EPoint a_p2) { - Point2D retval = new Point2D.Double((a_p1.getX() + a_p2.getX()) / 2.0, - (a_p1.getY() + a_p2.getY()) / 2.0); - return retval; - } - - /** - * calculate intersection of line (a_start, a_controlPoint1) and - * line (a_end, a_controlPoint2) - * @return - */ - private EContourPoint calculateIntersection() { - EContourPoint retval = new EContourPoint(m_startPoint.getX(), m_startPoint.getY(), false); - Point2D intersection = calculateIntersection(m_startPoint, m_controlPoint1, m_controlPoint2, m_endPoint); - retval.getPoint2d().setX(intersection.getX()); - retval.getPoint2d().setY(intersection.getY()); - - EPoint startPoint, controlPoint1, controlPoint2, endPoint; - ArrayList ppems = getPpems(m_startPoint, m_controlPoint1, m_controlPoint2, m_endPoint); - for (int i = 0; i < ppems.size(); i++) { - Long ppemObject = (Long) ppems.get(i); - long ppem = ppemObject.longValue(); - - if (retval.hasHintForPpem(ppem)) { - continue; - } // if - - startPoint = m_startPoint.getHintIfPossible(ppem); - controlPoint1 = m_controlPoint1.getHintIfPossible(ppem); - controlPoint2 = m_controlPoint2.getHintIfPossible(ppem); - endPoint = m_endPoint.getHintIfPossible(ppem); - - Point2D p = calculateIntersection(startPoint, controlPoint1, controlPoint2, endPoint); - EHint hint = new EHint(p.getX(), p.getY(), ppem); - retval.addHint(hint); - } // for i - - return retval; - } - - private Point2D calculateIntersection(EPoint a_p1, EPoint a_p2, EPoint a_p3, EPoint a_p4) { - Point2D retval = new Point2D.Double(a_p1.getX(), a_p1.getY()); - - double deltaX1 = a_p2.getX() - a_p1.getX(); - double deltaX2 = a_p3.getX() - a_p4.getX(); - if (deltaX1 == 0) { - deltaX1 = 0.1; - } // if - if (deltaX2 == 0) { - deltaX2 = 0.2; - } // if - - double incline1 = (a_p2.getY() - a_p1.getY()) / deltaX1; - double incline2 = (a_p3.getY() - a_p4.getY()) / deltaX2; - if (incline1 == incline2) { - return retval; - } // if - - double x = (-incline2 * a_p4.getX() + a_p4.getY() - +incline1 * a_p1.getX() - a_p1.getY()) / (incline1 - incline2); - double y = incline1 * (x - a_p1.getX()) + a_p1.getY(); - - retval.setLocation(x, y); - return retval; - } - - private ArrayList getPpems(EContourPoint a_start, EContourPoint a_end) { - ArrayList retval = new ArrayList<>(); - collectPpemsFromHints(retval, a_start.getHint()); - collectPpemsFromHints(retval, a_end.getHint()); - return retval; - } - - private void collectPpemsFromHints(ArrayList a_ppems, XHint[] a_hints) { - for (XHint hint: a_hints) { - if (!a_ppems.contains(hint.getPpem())) { - a_ppems.add(hint.getPpem()); - } // if - } // for i - } - - private ArrayList getPpems(EContourPoint a_start, EContourPoint a_controlPoint1, - EContourPoint a_controlPoint2, EContourPoint a_end) { - ArrayList retval = new ArrayList<>(); - collectPpemsFromHints(retval, a_start.getHint()); - collectPpemsFromHints(retval, a_controlPoint1.getHint()); - collectPpemsFromHints(retval, a_controlPoint2.getHint()); - collectPpemsFromHints(retval, a_end.getHint()); - return retval; - } - -} +/* + * $Id: CubicSegment.java,v 1.2 2004/12/27 04:56:02 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.adapter; + +import java.util.*; +import java.awt.geom.*; + +/** + * @author e.e + */ +public class CubicSegment { + public static final int LINE = 0; + public static final int CURVE = 1; + + /** + * converts cubic contour into cubic segments. + * @param a_contour + * @return + */ + public static ArrayList toSegments(EContour a_contour) { + ArrayList retval = new ArrayList<>(); + ArrayList points = a_contour.getContourPoints(); + if (points.size() < 2) { + return retval; + } + + EContourPoint startPoint = (EContourPoint) points.get(points.size() - 1); + for (int i = 0; i < points.size(); i++) { + EContourPoint endPoint = (EContourPoint) points.get(i); + retval.add(new CubicSegment(startPoint, endPoint)); + startPoint = endPoint; + } // for + + return retval; + } + + private EContourPoint m_startPoint = null; + private EContourPoint m_controlPoint1 = null; + private EContourPoint m_controlPoint2 = null; + private EContourPoint m_endPoint = null; + + private int m_type = LINE; + + + public CubicSegment(EContourPoint a_startPoint, EContourPoint a_endPoint) { + m_startPoint = a_startPoint; + m_endPoint = a_endPoint; + + if ((!a_startPoint.hasControlPoint2()) && (!a_endPoint.hasControlPoint1())) { + m_type = LINE; + return; + } + + if (a_startPoint.hasControlPoint2() || a_endPoint.hasControlPoint1()) { + m_type = CURVE; + + if (a_startPoint.hasControlPoint2()) { + m_controlPoint1 = a_startPoint.getControlPoint2().getContourPoint(); + } else { + m_controlPoint1 = a_startPoint; + } + + if (a_endPoint.hasControlPoint1()) { + m_controlPoint2 = a_endPoint.getControlPoint1().getContourPoint(); + } else { + m_controlPoint1 = a_endPoint; + } + } + } + + public CubicSegment(EContourPoint a_startPoint, EContourPoint a_controlPoint1, + EContourPoint a_controlPoint2, EContourPoint a_endPoint) { + m_startPoint = a_startPoint; + m_controlPoint1 = a_controlPoint1; + m_controlPoint2 = a_controlPoint2; + m_endPoint = a_endPoint; + m_type = CURVE; + } + + public ArrayList toQuadraticSegments() { + ArrayList retval = new ArrayList<>(); + + if (m_type == LINE) { + retval.add(new QuadraticSegment(m_startPoint, null, m_endPoint)); + return retval; + } + + return toQuadraticSegments(0); + } + + //JPEXS start + private static Point2D.Double movePoint(Point2D point, double dx, double dy) { + return new Point2D.Double(point.getX() + dx, point.getY() + dy); + } + + private static Point2D getMidPoint(Point2D p0, Point2D p1) { + return getPointOnSegment(p0, p1, 0.5); + } + + private static Point2D getPointOnSegment(Point2D p0, Point2D p1, double ratio) { + double x = p0.getX() + ((p1.getX() - p0.getX()) * ratio); + double y = p0.getY() + ((p1.getY() - p0.getY()) * ratio); + return new Point2D.Double(x, y); + } + private static double[][] approximateCubic(double[] cubicControlPointCoords) { + if (cubicControlPointCoords.length < 8) { + throw new IllegalArgumentException("Must have at least 8 coordinates"); + } + + //extract point objects from source array + Point2D p0 = new Point2D.Double(cubicControlPointCoords[0], cubicControlPointCoords[1]); + Point2D p1 = new Point2D.Double(cubicControlPointCoords[2], cubicControlPointCoords[3]); + Point2D p2 = new Point2D.Double(cubicControlPointCoords[4], cubicControlPointCoords[5]); + Point2D p3 = new Point2D.Double(cubicControlPointCoords[6], cubicControlPointCoords[7]); + + //calculates the useful base points + Point2D pa = getPointOnSegment(p0, p1, 3.0 / 4.0); + Point2D pb = getPointOnSegment(p3, p2, 3.0 / 4.0); + + //get 1/16 of the [P3, P0] segment + double dx = (p3.getX() - p0.getX()) / 16.0; + double dy = (p3.getY() - p0.getY()) / 16.0; + + //calculates control point 1 + Point2D pc1 = getPointOnSegment(p0, p1, 3.0 / 8.0); + + //calculates control point 2 + Point2D pc2 = getPointOnSegment(pa, pb, 3.0 / 8.0); + pc2 = movePoint(pc2, -dx, -dy); + + //calculates control point 3 + Point2D pc3 = getPointOnSegment(pb, pa, 3.0 / 8.0); + pc3 = movePoint(pc3, dx, dy); + + //calculates control point 4 + Point2D pc4 = getPointOnSegment(p3, p2, 3.0 / 8.0); + + //calculates the 3 anchor points + Point2D pa1 = getMidPoint(pc1, pc2); + Point2D pa2 = getMidPoint(pa, pb); + Point2D pa3 = getMidPoint(pc3, pc4); + + //return the points for the four quadratic curves + return new double[][]{ + {pc1.getX(), pc1.getY(), pa1.getX(), pa1.getY()}, + {pc2.getX(), pc2.getY(), pa2.getX(), pa2.getY()}, + {pc3.getX(), pc3.getY(), pa3.getX(), pa3.getY()}, + {pc4.getX(), pc4.getY(), p3.getX(), p3.getY()}}; + } + + //JPEXS end + + private ArrayList toQuadraticSegments(int a_trial) { + ArrayList retval = new ArrayList<>(); + + double[][] quadCoords =approximateCubic(new double[]{m_startPoint.getX(),m_startPoint.getY(),m_controlPoint1.getX(),m_controlPoint1.getY(),m_controlPoint2.getX(),m_controlPoint2.getY(),m_endPoint.getX(),m_endPoint.getY()}); + EContourPoint lastPoint=m_startPoint; + for (int i = 0; i < quadCoords.length; i++) { + retval.add(new QuadraticSegment( + lastPoint, + new EContourPoint(quadCoords[i][0], quadCoords[i][1], true), + new EContourPoint(quadCoords[i][2], quadCoords[i][3], false))); + lastPoint = new EContourPoint(quadCoords[i][2],quadCoords[i][3],true); + } + return retval; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EContour.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EContour.java index 793b5d894..6e2c1b84a 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EContour.java +++ b/libsrc/ttf/src/org/doubletype/ossa/adapter/EContour.java @@ -1,243 +1,86 @@ -/* - * $Id: EContour.java,v 1.11 2004/12/17 04:13:17 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.*; -import java.awt.geom.*; -import java.util.ArrayList; - -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.*; -import org.doubletype.ossa.module.Rectangle; - -/** - * @author e.e - */ -public class EContour extends XContour implements GlyphObject, PointAggregate { - public static final String k_quadratic = "quadratic"; - public static final String k_cubic = "cubic"; - public static final int k_defaultPixelSize = 16; - - public static EContour createAt(Point2D a_point) { - EContour retval = new EContour(); - retval.setType(k_cubic); - - EContourPoint point; - double x, y; - - x = a_point.getX(); - y = a_point.getY(); - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - - x += Rectangle.k_defaultPen; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - y += Rectangle.k_defaultPen; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - x -= Rectangle.k_defaultPen; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - return retval; - } - - // -------------------------------------------------------------- - - public EContour() { - initDefaults(); - } - - public EContour(RStack a_stack) { - super(a_stack); - initDefaults(); - } - - /** set default values - */ - private void initDefaults() { - if (getType() == null) { - setType(k_quadratic); - } // if - } - - public boolean isCubic() { - return getType().equals(k_cubic); - } - - public EContour transpose(AffineTransform a_trans) { - EContour retval = new EContour(); - retval.setType(this.getType()); - - XContourPoint[] points = getContourPoint(); - int i; - for (i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - retval.addContourPoint(point.transpose(a_trans)); - } // if - - return retval; - } - - // -------------------------------------------------------------- - - public void display(Graphics2D g, AffineTransform a_trans) { - g.setColor(GlyphColor.CONTOUR); - - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } // if - - int ppem =EContour.k_defaultPixelSize; - g.draw(toShape(a_trans, ppem)); - } - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - return transpose(a_trans).toShape(a_ppem); - } - - private Shape toShape(int a_ppem) { - Emulator emulator = Emulator.getInstance(); - - return emulator.createShape(this, a_ppem); - } - - public void move(Point2D a_delta) { - movePoints(getContourPoint(), a_delta); - } - - private void movePoints(XContourPoint [] a_points, Point2D a_delta) { - int i; - for (i = 0; i < a_points.length; i++) { - EContourPoint point = (EContourPoint) a_points[i]; - EObject.movePoint(point, a_delta); - } // for i - } - - public void remove() { - XBody parent = (XBody) rGetParentRNode(); - parent.removeContour(this); - } - - // PointAggregate - public void removePoint(EContourPoint a_point) { - removeContourPoint(a_point); - - if (getContourPoint().length < 2) { - remove(); - } // if - } - - // PointAggregate - public void movePoint(EContourPoint a_point, Point2D a_delta) { - EObject.movePoint(a_point, a_delta); - } - - // PointAggregate - public GlyphObject insertPoint(EContourPoint a_point) { - int i; - int len = getContourPoint().length; - - for (i = 0; i < len; i++) { - if (getContourPoint(i) == a_point) { - break; - } // if - } // for - - EContourPoint nextPoint; - nextPoint = (EContourPoint) getContourPoint((i + 1) % len); - - double x = (a_point.getX() + nextPoint.getX()) / 2; - double y = (a_point.getY() + nextPoint.getY()) / 2; - - EContourPoint retval = new EContourPoint(x, y, true); - addContourPoint(i + 1, retval); - - return retval; - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, a_trans); - } - - public void convert() { - XBody parent = (XBody) rGetParentRNode(); - - if (isCubic()) { - parent.addContour(toQuadratic()); - } else { - parent.addContour(toCubic()); - } // else - - remove(); - } - - public EContour toQuadratic() { - if (!isCubic()) { - return this; - } // if - - ArrayList quadraticSegments = new ArrayList<>(); - for (CubicSegment segment: CubicSegment.toSegments(this)) { - quadraticSegments.addAll(segment.toQuadraticSegments()); - } // for i - - return QuadraticSegment.toContour(quadraticSegments); - } - - public EContour toCubic() { - if (isCubic()) { - return this; - } // if - - ArrayList quadraticSegments = QuadraticSegment.toSegments(this); - ArrayList cubicSegments = new ArrayList<>(); - for (int i = 0; i < quadraticSegments.size(); i++) { - QuadraticSegment quadraticSegment = (QuadraticSegment) quadraticSegments.get(i); - cubicSegments.add(quadraticSegment.toCubicSegment()); - } // for i - - return CubicSegment.toContour(cubicSegments); - } -} +/* + * $Id: EContour.java,v 1.11 2004/12/17 04:13:17 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.adapter; + +import java.util.ArrayList; + +/** + * @author e.e + */ +public class EContour { + public static final String k_quadratic = "quadratic"; + public static final String k_cubic = "cubic"; + + private String type; + private ArrayList m_contourPoints = new ArrayList<>(); + + // -------------------------------------------------------------- + + public EContour() { + setType(k_quadratic); + } + + public boolean isCubic() { + return type.equals(k_cubic); + } + + public void setType(String a_type) { + type = a_type; + } + + public void addContourPoint(EContourPoint a_point) { + m_contourPoints.add(a_point); + } + + public ArrayList getContourPoints() { + return m_contourPoints; + } + + // -------------------------------------------------------------- + + public EContour toQuadratic() { + if (!isCubic()) { + return this; + } + + ArrayList quadraticSegments = new ArrayList<>(); + for (CubicSegment segment: CubicSegment.toSegments(this)) { + quadraticSegments.addAll(segment.toQuadraticSegments()); + } + + return QuadraticSegment.toContour(quadraticSegments); + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EContourPoint.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EContourPoint.java index e28994177..07563d1a1 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EContourPoint.java +++ b/libsrc/ttf/src/org/doubletype/ossa/adapter/EContourPoint.java @@ -1,419 +1,100 @@ -/* - * $Id: EContourPoint.java,v 1.10 2004/12/27 04:56:02 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import org.doubletype.ossa.*; -import org.doubletype.ossa.xml.*; -import java.awt.*; -import java.awt.geom.*; - -/** - * @author e.e - */ -public class EContourPoint extends XContourPoint implements GlyphObject, EPoint { - public static String k_on = "on"; - public static String k_off = "off"; - public static String k_true = "true"; - public static String k_false = "false"; - - private int m_number = 0; - - /** offset of this from the global coord. - * For contours, it will be 0. - * For module invoke, it will be pos.x. - */ - private double m_xOffset = 0; - private double m_yOffset = 0; - - private Point2D m_adjusted; - - public EContourPoint() { - super(); - } - - public EContourPoint(RStack a_stack) { - super(a_stack); - correctControlPoint(); - } - - public EContourPoint(double a_x, double a_y, boolean a_isOn) { - setPoint2d(new XPoint2d()); - getPoint2d().setX(a_x); - getPoint2d().setY(a_y); - - setOn(a_isOn); - } - - /** Move the second control point if it was incorrectly set to the first one. - * - */ - private void correctControlPoint() { - if (!hasControlPoint1()) { - return; - } // if - - EControlPoint controlPoint = (EControlPoint) getControlPoint1(); - if (controlPoint.isFirst()) { - return; - } // if - - setControlPoint2(controlPoint); - setControlPoint1(null); - } - - public EContourPoint transpose(AffineTransform a_trans) { - EContourPoint retval = new EContourPoint(); - - retval.setPoint2d(EObject.createTransform(getPoint2d(), a_trans)); - retval.setOn(isOn()); - retval.setRounded(isRounded()); - - if (hasControlPoint1()) { - EControlPoint controlPoint = (EControlPoint) getControlPoint1(); - retval.setControlPoint1(controlPoint.transpose(a_trans)); - } // if - if (hasControlPoint2()) { - EControlPoint controlPoint = (EControlPoint) getControlPoint2(); - retval.setControlPoint2(controlPoint.transpose(a_trans)); - } // if - - int i; - XHint [] hints = getHint(); - for (i = 0; i < hints.length; i++) { - EHint hint = (EHint) hints[i]; - retval.addHint(hint.createTransform(a_trans)); - } // for i - - return retval; - } - - public void setNumber(int a_number) { - m_number = a_number; - } - - public void setOffset(double a_x, double a_y) { - m_xOffset = a_x; - m_yOffset = a_y; - } - - private AffineTransform buildOffsetTrans(AffineTransform a_trans) { - if (m_xOffset == 0 && m_yOffset == 0) { - return a_trans; - } // if - - AffineTransform retval = (AffineTransform) a_trans.clone(); - retval.translate(m_xOffset, m_yOffset); - - return retval; - } - public static final int k_defaultPixelSize = 16; - - public void display(Graphics2D g, AffineTransform a_trans) { - AffineTransform trans = buildOffsetTrans(a_trans); - - int ppem = k_defaultPixelSize; - Shape rect = toShape(trans, ppem); - g.setColor(GlyphColor.POINT); - if (isRounded()) { - g.setColor(GlyphColor.GRAY); - } // if - - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } // if - - if (isOn()) - g.fill(rect); - else - g.draw(rect); - } - - - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - public void resetAdjusted() { - setAdjusted(getX(), getY()); - } - - public void roundAdjusted(int a_ppem) { - if (!isRounded()) { - return; - } // if - - setAdjusted(round(getX(), a_ppem), - round(getY(), a_ppem)); - } - - public void hintAdjusted(int a_ppem) { - if (!hasHintForPpem(a_ppem)) { - return; - } // if - - EHint hint = getHintForPpem(a_ppem); - setAdjusted(hint.getX(), hint.getY()); - } - - public void setAdjusted(double a_x, double a_y) { - m_adjusted = new Point2D.Double(a_x, a_y); - } - - public Point2D getAdjusted() { - return m_adjusted; - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - return EObject.toShape(getPoint2d(), a_trans); - } - - public double getX() { - return getPoint2d().getX(); - } - - public double getY() { - return getPoint2d().getY(); - } - - public boolean isOn() { - return getType().equals(k_on); - } - - public boolean isRounded() { - return getRounded(); - } - - public void toggleRounded() { - if (hasHintForCurrentPpem()) { - return; - } // if - - setRounded(!isRounded()); - } - - public Point2D toPoint2D() { - return new Point2D.Double(getX(), getY()); - } - - public boolean hasHint() { - return (getHint().length > 0); - } - - public boolean hasHintForCurrentPpem() { - return hasHintForPpem(EContour.k_defaultPixelSize); - } - - public boolean hasHintForPpem(long a_ppem) { - return getHintForPpem(a_ppem) != null; - } - - public EPoint getHintIfPossible(long a_ppem) { - if (hasHintForPpem(a_ppem)) { - return getHintForPpem(a_ppem); - } // if - - return this; - } - - public EHint getCurrentHint() { - return getHintForPpem(EContour.k_defaultPixelSize); - } - - public EHint getHintForPpem(long a_ppem) { - int i; - XHint[] hints = getHint(); - for (i = 0; i < hints.length; i++) { - EHint hint = (EHint) hints[i]; - if (hint.getPpem() == a_ppem) { - return hint; - } // if - } // for i - - return null; - } - - public EHint addHint(int a_ppem) { - if (hasHintForPpem(a_ppem)) { - return getHintForPpem(a_ppem); - } // if - - EHint retval = new EHint(getX() + Engine.getEm() / a_ppem, getY(), a_ppem); - addHint(retval); - return retval; - } - - public GlyphObject add() { - return getParent().insertPoint(this); - } - - public void remove() { - getParent().removePoint(this); - } - - public PointAggregate getParent() { - if (rGetParentRNode() instanceof EControlPoint) { - EControlPoint controlPoint = (EControlPoint) rGetParentRNode(); - return controlPoint.getParent().getParent(); - } - - if (rGetParentRNode() instanceof PointAggregate) { - return (PointAggregate) rGetParentRNode(); - } // if - - return (PointAggregate) rGetParentRNode(); - } - - public XContourPoint cloneAt(Point2D a_point) { - EContourPoint retval = (EContourPoint) clone(); - Point2D delta = new Point2D.Double(a_point.getX() - this.getX(), a_point.getY() - this.getY()); - EObject.movePoint(retval, delta); - return retval; - } - - /** Moves point by the specified delta. A GlyphObject method. - * Delegates the implementation to the host since a point - * moves differently depending on the host. - * For example the first point hosted by a module invoke would - * always be (0, 0) so the invoke position would move instead. - */ - public void move(Point2D a_delta) { - PointAggregate parent = (PointAggregate) rGetParentRNode(); - parent.movePoint(this, a_delta); - } - - public void toggleOnCurve() { - if (isControlPoint()) { - return; - } // if - - if (getParent() instanceof EContour) { - EContour contour = (EContour) getParent(); - if (contour.isCubic()) { - toggleCubicControlPoint(); - return; - } // if - } // if - - setOn(!isOn()); - } - - public boolean isControlPoint() { - return (getParent() instanceof EContourPoint); - } - - private void toggleCubicControlPoint() { - if (hasControlPoint1() || hasControlPoint2()) { - setControlPoint1(null); - setControlPoint2(null); - } else { - setControlPoint1(new EControlPoint(true, getX() + 100, getY())); - setControlPoint2(new EControlPoint(false, getX() - 100, getY())); - } // if - } - - public boolean hasControlPoint1() { - return (getControlPoint1() != null); - } - - public boolean hasControlPoint2() { - return (getControlPoint2() != null); - } - - public void setOn(boolean a_isOnCurve) { - if (a_isOnCurve) { - setType(k_on); - } else { - setType(k_off); - } // if - } - - public boolean hitHint(Rectangle2D a_rect, AffineTransform a_trans) { - int ppem = EContour.k_defaultPixelSize; - if (!hasHintForPpem(ppem)) - return false; - - EHint hint = getHintForPpem(ppem); - - Shape hitArea = hint.toShape(a_trans, ppem); - if (!hitArea.intersects(a_rect)) { - return false; - } // if - - EObject.getActives().addActive(hint); - return true; - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, buildOffsetTrans(a_trans)); - } - - /** Round the value after converting to pixel coordinate system. - */ - private double round(double a_value, long a_ppem) { - double em = Engine.getEm(); - double funitInGrid = em / a_ppem; - - double pixelValue = a_value / funitInGrid; - return funitInGrid * roundSymetric(pixelValue); - } - - /** round symetrically about zero. - * Math.round(0.5) returns 1. Math.round(-0.5) returns 0, - * since it's Math.floor(a_value + -0.5). - * -0.5 should round to -1 if it's symetric about zero. - * @param a_value number to be rounded. - * @return round value. - */ - private int roundSymetric(double a_value) { - if (a_value < 0) { - int retval = (int) Math.round(-a_value); - return -retval; - } else { - return (int) Math.round(a_value); - } // if-else - } - - public void removeControlPoint(EControlPoint a_point) { - if (hasControlPoint1() && (getControlPoint1() == a_point)) { - setControlPoint1(null); - } // if - - if (hasControlPoint2() && (getControlPoint2() == a_point)) { - setControlPoint2(null); - } // if - } +/* + * $Id: EContourPoint.java,v 1.10 2004/12/27 04:56:02 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.adapter; + +/** + * @author e.e + */ +public class EContourPoint implements EPoint { + private boolean isOn; + private double x; + private double y; + private EControlPoint controlPoint1; + private EControlPoint controlPoint2; + + public EContourPoint() { + super(); + } + + public EContourPoint(double a_x, double a_y, boolean a_isOn) { + x = a_x; + y = a_y; + + setOn(a_isOn); + } + + public static final int k_defaultPixelSize = 16; + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public EControlPoint getControlPoint1() { + return controlPoint1; + } + + public EControlPoint getControlPoint2() { + return controlPoint2; + } + + public void setControlPoint1(EControlPoint a_point) { + controlPoint1 = a_point; + } + + public void setControlPoint2(EControlPoint a_point) { + controlPoint2 = a_point; + } + + public boolean hasControlPoint1() { + return getControlPoint1() != null; + } + + public boolean hasControlPoint2() { + return getControlPoint2() != null; + } + + public boolean isOn() { + return isOn; + } + + public void setOn(boolean a_isOnCurve) { + isOn = a_isOnCurve; + } } \ No newline at end of file diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EControlPoint.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EControlPoint.java index 70ed77625..d4c3e59f2 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EControlPoint.java +++ b/libsrc/ttf/src/org/doubletype/ossa/adapter/EControlPoint.java @@ -1,244 +1,67 @@ -/* - * $Id: EControlPoint.java,v 1.6 2004/12/27 04:56:02 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; - -import org.doubletype.ossa.GlyphColor; -import org.doubletype.ossa.xml.*; - -/** - * @author e.e - */ -public class EControlPoint extends XControlPoint implements GlyphObject, EPoint { - private static final String k_true = "true"; - - private double m_xOffset = 0; - private double m_yOffset = 0; - - public EControlPoint(boolean a_isFirst, double a_x, double a_y) { - setSmooth(true); - setFirst(a_isFirst); - setContourPoint(new EContourPoint(a_x, a_y, false)); - } - - /** - * - */ - public EControlPoint() { - super(); - } - - /** - * @param stack - */ - public EControlPoint(RStack stack) { - super(stack); - } - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - /** toggle smooth-ness - */ - public void convert() { - EContourPoint parent = getParent(); - boolean value = !getSmooth(); - parent.getControlPoint1().setSmooth(value); - parent.getControlPoint2().setSmooth(value); - move(new Point2D.Double(0, 0)); - } - - public boolean isFirst() { - return getFirst(); - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, buildOffsetTrans(a_trans)); - } - - public void setOffset(double a_x, double a_y) { - m_xOffset = a_x; - m_yOffset = a_y; - } - - private AffineTransform buildOffsetTrans(AffineTransform a_trans) { - if (m_xOffset == 0 && m_yOffset == 0) { - return a_trans; - } // if - - AffineTransform retval = (AffineTransform) a_trans.clone(); - retval.translate(m_xOffset, m_yOffset); - - return retval; - } - - public void remove() { - getParent().removeControlPoint(this); - } - - public EContourPoint getParent() { - return (EContourPoint) rGetParentRNode(); - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - return EObject.toShape(getContourPoint().getPoint2d(), a_trans); - } - - public void move(Point2D a_delta) { - // if the parent is active, she will move this. - if (getParent().isSelected()) { - return; - } // if - - EObject.movePoint((EContourPoint) getContourPoint(), a_delta); - - if (isSmooth() && hasSibling()) { - smoothSibling(); - } // if - } - - public void rotateTo45() { - double theta = getTheta() + Math.PI / 8; - theta = Math.PI / 4 * Math.floor(theta / (Math.PI / 4)); - - rotateToTheta(theta); - if (isSmooth() && hasSibling()) { - smoothSibling(); - } // if - } - - private void smoothSibling() { - getSibling().rotateToTheta(getTheta() + Math.PI); - } - - private double getTheta() { - EContourPoint parent = getParent(); - return Math.atan2(getY() - parent.getY(), - getX() - parent.getX()); - } - - private void rotateToTheta(double a_theta) { - EContourPoint parent = getParent(); - double d = parent.toPoint2D().distance(toPoint2D()); - double x = parent.getX() + Math.cos(a_theta) * d; - double y = parent.getY() + Math.sin(a_theta) * d; - Point2D delta = new Point2D.Double(x - getX(), y - getY()); - EObject.movePoint((EContourPoint) getContourPoint(), delta); - } - - public Point2D toPoint2D() { - EContourPoint point = (EContourPoint) getContourPoint(); - return point.toPoint2D(); - } - - public boolean isSmooth() { - return getSmooth(); - } - - public boolean hasSibling() { - EContourPoint parent = getParent(); - if (parent.getControlPoint1() == this) { - return parent.hasControlPoint2(); - } else { - return parent.hasControlPoint1(); - } // if - } - - public EControlPoint getSibling() { - EContourPoint parent = getParent(); - if (parent.getControlPoint1() == this) { - return (EControlPoint) parent.getControlPoint2(); - } else { - return (EControlPoint) parent.getControlPoint1(); - } // if - } - - public void display(Graphics2D g, AffineTransform a_trans) { - AffineTransform trans = buildOffsetTrans(a_trans); - displayLine(g, trans); - - Shape rect = toShape(trans, EContour.k_defaultPixelSize); - g.setColor(GlyphColor.POINT); - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } // if - - g.draw(rect); - } - - private void displayLine(Graphics2D g, AffineTransform a_trans) { - EContourPoint parent = getParent(); - Line2D line = new Line2D.Double(parent.getX(), - parent.getY(), - getX(), - getY()); - AffineTransform oldTrans = g.getTransform(); - - g.transform(a_trans); - g.setColor(Color.BLACK); - g.draw(line); - g.setTransform(oldTrans); - } - - public EControlPoint transpose(AffineTransform a_trans) { - EControlPoint retval = new EControlPoint(); - EContourPoint point = (EContourPoint) getContourPoint(); - retval.setContourPoint(point.transpose(a_trans)); - retval.setSmooth(getSmooth()); - - return retval; - } - - - public double getX() { - EContourPoint point = (EContourPoint) getContourPoint(); - return point.getX(); - } - - public double getY() { - EContourPoint point = (EContourPoint) getContourPoint(); - return point.getY(); - } -} - +/* + * $Id: EControlPoint.java,v 1.6 2004/12/27 04:56:02 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.adapter; + +import java.awt.Shape; +import java.awt.geom.AffineTransform; + +/** + * @author e.e + */ +public class EControlPoint implements EPoint { + + private EContourPoint contourPoint; + + /** + * + */ + public EControlPoint(double x, double y) { + contourPoint = new EContourPoint(x, y, false); + } + + public double getX() { + return contourPoint.getX(); + } + + public double getY() { + return contourPoint.getY(); + } + + public EContourPoint getContourPoint() { + return contourPoint; + } +} + diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EGlyphFactory.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EGlyphFactory.java deleted file mode 100644 index 4575f06e8..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EGlyphFactory.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * $Id: EGlyphFactory.java,v 1.3 2004/11/10 01:49:49 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import org.doubletype.ossa.xml.*; - -/** - * @author e.e - */ -public class EGlyphFactory extends DefaultGlyphFactory { - public static IGlyphFactory s_factory = null; - - public static IGlyphFactory getFactory() { - if (s_factory == null) { - s_factory = new EGlyphFactory(); - } // if - - return s_factory; - } - - public EGlyphFactory() { - } - - public XModule createXModule() { - return new EModuleInvoke(); - } - - public Class getXModuleClass() { - return (EModuleInvoke.class); - } - - public XContour createXContour() { - return new EContour(); - } - - public Class getXContourClass() { - return (EContour.class); - } - - public XInclude createXInclude() { - return new EIncludeInvoke(); - } - - public Class getXIncludeClass() { - return (EIncludeInvoke.class); - } - - public XHint createXHint() { - return new EHint(); - } - - public Class getXHintClass() { - return (EHint.class); - } - - public XContourPoint createXContourPoint() { - return new EContourPoint(); - } - - public XContourPoint createXContourPoint(RStack a_stack) { - return new EContourPoint(a_stack); - } - - public Class getXContourPointClass() { - return (EContourPoint.class); - } - - public XControlPoint createXControlPoint() { - return new EControlPoint(); - } - - - public Class getXControlPointClass() { - return (EControlPoint.class); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EHint.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EHint.java deleted file mode 100644 index fedad33ca..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EHint.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * $Id: EHint.java,v 1.4 2004/12/27 04:56:03 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.*; -import java.awt.geom.*; - -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.*; - -/** - * @author e.e - */ -public class EHint extends XHint implements GlyphObject, EPoint { - /** offset of this from the global coord. - * For contours, it will be 0. - * For module invoke, it will be pos.x. - * @see EContourPoint - */ - private double m_xOffset = 0; - private double m_yOffset = 0; - - public EHint() { - } - - public EHint(double a_x, double a_y, long a_ppem) { - XPoint2d point = new XPoint2d(); - point.setX(a_x); - point.setY(a_y); - - setPoint2d(point); - setPpem(a_ppem); - } - - public void setOffset(double a_x, double a_y) { - m_xOffset = a_x; - m_yOffset = a_y; - } - - private AffineTransform buildOffsetTrans(AffineTransform a_trans) { - if (m_xOffset == 0 && m_yOffset == 0) { - return a_trans; - } // if - - AffineTransform retval = (AffineTransform) a_trans.clone(); - retval.translate(m_xOffset, m_yOffset); - - return retval; - } - - public void display(Graphics2D g, AffineTransform a_trans) { - AffineTransform trans = buildOffsetTrans(a_trans); - - EContourPoint point = (EContourPoint) rGetParentRNode(); - - Shape rect = toShape(trans, EContour.k_defaultPixelSize); - Line2D line = new Line2D.Double(point.getX(), - point.getY(), - getX(), - getY()); - - AffineTransform oldTrans = g.getTransform(); - - g.transform(trans); - g.setColor(Color.BLACK); - g.draw(line); - g.setTransform(oldTrans); - - g.setColor(GlyphColor.HINT); - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } // if - - if (point.isOn()) - g.fill(rect); - else - g.draw(rect); - } - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - return EObject.toShape(getPoint2d(), a_trans); - } - - public double getX() { - return getPoint2d().getX(); - } - - public double getY() { - return getPoint2d().getY(); - } - - public Point2D toPoint2D() { - return new Point2D.Double(getX(), getY()); - } - - /** - * @see org.doubletype.ossa.adapter.DObject#move(java.awt.geom.Point2D) - */ - public void move(Point2D a_delta) { - EObject.movePoint(getPoint2d(), a_delta); - - double gridWidth = ((double) Engine.getEm()) / getPpem(); - EContourPoint point = (EContourPoint) rGetParentRNode(); - - XPoint2d posHint = getPoint2d(); - XPoint2d posPoint = point.getPoint2d(); - double xDelta = posHint.getX() - posPoint.getX(); - double yDelta = posHint.getY() - posPoint.getY(); - - xDelta = correctDelta(xDelta, gridWidth); - yDelta = correctDelta(yDelta, gridWidth); - - posHint.setX(posPoint.getX() + xDelta); - posHint.setY(posPoint.getY() + yDelta); - } - - private double correctDelta(double a_delta, double a_width) { - double retval = a_delta; - - if (retval > a_width) { - retval = a_width; - } // if - - if (retval < -a_width) { - retval = -a_width; - } // if - - return retval; - } - - /** - * @see org.doubletype.ossa.adapter.DObject#remove() - */ - public void remove() { - getParent().removeHint(this); - } - - public EContourPoint getParent() { - return (EContourPoint) rGetParentRNode(); - } - - public PointAggregate getPointHost() { - return getParent().getParent(); - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, buildOffsetTrans(a_trans)); - } - - public EHint createTransform(AffineTransform a_trans) { - EHint retval = new EHint(); - - retval.setPpem(getPpem()); - retval.setPoint2d(EObject.createTransform(getPoint2d(), a_trans)); - - return retval; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EIncludeInvoke.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EIncludeInvoke.java deleted file mode 100644 index 2210d11d0..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EIncludeInvoke.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * $Id: EIncludeInvoke.java,v 1.1 2004/09/04 21:54:07 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.*; -import java.awt.geom.*; -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.*; -import org.doubletype.ossa.module.*; -import java.util.*; - -/** - * @author e.e - */ -public class EIncludeInvoke extends XInclude implements VarStackFrame, GlyphObject { - public static EIncludeInvoke create(String a_fileName) { - EIncludeInvoke retval = new EIncludeInvoke(); - retval.setHref(a_fileName); - retval.setInvoke(EObject.createInvoke(new Point2D.Double())); - - return retval; - } - - /** environment with invoke args. */ - private Hashtable m_augmented = new Hashtable<>(); - private VarStack m_stack = VarStack.getSingletonInstance(); - - public EIncludeInvoke() { - } - - public EIncludeInvoke(RStack a_stack) { - setup(a_stack); - } - - public void display(Graphics2D g, AffineTransform a_trans) { - g.setColor(GlyphColor.INCLUDE); - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } // if - - g.draw(toShape(a_trans,EContour.k_defaultPixelSize)); - } - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - Shape retval; - - ModuleManager manager = ModuleManager.getSingletonInstance(); - GlyphFile file = manager.getGlyphFile(getHref()); - - XPoint2d pos = getInvoke().getInvokePos().getPoint2d(); - - AffineTransform trans = new AffineTransform(); - trans.setTransform(a_trans); - trans.translate(pos.getX(), pos.getY()); - - m_stack.push(this); - retval = file.toShape(trans); - m_stack.pop(); - - return retval; - } - - public GlyphModule getModule() { - ModuleManager manager = ModuleManager.getSingletonInstance(); - return manager.getGlyphFile(getHref()); - } - - // for var stack frame - public boolean hasVariable(String a_name) { - return m_augmented.containsKey(a_name); - } - - // for var stack frame. - public double getValue(String a_name) { - Double d = (Double) m_augmented.get(a_name); - return d.doubleValue(); - } - - // for var stack frame. - public void beforePush() { - getModule().beforePush(); - loadInvoke(getInvoke()); - } - - public void remove() { - XBody parent = (XBody) rGetParentRNode(); - parent.removeInclude(this); - } - - public void move(Point2D a_delta) { - XPoint2d point = getInvoke().getInvokePos().getPoint2d(); - EObject.movePoint(point, a_delta); - } - - /** - * loads invoke arguments into this module to build augmented environment. - * @param a_invoke - */ - private void loadInvoke(XInvoke a_invoke) { - copyVarsToAug(); - - int i; - XInvokeVarg [] vargs = a_invoke.getInvokeVarg(); - for (i = 0; i < vargs.length; i++) { - loadVarg(vargs[i]); - } // for i - } - - private void loadVarg(XInvokeVarg a_varg) { - String name = a_varg.getName(); - String src = a_varg.getSrc(); - GlyphModule module = getModule(); - - if (!module.hasVariable(name)) { - return; - } // if - - double value = m_stack.get(src); - m_augmented.put(name, new Double(value)); - } - - private void copyVarsToAug() { - m_augmented.clear(); - m_augmented.putAll(getModule().getVars()); - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, a_trans); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EModuleInvoke.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EModuleInvoke.java deleted file mode 100644 index 25962b6c5..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EModuleInvoke.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * $Id: EModuleInvoke.java,v 1.4 2004/11/08 06:29:51 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import org.doubletype.ossa.*; -import org.doubletype.ossa.module.*; -import org.doubletype.ossa.xml.*; -import java.awt.geom.*; -import java.awt.*; -import java.util.*; - -/** - * @author e.e - */ -public class EModuleInvoke extends XModule implements VarStackFrame, GlyphObject, PointAggregate { - public static EModuleInvoke create() { - return createAt(new Point2D.Double(0, 254.0)); - } - - public static EModuleInvoke createAt(Point2D a_point) { - EModuleInvoke retval = new EModuleInvoke(); - - retval.setName(org.doubletype.ossa.module.Rectangle.class.getName()); - retval.setInvoke(EObject.createInvoke(a_point)); - - double x, y; - XContourPoint point; - - x = 0.0; - y = 0.0; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - - x += 426.0; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - y -= 254.0; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - x -= 426.0; - point = new EContourPoint(x, y, true); - retval.addContourPoint(point); - - return retval; - } - - - /** environment with invoke args. */ - private Hashtable m_augmented = new Hashtable<>(); - private VarStack m_stack = VarStack.getSingletonInstance(); - - // -------------------------------------------------------------- - - public EModuleInvoke() { - } - - public EModuleInvoke(RStack a_stack) { - setup(a_stack); - } - - // -------------------------------------------------------------- - - public void display(Graphics2D g, AffineTransform a_trans) { - if (isSelected()) { - g.setColor(GlyphColor.SELECTED); - } else { - g.setColor(GlyphColor.MODULE); - } // if - - g.draw(toShape(a_trans, EContour.k_defaultPixelSize)); - } - - public boolean isSelected() { - return EObject.getActives().isSelected(this); - } - - public Shape toShape(AffineTransform a_trans, int a_ppem) { - EContour contour = toContour(a_trans); - return contour.toShape(new AffineTransform(), a_ppem); - } - - // -------------------------------------------------------------- - - public EContour toContour(AffineTransform a_trans) { - EContour retval; - - GlyphModule module = getModule(); - - m_stack.push(this); - EContour untransContour = module.toContour(this); - m_stack.pop(); - - XPoint2d pos = getInvoke().getInvokePos().getPoint2d(); - AffineTransform trans = (AffineTransform) a_trans.clone(); - trans.translate(pos.getX(), pos.getY()); - - retval = untransContour.transpose(trans); - - return retval; - } - - public GlyphModule getModule() { - return getModuleForName(getName()); - } - - private GlyphModule getModuleForName(String a_name) { - GlyphModule retval = null; - - try { - ModuleManager manager = ModuleManager.getSingletonInstance(); - retval = manager.getModule(a_name); - } catch (Exception e) { - e.printStackTrace(); - } // try-catch - - return retval; - } - - public void remove() { - XBody parent = (XBody) rGetParentRNode(); - parent.removeModule(this); - } - - public void move(Point2D a_delta) { - XPoint2d point = getInvoke().getInvokePos().getPoint2d(); - EObject.movePoint(point, a_delta); - } - - // PointAggregate - public void removePoint(EContourPoint a_point) { - boolean isFirst = (a_point == getContourPoint(0)); - removeContourPoint(a_point); - - GlyphModule module = getModuleForName(getName()); - - if (getContourPoint().length < module.getMinimumPointCount()) - { - remove(); - return; - } // if - - if (!isFirst) { - return; - } // if - - EContourPoint newFirst = (EContourPoint) getContourPoint(0); - Point2D pos = newFirst.toPoint2D(); - Point2D delta = new Point2D.Double(-pos.getX(), -pos.getY()); - moveModulePoints(delta); - move(pos); - } - - public void moveModulePoints(Point2D a_delta) { - XContourPoint [] points = getContourPoint(); - - int i; - for (i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - EObject.movePoint(point, a_delta); - } // for i - } - - // for var stack frame - public boolean hasVariable(String a_name) { - return m_augmented.containsKey(a_name); - } - - // for var stack frame. - public double getValue(String a_name) { - Double d = (Double) m_augmented.get(a_name); - return d.doubleValue(); - } - - // for var stack frame. - public void beforePush() { - loadInvoke(getInvoke()); - } - - /** - * loads invoke arguments into this module to build augmented environment. - * @param a_invoke - */ - private void loadInvoke(XInvoke a_invoke) { - copyVarsToAug(); - - // load varg - int i; - XInvokeVarg [] vargs = a_invoke.getInvokeVarg(); - for (i = 0; i < vargs.length; i++) { - loadVarg(vargs[i]); - } // for i - } - - private void loadVarg(XInvokeVarg a_varg) { - String name = a_varg.getName(); - String src = a_varg.getSrc(); - GlyphModule module = getModule(); - - if (!module.hasVariable(name)) { - System.out.println(name + " does not exist in " - + module.toString()); - - return; - } // if - - double value = m_stack.get(src); - m_augmented.put(name, new Double(value)); - } - - private void copyVarsToAug() { - m_augmented.clear(); - m_augmented.putAll(getModule().getVars()); - } - - public void movePoint(EContourPoint a_point, Point2D a_delta) { - EObject.movePoint(a_point, a_delta); - - if (a_point != getContourPoint(0)) { - return; - } // if - - Point2D negative = new Point2D.Double(-a_delta.getX(), -a_delta.getY()); - moveModulePoints(negative); - move(a_delta); - } - - public GlyphObject insertPoint(EContourPoint a_point) { - int i; - int len = getContourPoint().length; - - for (i = 0; i < len; i++) { - if (getContourPoint(i) == a_point) { - break; - } // if - } // for - - EContourPoint nextPoint; - nextPoint = (EContourPoint) getContourPoint((i + 1) % len); - - double x = (a_point.getX() + nextPoint.getX()) / 2; - double y = (a_point.getY() + nextPoint.getY()) / 2; - - EContourPoint retval = new EContourPoint(x, y, true); - addContourPoint(i + 1, retval); - - return retval; - } - - public boolean hit(Rectangle2D a_rect, AffineTransform a_trans) { - return EObject.hit(this, a_rect, a_trans); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/EObject.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/EObject.java deleted file mode 100644 index 5f5f7e0c2..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/EObject.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * $Id: EObject.java,v 1.2 2004/11/08 06:29:51 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.geom.*; -import java.awt.*; - -import org.doubletype.ossa.*; -import org.doubletype.ossa.truetype.TTPixelSize; -import org.doubletype.ossa.xml.*; - -/** Decorator class of xml objects. - * @author e.e - */ -public abstract class EObject { - public static final String k_on = "on"; - public static final String k_off = "off"; - - private static ActiveList s_actives = null; - - - static ActiveList getActives() { - if (s_actives == null) { - s_actives = ActiveList.getSingletonInstance(); - } // if - - return s_actives; - } - - static Shape toShape(XPoint2d a_point, AffineTransform a_trans) { - - double ratio= EContour.k_defaultPixelSize/TTPixelSize.getEm(); - - double x = a_point.getX(); - double y = a_point.getY(); - double e = 3 / ratio; - Point2D source, dest; - source = new Point2D.Double(x, y); - dest = new Point2D.Double(); - dest = a_trans.transform(source, dest); - x = dest.getX(); - y = dest.getY(); - - return new Rectangle2D.Double(x - e, y - e, 2 * e + 1, 2 * e + 1); - } - - static void movePoint(XPoint2d a_point, Point2D a_delta) { - double x = a_point.getX() + a_delta.getX(); - double y = a_point.getY() + a_delta.getY(); - - a_point.setX(x); - a_point.setY(y); - } - - /** - * move the point and hint - * @param a_point - * @param a_delta - */ - public static void movePoint(EContourPoint a_point, Point2D a_delta) { - movePoint(a_point.getPoint2d(), a_delta); - - XHint [] hints = a_point.getHint(); - for (int i = 0; i < hints.length; i++) { - XHint hint = hints[i]; - movePoint(hint.getPoint2d(), a_delta); - } // for i - - if (a_point.hasControlPoint1()) { - EContourPoint point = (EContourPoint) a_point.getControlPoint1().getContourPoint(); - movePoint(point, a_delta); - } // if - if (a_point.hasControlPoint2()) { - EContourPoint point = (EContourPoint) a_point.getControlPoint2().getContourPoint(); - movePoint(point, a_delta); - } // if - } - - public static boolean hit(GlyphObject a_object, Rectangle2D a_rect, AffineTransform a_trans) { - int ppem = EContour.k_defaultPixelSize; - Shape hitArea = a_object.toShape(a_trans, ppem); - if (!hitArea.intersects(a_rect)) { - return false; - } // if - - EObject.getActives().addActive(a_object); - return true; - } - - public static XInvoke createInvoke(Point2D a_point) { - XInvoke retval = new XInvoke(); - retval.setInvokePos(createInvokePos(a_point.getX(), a_point.getY())); - return retval; - } - - public static XPoint2d createTransform(XPoint2d a_point, AffineTransform a_trans) { - XPoint2d retval = new XPoint2d(); - - double x = a_point.getX(); - double y = a_point.getY(); - Point2D source = new Point2D.Double(x, y); - Point2D dest = new Point2D.Double(); - a_trans.transform(source, dest); - - retval.setX(dest.getX()); - retval.setY(dest.getY()); - - return retval; - } - - private static XInvokePos createInvokePos(double a_x, double a_y) { - XInvokePos retval = new XInvokePos(); - retval.setPoint2d(createPoint2d(a_x, a_y)); - return retval; - } - - - private static XPoint2d createPoint2d(double a_x, double a_y) { - XPoint2d retval = new XPoint2d(); - retval.setX(a_x); - retval.setY(a_y); - return retval; - } - -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/Emulator.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/Emulator.java deleted file mode 100644 index f7ccb1598..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/Emulator.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * $Id: Emulator.java,v 1.6 2004/12/27 04:56:02 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.*; -import java.awt.geom.*; -import java.util.*; -import java.util.List; -import org.doubletype.ossa.xml.*; - -/** Emulator emulates font engine. - * @author e.e - */ -public class Emulator { - private static Emulator s_instance = null; - - // singleton pattern - public static Emulator getInstance() { - if (s_instance == null) { - s_instance = new Emulator(); - } // if - - return s_instance; - } - - private Emulator() { - super(); - } - - public Shape createShape(EContour a_contour, int a_ppem) { - if (a_contour.isCubic()) { - // return createBezierCurve(a_contour); - EContour contour = a_contour.toQuadratic(); - return createShape(contour, a_ppem); - } // if - - return concretePointsToShape(createConcretePoints( - createAdjustedPoints(a_contour, a_ppem))); - } - - private Shape createBezierCurve(EContour a_contour) { - GeneralPath retval = new GeneralPath(); - XContourPoint [] points = a_contour.getContourPoint(); - - if (points.length < 2) { - return retval; - } // if - - EContourPoint startPoint = (EContourPoint) points[points.length - 1]; - retval.moveTo((float) startPoint.getX(), (float) startPoint.getY()); - - for (int i = 0; i < points.length; i++) { - EContourPoint toPoint = (EContourPoint) points[i]; - EControlPoint controlPoint1 = (EControlPoint) startPoint.getControlPoint2(); - EControlPoint controlPoint2 = (EControlPoint) toPoint.getControlPoint1(); - - // line segment - if ((controlPoint1 == null) && (controlPoint2 == null)) { - retval.lineTo((float) toPoint.getX(), (float) toPoint.getY()); - - } // if - - if ((controlPoint1 != null) && (controlPoint2 == null)) { - retval.curveTo((float) controlPoint1.getX(), (float) controlPoint1.getY(), - (float) toPoint.getX(), (float) toPoint.getY(), - (float) toPoint.getX(), (float) toPoint.getY()); - } // if - - if ((controlPoint1 == null) && (controlPoint2 != null)) { - retval.curveTo((float) startPoint.getX(), (float) startPoint.getY(), - (float) controlPoint2.getX(), (float) controlPoint2.getY(), - (float) toPoint.getX(), (float) toPoint.getY()); - } // if - - if ((controlPoint1 != null) && (controlPoint2 != null)) { - retval.curveTo((float) controlPoint1.getX(), (float) controlPoint1.getY(), - (float) controlPoint2.getX(), (float) controlPoint2.getY(), - (float) toPoint.getX(), (float) toPoint.getY()); - } // if - - startPoint = toPoint; - } // for - - return retval; - } - - private Shape concretePointsToShape(List a_listOfPoints) { - GeneralPath retval = new GeneralPath(); - EContourPoint p; - - if (a_listOfPoints.size() < 3) - return retval; - - p = (EContourPoint) a_listOfPoints.get(0); - retval.moveTo((float) p.getX(), (float) p.getY()); - - int i = 0; - while (i < a_listOfPoints.size() - 1) { - i++; - EContourPoint nextPoint = (EContourPoint) a_listOfPoints.get(i); - - if (nextPoint.isOn()) { - retval.lineTo((float) nextPoint.getX(), (float) nextPoint.getY()); - } else { - EContourPoint controlPoint = nextPoint; - i++; - EContourPoint toPoint = (EContourPoint) a_listOfPoints.get(i); - - retval.quadTo((float) controlPoint.getX(), - (float) controlPoint.getY(), - (float) toPoint.getX(), (float) toPoint.getY()); - } // if-else - } // for - - return retval; - } - - private List createConcretePoints(List a_points) { - List retval = new ArrayList<>(); - - if (a_points.size() < 3) - return retval; - - EContourPoint lastPoint = (EContourPoint) a_points.get(a_points.size() - 1); - for (int i = 0; i < a_points.size(); i++) { - EContourPoint point = (EContourPoint) a_points.get(i); - - if (!point.isOn() && !lastPoint.isOn()) { - double xMidpoint = (point.getX() + lastPoint.getX()) / 2; - double yMidpoint = (point.getY() + lastPoint.getY()) / 2; - retval.add(new EContourPoint(xMidpoint, yMidpoint, true)); - } // if - - retval.add(new EContourPoint(point.getX(), point.getY(), point.isOn())); - lastPoint = point; - } // for i - - // all contours should start with on-curve point - // move off-curve point to the end if a contour starts with one. - EContourPoint point = (EContourPoint) retval.get(0); - if (!point.isOn()) { - retval.remove(0); - retval.add(point); - } // if - - point = (EContourPoint) retval.get(0); - retval.add(point); - - return retval; - } - - private List createAdjustedPoints(EContour a_contour, int a_ppem) { - List retval = new ArrayList<>(); - - XContourPoint [] points = a_contour.getContourPoint(); - if (points.length < 3) { - return retval; - } // if - - boolean isRounded = false; - for (int i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - point.resetAdjusted(); - - if (point.isRounded()) { - isRounded = true; - point.roundAdjusted(a_ppem); - } // if - - retval.add(point); - } // for i - - if (isRounded) { - interpolate(retval, true); - interpolate(retval, false); - } // if - - for (int i = 0; i < retval.size(); i++) { - EContourPoint point = (EContourPoint) retval.get(i); - if (point.hasHintForPpem(a_ppem)) { - point.hintAdjusted(a_ppem); - } // if - } // for i - - return promoteAdjustedToMain(retval); - } - - private List promoteAdjustedToMain(List a_points) { - List retval = new ArrayList<>(); - for (int i = 0; i < a_points.size(); i++) { - EContourPoint original = (EContourPoint) a_points.get(i); - EContourPoint adjusted = new EContourPoint(original.getAdjusted().getX(), - original.getAdjusted().getY(), - original.isOn()); - - retval.add(adjusted); - } // for i - - return retval; - } - - private void interpolate(List a_points, boolean a_isX) { - Collection sorted = sortPoints(a_points, a_isX); - - Iterator itr = sorted.iterator(); - - EContourPoint first = (EContourPoint) itr.next(); - if (!first.isRounded()) { - shiftPoint(first, a_points, a_isX); - } // if - - EContourPoint second = (EContourPoint) itr.next(); - EContourPoint third = null; - while (itr.hasNext()) { - third = (EContourPoint) itr.next(); - - if (!second.isRounded()) { - if (first.isRounded() - && third.isRounded()) { - interpolate(first, second, third, a_isX); - } else { - shiftPoint(second, a_points, a_isX); - } // if-else - } // if - - first = second; - second = third; - } // while - - EContourPoint last = third; - if (!last.isRounded()) { - shiftPoint(last, a_points, a_isX); - } // if - } - - private Collection sortPoints(List a_points, boolean a_isX) { - Map sorted = new TreeMap<>(); - - for (int i = 0; i < a_points.size(); i++) { - EContourPoint original = (EContourPoint) a_points.get(i); - Double value = new Double(getPointValue(original, a_isX)); - - while (sorted.containsKey(value)) { - value = new Double(value.doubleValue() + 0.01); - } // while - sorted.put(value, original); - } // for i - - return sorted.values(); - } - - private void interpolate(EContourPoint a_first, EContourPoint a_second, EContourPoint a_third, boolean a_isX) { - double firstValue = getPointValue(a_first, a_isX); - double secondValue = getPointValue(a_second, a_isX); - double thirdValue = getPointValue(a_third, a_isX); - double adjustedFirst = getAdjustedValue(a_first, a_isX); - double adjustedThird = getAdjustedValue(a_third, a_isX); - - double ratio = (secondValue - firstValue) / (thirdValue - firstValue); - - secondValue = adjustedFirst + ratio * (adjustedThird - adjustedFirst); - setAdjusted(a_second, secondValue, a_isX); - } - - private void shiftPoint(EContourPoint a_point, List a_points, boolean a_isX) { - EContourPoint closest = closestTouchedPoint(a_point, a_points); - if (closest == null) { - return; - } // if - - double delta = getAdjustedValue(closest, a_isX) - getPointValue(closest, a_isX); - double value = getPointValue(a_point, a_isX) + delta; - setAdjusted(a_point, value, a_isX); - } - - private void setAdjusted(EContourPoint a_point, double a_value, boolean a_isX) { - double x = a_point.getX(); - double y = a_point.getY(); - - if (a_isX) { - x = a_value; - } else { - y = a_value; - } // if-else - - a_point.setAdjusted(x, y); - } - - private double getPointValue(EContourPoint a_point, boolean a_isX) { - if (a_isX) { - return a_point.getX(); - } else { - return a_point.getY(); - } // if-else - } - - private double getAdjustedValue(EContourPoint a_point, boolean a_isX) { - if (a_isX) { - return a_point.getAdjusted().getX(); - } else { - return a_point.getAdjusted().getY(); - } // if-else - } - - private EContourPoint closestTouchedPoint(EContourPoint a_point, List a_points) { - EContourPoint retval = null; - double min = Double.MAX_VALUE; - for (int i = 0; i < a_points.size(); i++) { - EContourPoint target = (EContourPoint) a_points.get(i); - if (target == a_point) { - continue; - } // if - - if (!target.isRounded()) { - continue; - } // if - - double d = a_point.toPoint2D().distance(target.toPoint2D()); - if (d < min) { - min = d; - retval = target; - } // if - - } // for i - - return retval; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/GlyphObject.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/GlyphObject.java deleted file mode 100644 index 2a7e70724..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/GlyphObject.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * $Id: GlyphObject.java,v 1.1 2004/09/04 21:54:06 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.*; -import java.awt.geom.*; - -/** - * @author e.e - */ -public interface GlyphObject { - void move(Point2D a_delta); - void remove(); - Shape toShape(AffineTransform a_trans, int a_ppem); - boolean isSelected(); - void display(Graphics2D g, AffineTransform a_trans); - boolean hit(Rectangle2D a_rect, AffineTransform a_trans); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/PointAggregate.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/PointAggregate.java deleted file mode 100644 index b1b6a5003..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/PointAggregate.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * $Id: PointAggregate.java,v 1.2 2004/09/18 07:30:44 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.awt.geom.*; -import org.doubletype.ossa.xml.*; - -/** - * @author e.e - */ -public interface PointAggregate { - void removePoint(EContourPoint a_point); - void movePoint(EContourPoint a_point, Point2D a_delta); - GlyphObject insertPoint(EContourPoint a_point); - XContourPoint[] getContourPoint(); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/adapter/QuadraticSegment.java b/libsrc/ttf/src/org/doubletype/ossa/adapter/QuadraticSegment.java index 758a160cd..6ab69facd 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/adapter/QuadraticSegment.java +++ b/libsrc/ttf/src/org/doubletype/ossa/adapter/QuadraticSegment.java @@ -1,188 +1,187 @@ -/* - * $Id: QuadraticSegment.java,v 1.1 2004/12/15 11:54:18 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.adapter; - -import java.util.*; - -import org.doubletype.ossa.xml.XContourPoint; - -/** - * @author e.e - */ -public class QuadraticSegment { - public static final int LINE = 0; - public static final int CURVE = 1; - - /** - * converts quadratic contour into a list of quadratic segments. - * @param a_contour - * @return - */ - public static ArrayList toSegments(EContour a_contour) { - ArrayList retval = new ArrayList<>(); - - ArrayList points = toConcreatePoints(a_contour); - if (points.size() < 3) { - return retval; - } // if - - for (int i = 0; i < points.size() - 1; i++) { - EContourPoint startPoint = (EContourPoint) points.get(i); - EContourPoint nextPoint = (EContourPoint) points.get(i + 1); - - // if this is a line segment - if (nextPoint.isOn()) { - retval.add(new QuadraticSegment(startPoint, null, nextPoint)); - } else { - EContourPoint offCurvePoint = nextPoint; - i++; - nextPoint = (EContourPoint) points.get(i + 1); - retval.add(new QuadraticSegment(startPoint, offCurvePoint, nextPoint)); - } // if-else - } // for i - - return retval; - } - - /** - * converts a list of quadratic segments into a quadratic contour. - * @param a_segments - * @return - */ - public static EContour toContour(ArrayList a_segments) { - EContour retval = new EContour(); - retval.setType(EContour.k_quadratic); - - for (QuadraticSegment segment: a_segments) { - EContourPoint startPoint = (EContourPoint) segment.m_startPoint.clone(); - startPoint.setControlPoint1(null); - startPoint.setControlPoint2(null); - - if (segment.m_type == LINE) { - retval.addContourPoint(startPoint); - - } else { - retval.addContourPoint(startPoint); - retval.addContourPoint(segment.m_offCurvePoint); - } - } // for i - - return retval; - } - - /** - * converts quadratic contour to concreate points by inserting - * on-curve point between off-curve points. - * @param a_contour - * @return - */ - private static ArrayList toConcreatePoints(EContour a_contour) { - ArrayList retval = new ArrayList<>(); - - XContourPoint [] points = a_contour.getContourPoint(); - if (points.length < 3) - return retval; - - EContourPoint fromPoint = (EContourPoint) points[points.length - 1]; - for (XContourPoint point: points) { - EContourPoint toPoint = (EContourPoint) point; - if (!toPoint.isOn() && !fromPoint.isOn()) { - double xMidpoint = (toPoint.getX() + fromPoint.getX()) / 2; - double yMidpoint = (toPoint.getY() + fromPoint.getY()) / 2; - retval.add(new EContourPoint(xMidpoint, yMidpoint, true)); - } // if - - retval.add(toPoint); - fromPoint = toPoint; - } // for i - - // all contours should start with on-curve point - // move off-curve point to the end if a contour starts with one. - EContourPoint firstPoint = (EContourPoint) retval.get(0); - if (!firstPoint.isOn()) { - retval.remove(0); - retval.add(firstPoint); - } // if - - retval.add(retval.get(0)); - - return retval; - } - - private EContourPoint m_startPoint; - private EContourPoint m_offCurvePoint; - private EContourPoint m_endPoint; - - private int m_type = LINE; - - /** - * - */ - public QuadraticSegment(EContourPoint a_startPoint, EContourPoint a_offCurvePoint, - EContourPoint a_endPoint) { - m_startPoint = a_startPoint; - m_offCurvePoint = a_offCurvePoint; - m_endPoint = a_endPoint; - - if (m_offCurvePoint != null) { - m_type = CURVE; - } // if - } - - /** - * Convert quadratic segment to cubic. - * @param a_segment - * @return - */ - public CubicSegment toCubicSegment() { - // if the segment is a line - if (m_type == LINE) { - return new CubicSegment(m_startPoint, m_endPoint); - } // if - - double x, y; - x = m_startPoint.getX() + 2.0 / 3.0 * (m_offCurvePoint.getX() - m_startPoint.getX()); - y = m_startPoint.getY() + 2.0 / 3.0 * (m_offCurvePoint.getY() - m_startPoint.getY()); - EContourPoint controlPoint1 = new EContourPoint(x, y, false); - - x = m_offCurvePoint.getX() + 1.0 / 3.0 * (m_endPoint.getX() - m_offCurvePoint.getX()); - y = m_offCurvePoint.getY() + 1.0 / 3.0 * (m_endPoint.getY() - m_offCurvePoint.getY()); - EContourPoint controlPoint2 = new EContourPoint(x, y, false); - - return new CubicSegment(m_startPoint, controlPoint1, controlPoint2, m_endPoint); - } - -} +/* + * $Id: QuadraticSegment.java,v 1.1 2004/12/15 11:54:18 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.adapter; + +import java.util.*; + +/** + * @author e.e + */ +public class QuadraticSegment { + public static final int LINE = 0; + public static final int CURVE = 1; + + /** + * converts quadratic contour into a list of quadratic segments. + * @param a_contour + * @return + */ + public static ArrayList toSegments(EContour a_contour) { + ArrayList retval = new ArrayList<>(); + + ArrayList points = toConcreatePoints(a_contour); + if (points.size() < 3) { + return retval; + } + + for (int i = 0; i < points.size() - 1; i++) { + EContourPoint startPoint = (EContourPoint) points.get(i); + EContourPoint nextPoint = (EContourPoint) points.get(i + 1); + + // if this is a line segment + if (nextPoint.isOn()) { + retval.add(new QuadraticSegment(startPoint, null, nextPoint)); + } else { + EContourPoint offCurvePoint = nextPoint; + i++; + nextPoint = (EContourPoint) points.get(i + 1); + retval.add(new QuadraticSegment(startPoint, offCurvePoint, nextPoint)); + } + } + + return retval; + } + + /** + * converts a list of quadratic segments into a quadratic contour. + * @param a_segments + * @return + */ + public static EContour toContour(ArrayList a_segments) { + EContour retval = new EContour(); + retval.setType(EContour.k_quadratic); + + for (QuadraticSegment segment: a_segments) { + EContourPoint p = segment.m_startPoint; + EContourPoint startPoint = new EContourPoint(p.getX(), p.getY(), p.isOn()); + startPoint.setControlPoint1(null); + startPoint.setControlPoint2(null); + + if (segment.m_type == LINE) { + retval.addContourPoint(startPoint); + + } else { + retval.addContourPoint(startPoint); + retval.addContourPoint(segment.m_offCurvePoint); + } + } + + return retval; + } + + /** + * converts quadratic contour to concreate points by inserting + * on-curve point between off-curve points. + * @param a_contour + * @return + */ + private static ArrayList toConcreatePoints(EContour a_contour) { + ArrayList retval = new ArrayList<>(); + + ArrayList points = a_contour.getContourPoints(); + if (points.size() < 3) + return retval; + + EContourPoint fromPoint = (EContourPoint) points.get(points.size() - 1); + for (EContourPoint point: points) { + EContourPoint toPoint = (EContourPoint) point; + if (!toPoint.isOn() && !fromPoint.isOn()) { + double xMidpoint = (toPoint.getX() + fromPoint.getX()) / 2; + double yMidpoint = (toPoint.getY() + fromPoint.getY()) / 2; + retval.add(new EContourPoint(xMidpoint, yMidpoint, true)); + } + + retval.add(toPoint); + fromPoint = toPoint; + } + + // all contours should start with on-curve point + // move off-curve point to the end if a contour starts with one. + EContourPoint firstPoint = (EContourPoint) retval.get(0); + if (!firstPoint.isOn()) { + retval.remove(0); + retval.add(firstPoint); + } + + retval.add(retval.get(0)); + + return retval; + } + + private EContourPoint m_startPoint; + private EContourPoint m_offCurvePoint; + private EContourPoint m_endPoint; + + private int m_type = LINE; + + /** + * + */ + public QuadraticSegment(EContourPoint a_startPoint, EContourPoint a_offCurvePoint, + EContourPoint a_endPoint) { + m_startPoint = a_startPoint; + m_offCurvePoint = a_offCurvePoint; + m_endPoint = a_endPoint; + + if (m_offCurvePoint != null) { + m_type = CURVE; + } + } + + /** + * Convert quadratic segment to cubic. + * @param a_segment + * @return + */ + public CubicSegment toCubicSegment() { + // if the segment is a line + if (m_type == LINE) { + return new CubicSegment(m_startPoint, m_endPoint); + } + + double x, y; + x = m_startPoint.getX() + 2.0 / 3.0 * (m_offCurvePoint.getX() - m_startPoint.getX()); + y = m_startPoint.getY() + 2.0 / 3.0 * (m_offCurvePoint.getY() - m_startPoint.getY()); + EContourPoint controlPoint1 = new EContourPoint(x, y, false); + + x = m_offCurvePoint.getX() + 1.0 / 3.0 * (m_endPoint.getX() - m_offCurvePoint.getX()); + y = m_offCurvePoint.getY() + 1.0 / 3.0 * (m_endPoint.getY() - m_offCurvePoint.getY()); + EContourPoint controlPoint2 = new EContourPoint(x, y, false); + + return new CubicSegment(m_startPoint, controlPoint1, controlPoint2, m_endPoint); + } + +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphFile.java b/libsrc/ttf/src/org/doubletype/ossa/module/GlyphFile.java index bdd5d618b..fa55c4126 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphFile.java +++ b/libsrc/ttf/src/org/doubletype/ossa/module/GlyphFile.java @@ -33,102 +33,33 @@ package org.doubletype.ossa.module; -import org.doubletype.ossa.*; -import org.doubletype.ossa.xml.*; import org.doubletype.ossa.adapter.*; import org.doubletype.ossa.truetype.*; import java.io.*; import java.awt.*; -import java.awt.geom.*; -import javax.xml.transform.*; -import javax.xml.transform.stream.*; -import javax.xml.transform.dom.*; -import java.net.*; import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.w3c.dom.*; -import javax.xml.parsers.*; -import org.xml.sax.*; +import java.util.List; /** * @author e.e */ -public class GlyphFile extends GlyphModule { - protected static String s_emptyFileName = "empty.glyph"; - private static final String k_dotGlyph = ".glyph"; - private static Transformer s_transformer = null; +public class GlyphFile { + private long m_unicode; + private String m_author; + private String m_copyrightYear; + private String m_license; + private Integer m_advanceWidth = null; + private List contours = new ArrayList<>(); - static { - GlyphFactory.setFactory(EGlyphFactory.getFactory()); - } - - public static File createFileName(File a_dir, String a_name) { - return new File(a_dir, a_name + k_dotGlyph); - } - - /** - * http://www.atmarkit.co.jp/fxml/rensai2/xmltool04/02.html - * @return - */ - private static Transformer getTransformer() { - if (s_transformer == null) { - TransformerFactory transFactory - = TransformerFactory.newInstance(); - try { - s_transformer = transFactory.newTransformer(); - } - catch (TransformerConfigurationException e) { - } - - s_transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); - s_transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - } // if - - return s_transformer; - } - - private static XStartGlyphElement loadGlyphElement(URL a_url) { - IGlyphFactory factory = GlyphFactory.getFactory(); - - XStartGlyphElement retval = null; - - try { - retval = factory.createXStartGlyphElement(a_url); - } catch( SAXException | ParserConfigurationException | IOException e) { - e.printStackTrace(); - } - - return retval; - } - - private static XStartGlyphElement loadGlyphElement(InputStream a_in) { - IGlyphFactory factory = GlyphFactory.getFactory(); - XStartGlyphElement retval = null; - - try { - retval = factory.createXStartGlyphElement(a_in); - } catch( SAXException | ParserConfigurationException | IOException e) { - e.printStackTrace(); - } - - return retval; - } // -------------------------------------------------------------- - protected XStartGlyphElement m_glyph; - protected File m_fileName; protected long m_modifiedTime = 0; protected long m_savedTime = 0; private final int k_halfWidth = 512; private final int k_fullWidth = 1024; - private String m_selectedNodeName = ""; - private boolean m_isMoving = false; - private PointAggregate m_pointHost; // -------------------------------------------------------------- @@ -136,68 +67,25 @@ public class GlyphFile extends GlyphModule { /** * creates new file */ - public GlyphFile(File a_dir, String a_name, long a_unicode) { + public GlyphFile(File a_dir, long a_unicode) { super(); - m_fileName = createFileName(a_dir, a_name); + init(); + setUnicode(a_unicode); - init(getClass().getResource(s_emptyFileName)); - setGlyphTitle(a_name); - setUnicode(Long.toHexString(a_unicode)); - - /*int eastAsianWidth = UCharacter.getIntPropertyValue( - (int) a_unicode, - 0x1004); //UProperty.EAST_ASIAN_WIDTH); - */ - int eastAsianWidth = 5; //?? - if (eastAsianWidth == 5 || eastAsianWidth == 1) { - setAdvanceWidth(k_fullWidth); - } // if + setAdvanceWidth(k_fullWidth); } /** * creates new file * @param a_dir parent dir - * @param a_name glyph name */ - public GlyphFile(File a_dir, String a_name) throws FileNotFoundException { + public GlyphFile(File a_dir) { super(); - init(getClass().getResource(s_emptyFileName)); - setGlyphTitle(a_name); - m_fileName = createFileName(a_dir, a_name); + init(); } - /** - * opens existing file - * @param a_file - */ - public GlyphFile(File a_file) { - super(); - - m_fileName = a_file; - - URL url = null; - - try { - url = a_file.toURI().toURL(); - } catch(MalformedURLException e) { - e.printStackTrace(); - } - - init(url); - } - - protected GlyphFile(URL a_url) { - super(); - init(a_url); - } - - private void init(URL a_url) { - m_glyph = loadGlyphElement(a_url); - ModuleManager.getSingletonInstance().clear(); - - //m_display = Engine.getSingletonInstance().getDisplay(); - + private void init() { m_savedTime = m_modifiedTime; } @@ -233,635 +121,98 @@ public class GlyphFile extends GlyphModule { } public void beforePush() { - loadVar(); - } - - public void restore(Memento a_memento) { - m_glyph = loadGlyphElement(a_memento.getData()); - ModuleManager.getSingletonInstance().clear(); } // -------------------------------------------------------------- - public XStartGlyphElement getGlyph() { - return m_glyph; - } - - // -------------------------------------------------------------- - - public void saveGlyphFile(OutputStream a_output) { - try { - Transformer transformer = getTransformer(); - Document document = m_glyph.makeDocument(); - DOMSource source = new DOMSource(document); - StreamResult result = new StreamResult(a_output); - transformer.transform(source, result); - } catch (ParserConfigurationException | TransformerException e) { - e.printStackTrace(); - } - - m_savedTime = System.currentTimeMillis(); - m_modifiedTime = m_savedTime; - } - - public Memento createMemento(String a_description) { - m_modifiedTime = System.currentTimeMillis(); - byte [] bytes = m_glyph.makeTextDocument().getBytes(); - return new Memento(a_description, bytes); - } - public boolean hasUnsavedChange() { return (m_savedTime != m_modifiedTime); } public void setAuthor(String a_value) { - m_glyph.getHead().setAuthor(a_value); + m_author = a_value; } public String getAuthor() { - return m_glyph.getHead().getAuthor(); + return m_author; } public void setCopyrightYear(String a_value) { - m_glyph.getHead().setCopyright(a_value); + m_copyrightYear = a_value; } public String getCopyrightYear() { - return m_glyph.getHead().getCopyright(); + return m_copyrightYear; } public void setAdvanceWidth(int a_width) { - m_glyph.getHead().setAdvanceWidth(a_width); + m_advanceWidth = a_width; } public int getAdvanceWidth() { - if (!m_glyph.getHead().checkAdvanceWidth()) { - setAdvanceWidth(k_halfWidth); - } // if + if (m_advanceWidth == null) { + return k_halfWidth; + } - return (int) m_glyph.getHead().getAdvanceWidth(); - } - - public Iterator createIterator() { - return new GlyphIterator(this); + return m_advanceWidth; } - // -------------------------------------------------------------- - - public void display(Graphics2D g, AffineTransform a_trans) - { - Iterator i = createIterator(); - while (i.hasNext()) { - GlyphObject object = (GlyphObject) i.next(); - object.display(g, a_trans); - } // while - } - // -------------------------------------------------------------- public static final int k_defaultPixelSize = 16; //PPM - /** converts this glyph into Shape. - * It could be called for root's preview mode or by include invoke. - * Pushing either this GlyphFile or DIncludeInvoke should be - * handled before this. - */ - public Shape toShape(AffineTransform a_trans) { - - - int ppem = k_defaultPixelSize; - - GeneralPath retval = new GeneralPath(); - Iterator i = createIterator(); - while (i.hasNext()) { - GlyphObject object = (GlyphObject) i.next(); - - if (object instanceof EContourPoint - || object instanceof EHint) { - continue; - } // if - - retval.append(object.toShape(a_trans, ppem), false); - } // if - - return retval; - } - // -------------------------------------------------------------- /** * Generates array of XContour from local contours and modules. * Used for TTF building. */ - private XContour [] toContours() { - XContour [] retval; - ArrayList list = new ArrayList<>(); - XContour [] contours = m_glyph.getBody().getContour(); - for (int i = 0; i < contours.length; i++) { - EContour contour = (EContour) contours[i]; + private EContour [] toContours() { + EContour [] retval; + ArrayList list = new ArrayList<>(); + for (EContour contour : contours) { list.add(contour.toQuadratic()); - } // for i - - XModule [] modules = m_glyph.getBody().getModule(); - for (int i = 0; i < modules.length; i++) { - EModuleInvoke module = (EModuleInvoke) modules[i]; - - // push and pop happens inside toContour - list.add(module.toContour(new AffineTransform())); - } // for i + } if (list.size() == 0) return null; - retval = new XContour[list.size()]; + retval = new EContour[list.size()]; for (int i = 0; i < list.size(); i++) { retval[i] = list.get(i); - } // for i + } return retval; } // -------------------------------------------------------------- - public boolean isMoving() { - return m_isMoving; - } - - // -------------------------------------------------------------- - - public void beginMove() { - m_isMoving = true; - } - - // -------------------------------------------------------------- - - public void endMove() { - if (!m_isMoving) { - return; - } // if - - m_isMoving = false; - } - - // -------------------------------------------------------------- - - public void move(Point2D a_delta) { - int i; - for (i = 0; i < m_actives.size(); i++) { - GlyphObject active = m_actives.get(i); - active.move(a_delta); - } // for i - } - - - // -------------------------------------------------------------- - - public void fitMove() { - if (m_actives.hasActiveControlPoint()) { - EControlPoint controlPoint = m_actives.getActiveControlPoint(); - controlPoint.rotateTo45(); - } // if - } - - // -------------------------------------------------------------- - - public boolean isHittingSelected(Point2D a_point) { - ActiveList oldActiveObjects = new ActiveList(); - oldActiveObjects.setActives(m_actives); - - m_actives.unselectAll(); - hit(a_point, false, false); - - int i, j; - for (i = 0; i < m_actives.size(); i++) { - GlyphObject selected = m_actives.get(i); - for (j = 0; j < oldActiveObjects.size(); j++) { - GlyphObject old = oldActiveObjects.get(j); - - if (selected == old) { - m_actives.setActives(oldActiveObjects); - return true; - } // if - } // for j - } // for i - - m_actives.setActives(oldActiveObjects); - - return false; - } - - // -------------------------------------------------------------- - - /** hits a point to add them in active object queue. - * @param a_single when it is true, the method returns after - * finding the first hit. - */ - public boolean hit(Point2D a_point, - boolean a_isAppend, - boolean a_isSelectOnlyOne) { - if (a_point == null) { - return false; - } // if - - Rectangle2D rect = new Rectangle2D.Double( - a_point.getX(), a_point.getY(), - 1.0, 1.0); - return hit(rect, a_isAppend, a_isSelectOnlyOne); - } - - public void selectNext() { - Iterator i = new SelectionIterator(this); - - if (m_actives.size() == 1) { - boolean isFound = false; - - // loop the iterator in reverse order of drawing - while (i.hasNext()) { - GlyphObject object = (GlyphObject) i.next(); - - if (m_actives.isSelected(object)) { - isFound = true; - continue; - } // if - - if (!isFound) { - continue; - } // if - - m_actives.unselectAll(); - m_actives.addActive(object); - return; - } // while i - } // if - - i = new SelectionIterator(this); - if (i.hasNext()) { - GlyphObject object = (GlyphObject) i.next(); - m_actives.unselectAll(); - m_actives.addActive(object); - return; - } // if - } - - // -------------------------------------------------------------- - - public boolean hit(Rectangle2D a_rect, - boolean a_isAppend, - boolean a_single) { - - - if (!a_isAppend) { - m_actives.unselectAll(); - } // if - - return hitObjects(a_rect, a_single); - } - - // -------------------------------------------------------------- - - private boolean hitObjects(Rectangle2D a_rect, boolean a_isSelectOnlyOne) { - boolean retval = false; - - Iterator i = new SelectionIterator(this); - - // loop the iterator in reverse order of drawing - while (i.hasNext()) { - GlyphObject object = (GlyphObject) i.next(); - - if (!object.hit(a_rect, new AffineTransform())) { - continue; - } // if - - retval = true; - - if (a_isSelectOnlyOne) { - return true; - } // if - } // while i - - return retval; - } - - // -------------------------------------------------------------- - - /** used for cut and paste. - */ - public void addObjectFromClipboard(String a_value) throws CircularIncludeException { - Reader reader = new StringReader(a_value); - Document document = null; - try { - document = UJAXP.getDocument(reader); - } catch (Exception e) { - e.printStackTrace(); - return; - } // try-catch - - Element root = document.getDocumentElement(); - if (!root.getNodeName().equals("clipboard")) { - return; - } // if - - Node child; - for (child = root.getFirstChild(); child != null; - child = child.getNextSibling()) { - if (!(child instanceof Element)) { - continue; - } // if - Element element = (Element) child; - - IGlyphFactory factory = GlyphFactory.getFactory(); - - - if (XModule.isMatch(element)) { - EModuleInvoke module = (EModuleInvoke) factory.createXModule(element); - addModule(module); - continue; - } // if - - if (XContour.isMatch(element)) { - EContour contour = (EContour) factory.createXContour(element); - addContour(contour); - continue; - } // if - - if (XInclude.isMatch(element)) { - EIncludeInvoke include = (EIncludeInvoke) factory.createXInclude(element); - addInclude(include); - continue; - } // if - } // while - } - - // -------------------------------------------------------------- - - private boolean isCircularInclude(String a_href) { - if (getShortFileName().equals(a_href)) { - return true; - } // if - - ModuleManager manager = ModuleManager.getSingletonInstance(); - XInclude [] includes = m_glyph.getBody().getInclude(); - int i; - for (i = 0; i < includes.length; i++) { - XInclude include = includes[i]; - GlyphFile child = manager.getGlyphFile(include.getHref()); - - if (child.isCircularInclude(a_href)) { - return true; - } // if - } // for i - - return false; - } - - // -------------------------------------------------------------- - - public void addInclude(String a_fileName) throws CircularIncludeException { - addInclude(EIncludeInvoke.create(a_fileName)); - } - - public void addInclude(XInclude a_include) throws CircularIncludeException { - if (isCircularInclude(a_include.getHref())) { - throw new CircularIncludeException(); - } // if - - m_actives.unselectAll(); - m_actives.addActive((GlyphObject) a_include); - m_glyph.getBody().addInclude(a_include); - } - - // -------------------------------------------------------------- - - /** - * pasted module from clipboard or ModuleInvokeAction - * @param a_module - */ - public XModule addModule(EModuleInvoke a_module) { - m_actives.unselectAll(); - m_actives.addActive(a_module); - m_glyph.getBody().addModule(a_module); - - return a_module; - } - - // -------------------------------------------------------------- - /** add contour from clipboard or ContourAction * @param a_contour */ public void addContour(EContour a_contour) { - m_actives.unselectAll(); - m_actives.addActive(a_contour); - m_glyph.getBody().addContour(a_contour); + contours.add(a_contour); } // -------------------------------------------------------------- - public void addPoint() { - if (!m_actives.hasActivePoint()) { - return; - } // if - - EContourPoint contourPoint = m_actives.getActivePoint(); - m_actives.unselectAll(); - m_actives.addActive(contourPoint.add()); + public long getUnicode() { + return m_unicode; } - // -------------------------------------------------------------- - - public void addHint(int a_ppem) { - if (!m_actives.hasActivePoint()) - return; - - EContourPoint contourPoint = m_actives.getActivePoint(); - m_actives.unselectAll(); - m_actives.addActive(contourPoint.addHint(a_ppem)); - - if (contourPoint.hasControlPoint1()) { - EContourPoint p = (EContourPoint) contourPoint.getControlPoint1().getContourPoint(); - m_actives.addActive(p.addHint(a_ppem)); - } // if - - if (contourPoint.hasControlPoint2()) { - EContourPoint p = (EContourPoint) contourPoint.getControlPoint2().getContourPoint(); - m_actives.addActive(p.addHint(a_ppem)); - } // if - } - - public void toggleRounded() { - if (!m_actives.hasActivePoint()) - return; - - EContourPoint contourPoint = m_actives.getActivePoint(); - contourPoint.toggleRounded(); - } - - public void convertControlPoint() { - if (!m_actives.hasActiveControlPoint()) { - return; - } // if - - EControlPoint controlPoint = m_actives.getActiveControlPoint(); - controlPoint.convert(); - } - - public void convertContour() { - if (!m_actives.hasActiveContour()) { - return; - } // if - - EContour contour = m_actives.getActiveContour(); - contour.convert(); - } - - // -------------------------------------------------------------- - - public void remove() { - if (!m_actives.hasSelected()) - return; - - int i; - for (i = 0; i < m_actives.size(); i++) { - GlyphObject active = m_actives.get(i); - active.remove(); - } // for i - - m_actives.unselectAll(); - } - - // -------------------------------------------------------------- - - public void toggleOnOff() { - if (!m_actives.hasSelected()) - return; - - int i; - for (i = 0; i < m_actives.size(); i++) { - GlyphObject active = m_actives.get(i); - if (!(active instanceof EContourPoint)) { - continue; - } // if - - EContourPoint point = (EContourPoint) active; - point.toggleOnCurve(); - } // for i - } - - private void loadVar() { - XParamListParam [] params = m_glyph.getHead().getHeadGlobal().getParamListParam(); - int i; - for (i = 0; i < params.length; i++) { - XParamListParam param = params[i]; - addVar(param.getName(), param.getContent()); - } // for i - } - - public String getSelectedNodeName() { - return m_selectedNodeName; - } - - public void addFileVar() { - XParamListParam param = new XParamListParam(); - param.setName("New parameter"); - param.setContent(0.0); - - m_glyph.getHead().getHeadGlobal().addParamListParam(param); - } - - public void removeFileVar(int a_index) { - m_glyph.getHead().getHeadGlobal().removeParamListParam(a_index); - } - - - public void addInvokeArg(int a_type) { - - } - - public void removeInvokeArg(int a_type, int a_index) { - - } - - public String getIncludeName() { - String retval = ""; - - if (!m_actives.hasActiveInclude()) - return retval; - retval = m_actives.getActiveInclude().getHref(); - - return retval; - } - - public void setIncludeName(String a_name) { - if (!m_actives.hasActiveInclude()) - return; - - m_actives.getActiveInclude().setHref(a_name); - } - - public void setGlyphTitle(String a_title) { - m_glyph.getHead().setTitle(a_title); - } - - public String getGlyphTitle() { - String retval = ""; - - retval = m_glyph.getHead().getTitle(); - - if (retval.equals("empty")) { - retval = ""; - } // if - - return retval; - } - - public String getModuleName() { - String retval = ""; - - if (!m_actives.hasActiveModule()) - return retval; - retval = m_actives.getActiveModule().getName(); - - return retval; - } - - public String getUnicode() { - return getUnicodeAsString(); - } - - public String getUnicodeAsString() { - return m_glyph.getHead().getUnicode(); - } - - public long getUnicodeAsLong() { - long retval = -1; - - String s = getUnicodeAsString(); - if (s.equals("")) { - return retval; - } // if - - try { - retval = Long.parseLong(s, 16); - } catch (NumberFormatException e) { - retval = -1; - } // try-catch - - return retval; - } - - protected void setUnicode(String a_unicode) { - m_glyph.getHead().setUnicode(a_unicode); + protected void setUnicode(long a_unicode) { + m_unicode = a_unicode; } public boolean isSimple() { - return (m_glyph.getBody().getInclude().length == 0); + return true; } public boolean isWhiteSpace() { - long unicode = getUnicodeAsLong(); + long unicode = getUnicode(); if (unicode == 0x0020 || unicode == 0x00a0 @@ -871,69 +222,21 @@ public class GlyphFile extends GlyphModule { || unicode == 0xfeff) { return true; - } // if + } return false; } - public String getShortFileName() { - return m_fileName.getName(); - } - public void setLicense(String a_value) { - m_glyph.getHead().setLicense(a_value); + m_license = a_value; } public String getLicense() { - return m_glyph.getHead().getLicense(); - } - - public PointAggregate getPointHost() { - return m_pointHost; - } - - public void buildPointHost() { - m_pointHost = null; - - /*if (!GlyphAction.isPointVisible()) { - return; - } // if*/ - - int i; - for (i = 0; i < m_actives.size(); i++) { - GlyphObject object = (GlyphObject) m_actives.get(i); - PointAggregate host = null; - - if (object instanceof EContourPoint) { - EContourPoint point = (EContourPoint) object; - host = point.getParent(); - - if (host instanceof EContourPoint) { - EContourPoint hostPoint = (EContourPoint) host; - host = hostPoint.getParent(); - } // if - } else if (object instanceof EHint) { - EHint hint = (EHint) object; - host = hint.getPointHost(); - } // if-else - - if (host == null) { - continue; - } // if - - if (m_pointHost == null) { - m_pointHost = host; - } else { - if (m_pointHost != host) { - m_pointHost = null; - return; - } // if - } // if - } // while + return m_license; } public boolean isRequiredGlyph() { - long unicode = getUnicodeAsLong(); + long unicode = getUnicode(); return (unicode == TTUnicodeRange.k_notDef || unicode == TTUnicodeRange.k_null @@ -943,10 +246,10 @@ public class GlyphFile extends GlyphModule { public TTGlyph toSimpleGlyph() { // convert the file into array of contours - XContour [] contours = toContours(); + EContour [] contours = toContours(); if ((contours == null) && (!isRequiredGlyph())) { return null; - } // if + } TTGlyph retval = new TTGlyph(); retval.setSimple(true); @@ -954,50 +257,22 @@ public class GlyphFile extends GlyphModule { if (contours == null) { return retval; - } // if + } ArrayList points = new ArrayList<>(); for (int i = 0; i < contours.length; i++) { - XContour contour = contours[i]; - XContourPoint [] contourPoints = contour.getContourPoint(); - for (int j = 0; j < contourPoints.length; j++) { - points.add((EContourPoint) contourPoints[j]); + EContour contour = contours[i]; + ArrayList contourPoints = contour.getContourPoints(); + for (int j = 0; j < contourPoints.size(); j++) { + points.add((EContourPoint) contourPoints.get(j)); } // for j retval.addEndPoint(points.size() - 1); - } // for i + } for (EContourPoint point: points) { loadContourPoint(retval, point); } // for point - boolean hasGridfit = false; - // I need int i here. - for (int i = 0; i < points.size(); i++) { - EContourPoint point = points.get(i); - - if (!point.isRounded()) { - continue; - } // if - - hasGridfit = true; - loadGridfit(retval, point, i); - } // for i - - if (hasGridfit) { - retval.addInstruction(TTGlyph.IUP1); - retval.addInstruction(TTGlyph.IUP0); - } // if - - // I need int i here. - for (int i = 0; i < points.size(); i++) { - EContourPoint point = points.get(i); - if (point.getHint().length == 0) { - continue; - } // if - - loadHint(retval, point, i); - } // for i - return retval; } @@ -1008,72 +283,9 @@ public class GlyphFile extends GlyphModule { int flag = 0; if (a_point.isOn()) { flag = TTGlyph.k_onCurve; - } // if + } a_glyph.addPoint(p); a_glyph.addFlag(flag); } - - private void loadGridfit(TTGlyph a_glyph, EContourPoint a_point, int a_index) { - if (!a_point.isRounded()) { - return; - } // if - - a_glyph.addInstruction(TTGlyph.PUSHB000); - a_glyph.addInstruction(a_index); - a_glyph.addInstruction(TTGlyph.MDAP1); - } - - - private void loadHint(TTGlyph a_glyph, EContourPoint a_point, int a_index) { - double x = a_point.getX(); - double y = a_point.getY(); - - XHint [] hints = a_point.getHint(); - - for (int i = 0; i < hints.length; i++) { - EHint hint = (EHint) hints[i]; - double xHint = hint.getX(); - double yHint = hint.getY(); - - if (x == xHint && y == yHint) { - continue; - } // if - - double xDelta = xHint - x; - double yDelta = yHint - y; - int instruction = TTGlyph.DELTAP1; - double deltaStep = ((double) Engine.getEm()) / hint.getPpem() / 8; - int xShift = (int) Math.round(xDelta / deltaStep); - int yShift = (int) Math.round(yDelta / deltaStep); - - if (xShift == 0 && yShift == 0) { - continue; - } // if - - a_glyph.addInstruction(TTGlyph.PUSHB000); - a_glyph.addInstruction((int) hint.getPpem()); - a_glyph.addInstruction(TTGlyph.SDB); - - if (xShift != 0) { - a_glyph.addInstruction(TTGlyph.SVTCA1); - a_glyph.addInstruction(TTGlyph.PUSHB010); - a_glyph.addInstruction(TTGlyph.toDeltaArg(0, xShift)); - a_glyph.addInstruction(a_index); - a_glyph.addInstruction(1); - a_glyph.addInstruction(TTGlyph.DELTAP1); - } // if - - if (yShift != 0) { - a_glyph.addInstruction(TTGlyph.SVTCA0); - a_glyph.addInstruction(TTGlyph.PUSHB010); - a_glyph.addInstruction(TTGlyph.toDeltaArg(0, yShift)); - a_glyph.addInstruction(a_index); - a_glyph.addInstruction(1); - a_glyph.addInstruction(TTGlyph.DELTAP1); - } // if - } // for i - } - - public class CircularIncludeException extends Exception {} } \ No newline at end of file diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphIterator.java b/libsrc/ttf/src/org/doubletype/ossa/module/GlyphIterator.java deleted file mode 100644 index 0c2f1816a..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphIterator.java +++ /dev/null @@ -1,237 +0,0 @@ - /* - * $Id: GlyphIterator.java,v 1.11 2004/12/27 04:56:03 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -import java.util.*; - -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.adapter.*; - -/** Iterates through contours, module invokes, then include invokes. - * Used in GlyphFile display - * @author e.e - */ -public class GlyphIterator implements Iterator { - protected GlyphFile m_file; - private int m_index = 0; - protected List m_list = new ArrayList<>(); - - public GlyphIterator(GlyphFile a_file) { - m_file = a_file; - buildList(); - } - - protected void buildList() { - addIncludes(); - addContours(); - addModules(); - - } - - protected void addContours() { - XContour [] contours = m_file.getGlyph().getBody().getContour(); - for (int i = 0; i < contours.length; i++) { - m_list.add(contours[i]); - } // for i - } - - protected void addControlPoints() { - XContour [] contours = m_file.getGlyph().getBody().getContour(); - for (int i = 0; i < contours.length; i++) { - EContour contour = (EContour) contours[i]; - if (!contour.isCubic()) { - continue; - } // if - - addControlPoints(contour, 0, 0); - } // for i - } - - private void addControlPoints(PointAggregate a_object, double a_x, double a_y) { - XContourPoint [] points = a_object.getContourPoint(); - - for (int i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - - if (!isPointVisible(point)) { - continue; - } // if - - if (point.hasControlPoint1()) { - EControlPoint controlPoint = (EControlPoint) point.getControlPoint1(); - controlPoint.setOffset(a_x, a_y); - m_list.add(controlPoint); - } // if - - if (point.hasControlPoint2()) { - EControlPoint controlPoint = (EControlPoint) point.getControlPoint2(); - controlPoint.setOffset(a_x, a_y); - m_list.add(controlPoint); - } // if - } // for j - } - - protected void addHints() { - XContour [] contours = m_file.getGlyph().getBody().getContour(); - for (int i = 0; i < contours.length; i++) { - addHints((EContour) contours[i], 0, 0); - } // for i - - XModule [] modules = m_file.getGlyph().getBody().getModule(); - for (int i = 0; i < modules.length; i++) { - EModuleInvoke module = (EModuleInvoke) modules[i]; - double x = module.getInvoke().getInvokePos().getPoint2d().getX(); - double y = module.getInvoke().getInvokePos().getPoint2d().getY(); - - addHints(module, x, y); - } // for i - } - - private void addHints(PointAggregate a_object, double a_x, double a_y) { - XContourPoint [] points = a_object.getContourPoint(); - - for (int i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - - if (!isPointVisible(point)) { - continue; - } // if - - if (point.hasHintForCurrentPpem()) { - EHint hint = point.getCurrentHint(); - hint.setOffset(a_x, a_y); - m_list.add(hint); - } // if - - if (point.hasControlPoint1()) { - EContourPoint p = (EContourPoint) point.getControlPoint1().getContourPoint(); - if (p.hasHintForCurrentPpem()) { - EHint hint = p.getCurrentHint(); - hint.setOffset(a_x, a_y); - m_list.add(hint); - } // if - } - - if (point.hasControlPoint2()) { - EContourPoint p = (EContourPoint) point.getControlPoint2().getContourPoint(); - if (p.hasHintForCurrentPpem()) { - EHint hint = p.getCurrentHint(); - hint.setOffset(a_x, a_y); - m_list.add(hint); - } // if - } // if - } // for j - } - - private boolean isPointVisible(EContourPoint a_point) { - if (m_file.getPointHost() == null) { - return true; - } // if - - if (m_file.getPointHost() == a_point.getParent()) { - return true; - } // if - - return false; - } - - protected void addPoints() { - XContour [] contours = m_file.getGlyph().getBody().getContour(); - for (int i = 0; i < contours.length; i++) { - addPoints((EContour) contours[i], 0, 0); - } // for i - - XModule [] modules = m_file.getGlyph().getBody().getModule(); - for (int i = 0; i < modules.length; i++) { - EModuleInvoke module = (EModuleInvoke) modules[i]; - double x = module.getInvoke().getInvokePos().getPoint2d().getX(); - double y = module.getInvoke().getInvokePos().getPoint2d().getY(); - - addPoints(module, x, y); - } // for i - } - - private void addPoints(PointAggregate a_object, double a_x, double a_y) { - XContourPoint [] points = a_object.getContourPoint(); - - for (int i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - - if (!isPointVisible(point)) { - continue; - } // if - - point.setNumber(i); - point.setOffset(a_x, a_y); - m_list.add(point); - } // for j - } - - protected void addModules() { - XModule [] modules = m_file.getGlyph().getBody().getModule(); - for (int i = 0; i < modules.length; i++) { - m_list.add(modules[i]); - } // for i - } - - protected void addIncludes() { - XInclude [] includes = m_file.getGlyph().getBody().getInclude(); - for (int i = 0; i < includes.length; i++) { - m_list.add(includes[i]); - } // for i; - } - - /* (non-Javadoc) - * @see java.util.Iterator#remove() - */ - public void remove() { - - } - - /* (non-Javadoc) - * @see java.util.Iterator#hasNext() - */ - public boolean hasNext() { - return m_index < m_list.size(); - } - - /* (non-Javadoc) - * @see java.util.Iterator#next() - */ - public Object next() { - return m_list.get(m_index++); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphModule.java b/libsrc/ttf/src/org/doubletype/ossa/module/GlyphModule.java deleted file mode 100644 index 0027252aa..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/GlyphModule.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * $Id: GlyphModule.java,v 1.12 2004/09/04 21:54:19 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -import org.doubletype.ossa.adapter.*; -import org.doubletype.ossa.*; -import java.util.*; - -/** - * @author e.e - */ -public class GlyphModule implements VarStackFrame { - protected VarStack m_stack = VarStack.getSingletonInstance(); - private Hashtable m_vars = new Hashtable<>(); - protected ActiveList m_actives = ActiveList.getSingletonInstance(); - - // -------------------------------------------------------------- - - public GlyphModule() { - } - - public Hashtable getVars() { - return m_vars; - } - - // for var stack frame - public boolean hasVariable(String a_name) { - return m_vars.containsKey(a_name); - } - - // for var stack frame. - public double getValue(String a_name) { - Double d = (Double) m_vars.get(a_name); - return d.doubleValue(); - } - - // for var stack frame. - public void beforePush() { - } - - /** - * Base for generating contours from modules. - * @param a_moduleInvoke - * @return XContour object which represents the module. - */ - public EContour toContour(EModuleInvoke a_moduleInvoke) { - throw new RuntimeException("Unimplemented contour creation."); - } - - public void addVar(String a_name, double a_value) { - m_vars.put(a_name, new Double(a_value)); - } - - public int getMinimumPointCount() { - return 2; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/Rectangle.java b/libsrc/ttf/src/org/doubletype/ossa/module/Rectangle.java deleted file mode 100644 index 813dfcbb8..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/Rectangle.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * $Id: Rectangle.java,v 1.16 2004/09/04 21:54:19 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.adapter.*; - -import java.awt.geom.*; - -/** - * @author e.e - * - */ -public class Rectangle extends GlyphModule { - public static final double k_defaultPen = 68.0; - public static final double k_defaultWeight = 1.0; - public static final String k_weight = "weight"; - - public Rectangle() { - super(); - - addVar(k_weight, k_defaultWeight); - } - - public EContour toContour(EModuleInvoke a_moduleInvoke) { - int i; - EContour retval = new EContour(); - XContourPoint[] points = a_moduleInvoke.getContourPoint(); - - // can't make rectangle with one or zero point - if (points.length < 2) { - retval.addContourPoint(new EContourPoint(0, 0, true)); - return retval; - } // if - - double pen = m_stack.get(k_weight) * k_defaultPen; - boolean steeps[] = new boolean[points.length - 1]; - double thetas[] = new double[points.length - 1]; - Point2D outStartPoints[] = new Point2D[points.length - 1]; - Point2D inStartPoints[] = new Point2D[points.length - 1]; - Point2D outPoints [] = new Point2D[points.length]; - Point2D inPoints[] = new Point2D[points.length]; - - // treat each segment as a vector (start point and theta) - for (i = 0; i < points.length - 1; i++) { - EContourPoint start = (EContourPoint) points[i]; - EContourPoint end = (EContourPoint) points[i + 1]; - - // calculate theta of the vector - double theta; - if (start.toPoint2D().distance(end.toPoint2D()) > 0) { - theta = Math.atan2(end.getY() - start.getY(), - end.getX() - start.getX()); - } else { - theta = 0.0; - } // if - - thetas[i] = theta; - outStartPoints[i] = start.toPoint2D(); - - // turn the vector 90 degrees clockwise to create the - // starting point of the parallel vector (in-vector) - inStartPoints[i] = new Point2D.Double(start.getX() + (pen * Math.cos(theta - Math.PI / 2)), - start.getY() + (pen * Math.sin(theta - Math.PI / 2)) ); - } // for i - - for (i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - - if (i == 0) { - // dynamically generate the point using vertical line thru p0 and the ideal line. - double cuttingTheta; - if (isSteep(thetas[i])) { - cuttingTheta = 0.0; - } else { - cuttingTheta = Math.PI / 2; - } // if-else - - outPoints[i] = getIntersection(point.toPoint2D(), cuttingTheta, - outStartPoints[i], thetas[i]); - inPoints[i] = getIntersection(point.toPoint2D(), cuttingTheta, - inStartPoints[i], thetas[i]); - continue; - } else if (i == points.length - 1) { - // vertial and ideal. - double cuttingTheta; - if (isSteep(thetas[i - 1])) { - cuttingTheta = 0.0; - } else { - cuttingTheta = Math.PI / 2; - } // if - - outPoints[i] = getIntersection(point.toPoint2D(), cuttingTheta, - outStartPoints[i - 1], thetas[i - 1]); - inPoints[i] = getIntersection(point.toPoint2D(), cuttingTheta, - inStartPoints[i - 1], thetas[i - 1]); - - continue; - } // if - - if (thetas[i - 1] != thetas[i]) { - outPoints[i] = getIntersection(outStartPoints[i - 1], thetas[i - 1], - outStartPoints[i], thetas[i]); - inPoints[i] = getIntersection(inStartPoints[i - 1], thetas[i - 1], - inStartPoints[i], thetas[i]); - } else { - outPoints[i] = outStartPoints[i]; - inPoints[i] = inStartPoints[i]; - } // if - } // for i - - for (i = 0; i < points.length; i++) { - EContourPoint point = (EContourPoint) points[i]; - - retval.addContourPoint(i, point.cloneAt(outPoints[i])); - retval.addContourPoint(i + 1, point.cloneAt(inPoints[i])); - } // if - - return retval; - } - - private boolean isSteep(double a_theta) { - return (a_theta > (Math.PI / 4) && a_theta < (3 * Math.PI / 4)) - || (a_theta < (-Math.PI / 4) && a_theta > (-3 * Math.PI / 4)); - } - - /** - * Intersection of two lines line0 and line1, defined by a point and slope. - * @param a_p0 a point line0 goes thru. - * @param a_theta0 the slope of line0, given in radian. - * @param a_p1 a point line1 goes thru. - * @param a_theta1 the slope of line1, given in radian. - * @return the intersection of line0 and line1, if any; a_p1, otherwise. - */ - private Point2D getIntersection(Point2D a_p0, double a_theta0, - Point2D a_p1, double a_theta1) { - Point2D retval = new Point2D.Double(); - retval.setLocation(a_p1); - - if (a_theta0 == a_theta1) - return retval; - - double cos0 = Math.cos(a_theta0); - double sin0 = Math.sin(a_theta0); - double cos1 = Math.cos(a_theta1); - double sin1 = Math.sin(a_theta1); - double deltaX = a_p1.getX() - a_p0.getX(); - double deltaY = a_p1.getY() - a_p0.getY(); - - double r1 = (cos0 * deltaY - sin0 * deltaX) - / (sin0 * cos1 - cos0 * sin1); - double x = a_p1.getX() + cos1 * r1; - double y = a_p1.getY() + sin1 * r1; - - retval.setLocation(x, y); - - return retval; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/SelectionIterator.java b/libsrc/ttf/src/org/doubletype/ossa/module/SelectionIterator.java deleted file mode 100644 index 14bb377b4..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/SelectionIterator.java +++ /dev/null @@ -1,69 +0,0 @@ - /* - * $Id: SelectionIterator.java,v 1.2 2004/11/08 06:29:52 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -import java.util.*; - -import org.doubletype.ossa.adapter.*; -import org.doubletype.ossa.xml.IRNode; - - -/** - * @author e.e - */ -public class SelectionIterator extends GlyphIterator implements Iterator { - - /** - * @param a_file - */ - public SelectionIterator(GlyphFile a_file) { - super(a_file); - } - - protected void buildList() { - super.buildList(); - - List reverseList = new ArrayList<>(); - for (int i = m_list.size() - 1; i >= 0; i--) { - IRNode object = m_list.get(i); - - - reverseList.add(object); - } // for i - - m_list = reverseList; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java b/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java index b08e580e3..fe5e3824a 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java +++ b/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java @@ -37,8 +37,6 @@ import java.io.*; import java.util.*; import org.doubletype.ossa.*; -import org.doubletype.ossa.xml.*; -import org.doubletype.ossa.adapter.*; import org.doubletype.ossa.truetype.*; import java.awt.*; import java.util.List; @@ -54,23 +52,29 @@ public class TypefaceFile extends GlyphFile { private final double k_defaultBottomSideBearing = 0; // 0 px private final double k_em = 1024; private final int k_defaultAdvanceWidth = 512; - private final String k_dotDtyp = ".dtyp"; private final String k_dotTtf = ".ttf"; private File m_dir; - private Hashtable m_nameToIndeces = new Hashtable<>(); private File m_ttfFile; private Font m_font = null; - private File m_binFolder; - private Map m_glyphFiles = new HashMap<>(); - + private List m_glyphFiles = new ArrayList<>(); + private List m_unicodeRanges = new ArrayList<>(); + private List m_codePages = new ArrayList<>(); + private String m_fontFamilyName; + private String m_subFamily; + private String m_version; + private Double m_topSideBearing = null; + private Double m_ascender = null; + private Double m_xHeight = null; + private Double m_descender = null; + private Double m_bottomSideBearing = null; + private String m_name; + public TypefaceFile(String a_name, File a_dir) throws FileNotFoundException { - super(TypefaceFile.class.getResource(s_emptyFileName)); + super(a_dir); m_dir = a_dir; - setGlyphTitle(a_name); - - m_fileName = new File(m_dir, a_name + k_dotDtyp); + m_name = a_name; initFileName(); } @@ -78,62 +82,61 @@ public class TypefaceFile extends GlyphFile { super(a_file); m_dir = a_file.getParentFile(); - m_fileName = a_file; + m_name = a_file.getName(); initFileName(); } private void initFileName() { - m_binFolder = new File(m_dir, "bin"); - if (!m_binFolder.exists()) { - m_binFolder.mkdir(); - } // if - String fileName = getGlyphTitle() + k_dotTtf; - m_ttfFile = new File(m_binFolder, fileName); + String fileName = m_name + k_dotTtf; + m_ttfFile = new File(m_dir, fileName); } public GlyphFile createGlyph(long a_unicode) { - String name = Character.getName((int) a_unicode); - if (name == null) { - name = "NAC_" + Long.toHexString(a_unicode); - } // if - - name = name.replace(' ', '_'); - return new GlyphFile( - getGlyphPath(), name, a_unicode); + return new GlyphFile(getGlyphPath(), a_unicode); } + private GlyphFile getGlyphFileByUnicode(long code) { + for (GlyphFile glyphFile : m_glyphFiles) { + if (glyphFile.getUnicode() == code) { + return glyphFile; + } + } + + return null; + } + public boolean addRequiredGlyphs() { boolean retval = false; - if (unicodeToFileName(TTUnicodeRange.k_notDef) == null) { - GlyphFile glyph = new GlyphFile(getGlyphPath(), "NOTDEF", TTUnicodeRange.k_notDef); + if (getGlyphFileByUnicode(TTUnicodeRange.k_notDef) == null) { + GlyphFile glyph = new GlyphFile(getGlyphPath(), TTUnicodeRange.k_notDef); glyph.initNotDef(k_defaultAdvanceWidth); addGlyph(0, glyph); retval = true; - } // if + } - if (unicodeToFileName(TTUnicodeRange.k_null) == null) { - GlyphFile glyph = new GlyphFile(getGlyphPath(), "NULL", TTUnicodeRange.k_null); + if (getGlyphFileByUnicode(TTUnicodeRange.k_null) == null) { + GlyphFile glyph = new GlyphFile(getGlyphPath(), TTUnicodeRange.k_null); glyph.initNullGlyph(); addGlyph(1, glyph); retval = true; - } // if + } - if (unicodeToFileName(TTUnicodeRange.k_cr) == null) { - GlyphFile glyph = new GlyphFile(getGlyphPath(), "CR", TTUnicodeRange.k_cr); + if (getGlyphFileByUnicode(TTUnicodeRange.k_cr) == null) { + GlyphFile glyph = new GlyphFile(getGlyphPath(), TTUnicodeRange.k_cr); glyph.initSpace(k_defaultAdvanceWidth); addGlyph(2, glyph); retval = true; - } // if + } - if (unicodeToFileName(TTUnicodeRange.k_space) == null) { - GlyphFile glyph = new GlyphFile(getGlyphPath(), "SPACE", TTUnicodeRange.k_space); + if (getGlyphFileByUnicode(TTUnicodeRange.k_space) == null) { + GlyphFile glyph = new GlyphFile(getGlyphPath(), TTUnicodeRange.k_space); glyph.initSpace(k_defaultAdvanceWidth); addGlyph(3, glyph); retval = true; - } // if + } return retval; } @@ -146,175 +149,97 @@ public class TypefaceFile extends GlyphFile { for (long i = range.getStartCode(); i <= range.getEndCode(); i++) { if (i != 0x0020) { addGlyph(createGlyph(i)); - } // if - } // for i + } + } } public File getGlyphPath() { return m_dir; } - public String unicodeToFileName(long a_unicode) { - for (XGlyphFile glyphFile: m_glyph.getBody().getGlyphFile()) { - if (glyphFile.getUnicode() == a_unicode) { - return glyphFile.getHref(); - } // if - } // for i - - return null; - } - /** * change glyph's unicode mapping. * @param a_glyphFile * @param a_unicode */ public void setGlyphUnicode(GlyphFile a_glyphFile, long a_unicode) { - int i; - XGlyphFile [] glyphFiles = m_glyph.getBody().getGlyphFile(); - for (i = 0; i < glyphFiles.length; i++) { - XGlyphFile glyphFile = glyphFiles[i]; - - if (glyphFile.getHref().equals( - a_glyphFile.getShortFileName())) { - continue; - } // if - - glyphFile.setUnicode(a_unicode); - a_glyphFile.setUnicode(Long.toHexString(a_unicode)); - - return; - } // for i + a_glyphFile.setUnicode(a_unicode); } public void addGlyph(GlyphFile a_file) { - String shortFileName = a_file.getShortFileName(); - m_glyphFiles.put(shortFileName, a_file); - XGlyphFile xglyphFile = new XGlyphFile(); - xglyphFile.setHref(shortFileName); - xglyphFile.setUnicode(a_file.getUnicodeAsLong()); - m_glyph.getBody().addGlyphFile(xglyphFile); + m_glyphFiles.add(a_file); } public void addGlyph(int a_index, GlyphFile a_file) { - String shortFileName = a_file.getShortFileName(); - m_glyphFiles.put(shortFileName, a_file); - XGlyphFile xglyphFile = new XGlyphFile(); - xglyphFile.setHref(shortFileName); - xglyphFile.setUnicode(a_file.getUnicodeAsLong()); - m_glyph.getBody().addGlyphFile(a_index, xglyphFile); - } - - public void removeGlyph(String a_fileName) { - for (XGlyphFile file: m_glyph.getBody().getGlyphFile()) { - if (file.getHref().equals(a_fileName)) { - m_glyph.getBody().removeGlyphFile(file); - return; - } // if - } - } - - public ArrayList getChildFileNames() { - ArrayList retval = new ArrayList<>(); - XGlyphFile [] files = m_glyph.getBody().getGlyphFile(); - - for (int i = 0; i < files.length; i++) { - XGlyphFile file = files[i]; - retval.add(file.getHref()); - } // for i - - return retval; + m_glyphFiles.add(a_index, a_file); } public Object [] getCodePages() { int i; Object [] retval; - String [] codePages = m_glyph.getHead().getCodePage(); - retval = new Object[codePages.length]; - for (i = 0; i < codePages.length; i++) { - retval[i] = codePages[i]; - } // for i + retval = new Object[0]; return retval; } public boolean containsUnicodeRange(String a_unicodeRange) { - int i; - String [] unicodeRanges = m_glyph.getHead().getUnicodeRange(); - - for (i = 0; i < unicodeRanges.length; i++) { - if (unicodeRanges[i].equals(a_unicodeRange)) { - return true; - } // if - } // for i - - return false; + return m_unicodeRanges.contains(a_unicodeRange); } public void addUnicodeRange(String a_unicodeRange) { if (containsUnicodeRange(a_unicodeRange)) { return; - } // if + } - m_glyph.getHead().addUnicodeRange(a_unicodeRange); + m_unicodeRanges.add(a_unicodeRange); } public boolean containsCodePage(String a_codePage) { - int i; - String [] codePages = m_glyph.getHead().getCodePage(); - - for (i = 0; i < codePages.length; i++) { - if (codePages[i].equals(a_codePage)) { - return true; - } // if - } // for i - - return false; + return m_codePages.contains(a_codePage); } public void addCodePage(String a_codePage) { if (containsCodePage(a_codePage)) { return; - } // if + } - m_glyph.getHead().addCodePage(a_codePage); + m_codePages.add(a_codePage); } public void removeCodePage(String a_codePage) { if (!containsCodePage(a_codePage)) { return; - } // if + } - m_glyph.getHead().removeCodePage(a_codePage); + m_codePages.remove(a_codePage); } public void setFontFamilyName(String a_value) { - m_glyph.getHead().setFontFamily(a_value); + m_fontFamilyName = a_value; } public String getFontFamilyName() { - return m_glyph.getHead().getFontFamily(); + return m_fontFamilyName; } public String getVersion() { - if (m_glyph.getHead().getVersion() == null) { - m_glyph.getHead().setVersion("0.1"); - } // if - - return m_glyph.getHead().getVersion(); + return m_version == null ? "0.1" : m_version; + } + + public void setVersion(String a_value) { + m_version = a_value; } public void setSubFamily(String a_value) { - m_glyph.getHead().setFontSubFamily(a_value); + m_subFamily = a_value; } public void setDefaultMetrics() { - XHead head = m_glyph.getHead(); - head.setTopSideBearing(k_defaultTopSideBearing); - head.setAscender(k_defaultAscender); - head.setXHeight(k_defaultXHeight); - head.setDescender(k_defaultDescender); - head.setBottomSideBearing(k_defaultBottomSideBearing); + m_topSideBearing = k_defaultTopSideBearing; + m_ascender = k_defaultAscender; + m_xHeight = k_defaultXHeight; + m_descender = k_defaultDescender; + m_bottomSideBearing = k_defaultBottomSideBearing; } public double getEm() { @@ -339,78 +264,78 @@ public class TypefaceFile extends GlyphFile { } public double getTopSideBearing() { - if (!m_glyph.getHead().checkTopSideBearing()) { + if (m_topSideBearing == null) { setDefaultMetrics(); - } // if + } - return m_glyph.getHead().getTopSideBearing(); + return m_topSideBearing; } public double getAscender() { - if (!m_glyph.getHead().checkAscender()) { + if (m_ascender == null) { setDefaultMetrics(); - } // if + } - return m_glyph.getHead().getAscender(); + return m_ascender; } public double getXHeight() { - if (!m_glyph.getHead().checkXHeight()) { + if (m_xHeight == null) { setDefaultMetrics(); - } // if + } - return m_glyph.getHead().getXHeight(); + return m_xHeight; } public double getDescender() { - if (!m_glyph.getHead().checkDescender()) { + if (m_descender == null) { setDefaultMetrics(); - } // if + } - return m_glyph.getHead().getDescender(); + return m_descender; } public double getBottomSideBearing() { - if (!m_glyph.getHead().checkBottomSideBearing()) { + if (m_bottomSideBearing == null) { setDefaultMetrics(); - } // if + } - return m_glyph.getHead().getBottomSideBearing(); + return m_bottomSideBearing; } public void setTopSideBearing(double a_value) throws OutOfRangeException { checkBoundary(a_value); - m_glyph.getHead().setTopSideBearing(a_value); + m_topSideBearing = a_value; } private void checkBoundary(double a_value) throws OutOfRangeException { if (a_value > k_em || a_value < 0) { throw new OutOfRangeException(a_value); - } // if + } } public void setAscender(double a_value) throws OutOfRangeException { checkBoundary(a_value); - m_glyph.getHead().setAscender(a_value); + m_ascender = a_value; } public void setXHeight(double a_value) throws OutOfRangeException { checkBoundary(a_value); if (a_value > getAscender()) { throw new OutOfRangeException(a_value); - } // if + } - m_glyph.getHead().setXHeight(a_value); + m_xHeight = a_value; } public void setDescender(double a_value) throws OutOfRangeException { checkBoundary(a_value); - m_glyph.getHead().setDescender(a_value); + m_descender = a_value; } public void setBottomSideBearing(double a_value) throws OutOfRangeException { checkBoundary(a_value); - m_glyph.getHead().setBottomSideBearing(a_value); + m_bottomSideBearing = a_value; } public double getBodyHeight() { @@ -422,27 +347,19 @@ public class TypefaceFile extends GlyphFile { /** * Calls FontFileWriter to produce TrueType font file. */ - public void buildTTF(boolean a_isDebug) throws Exception { + public void buildTTF() throws Exception { String randomString = UUID.randomUUID().toString().substring(0, 4); - File tempFile = new File(m_binFolder, - getGlyphTitle() + "_" + randomString + k_dotTtf); + File tempFile = new File(m_dir, + m_name + "_" + randomString + k_dotTtf); File target; String fontFamilyName; - if (a_isDebug) { - target = tempFile; - fontFamilyName = getGlyphTitle() + " " + randomString; - } else { - target = m_ttfFile; - fontFamilyName = getFontFamilyName(); - } // if-else + target = m_ttfFile; + fontFamilyName = getFontFamilyName(); target.delete(); FontFileWriter writer; - ModuleManager.getSingletonInstance().clear(); - m_stack.clear(); - m_stack.push(this); try (RandomAccessFile randomAccessFile = new RandomAccessFile(target, "rw")) { writer = new FontFileWriter(randomAccessFile); @@ -460,17 +377,14 @@ public class TypefaceFile extends GlyphFile { loadGlyphs(writer); writer.write(); } - if (!a_isDebug && target.exists()) { + if (target.exists()) { copyFile(target, tempFile); - } // if + } FileInputStream in = new FileInputStream(tempFile); m_font = Font.createFont(Font.TRUETYPE_FONT, (InputStream) in); in.close(); - - ModuleManager.getSingletonInstance().clear(); - m_stack.pop(); // pop this } private void copyFile(File a_in, File a_out) throws Exception { @@ -491,45 +405,30 @@ public class TypefaceFile extends GlyphFile { } private void loadCodePages(FontFileWriter a_writer) { - for (String codePageName: m_glyph.getHead().getCodePage()) { + for (String codePageName: m_codePages) { TTCodePage codePage = TTCodePage.forName(codePageName); if (codePage == null) { continue; - } // if + } a_writer.setCodeRangeFlag(codePage.getOsTwoFlag()); } // for codePageName } private void loadUnicodeRanges(FontFileWriter a_writer) { - String [] unicodeRanges = m_glyph.getHead().getUnicodeRange(); - int i; - for (i = 0; i < unicodeRanges.length; i++) { - if (!TTUnicodeRange.find(unicodeRanges[i])) { + for (String unicodeRange : m_unicodeRanges) { + if (!TTUnicodeRange.find(unicodeRange)) { continue; - } // if + } a_writer.addUnicodeRange(TTUnicodeRange.getLastFound()); - } // for i + } } private void loadGlyphs(FontFileWriter a_writer) throws Exception { - m_nameToIndeces.clear(); - - for (String fileName: getChildFileNames()) { - GlyphFile glyphFile = nameToGlyphFile(fileName); - loadGlyph(glyphFile, glyphFile, a_writer); - } // for - } - - private GlyphFile nameToGlyphFile(String a_fileName) throws FileNotFoundException { - if (!m_glyphFiles.containsKey(a_fileName)) { - throw new FileNotFoundException(a_fileName); - } // if - - GlyphFile retval = m_glyphFiles.get(a_fileName); - - return retval; + for (GlyphFile glyphFile : m_glyphFiles) { + loadGlyph(glyphFile, a_writer); + } } /** @@ -538,49 +437,35 @@ public class TypefaceFile extends GlyphFile { * @param a_writer * @throws Exception */ - private void loadGlyph(GlyphFile a_glyphFile, VarStackFrame a_frame, FontFileWriter a_writer) throws Exception { - if (m_nameToIndeces.containsKey(a_glyphFile.getShortFileName())) { - return; - } // if - - /* - if (a_glyphFile.getUnicodeAsLong() == TTUnicodeRange.k_null) { - return; - } // if - */ - + private void loadGlyph(GlyphFile a_glyphFile, FontFileWriter a_writer) throws Exception { TTGlyph glyph = null; - m_stack.push(a_frame); if (a_glyphFile.isSimple()) { // glyph will be null if it is empty glyph = a_glyphFile.toSimpleGlyph(); } else { glyph = createCompoundGlyph(a_glyphFile, a_writer); - } // if - - m_stack.pop(); + } if (glyph == null && a_glyphFile.isWhiteSpace()) { glyph = new TTGlyph(); - } // if + } if (glyph == null) { return; - } // if + } int glyphIndex = a_writer.addGlyph(glyph); - m_nameToIndeces.put(a_glyphFile.getShortFileName(), glyphIndex); - long unicode = a_glyphFile.getUnicodeAsLong(); + long unicode = a_glyphFile.getUnicode(); - if (unicode != -1 && glyph != null) { + if (unicode != -1) { long existingIndex = a_writer.getCharacterMapping(unicode); if (existingIndex != 0) { throw new Exception(Long.toHexString(unicode) + " is mapped already."); - } // if + } a_writer.addCharacterMapping(unicode, glyphIndex); - } // if + } } private TTGlyph createCompoundGlyph(GlyphFile a_glyphFile, @@ -599,25 +484,9 @@ public class TypefaceFile extends GlyphFile { locs.add(new Point(0, 0)); indeces.add(glyphIndex); - } // if + } - XInclude [] includes = a_glyphFile.m_glyph.getBody().getInclude(); - int i; - for (i = 0; i < includes.length; i++) { - EIncludeInvoke include = (EIncludeInvoke) includes[i]; - GlyphFile glyphFile = nameToGlyphFile(include.getHref()); - - // load the glyph included in this one - loadGlyph(glyphFile, include, a_writer); - Integer n = m_nameToIndeces.get(glyphFile.getShortFileName()); - if (n == null) { - continue; - } // if - - indeces.add(n); - XPoint2d pos = include.getInvoke().getInvokePos().getPoint2d(); - locs.add(new Point((int) pos.getX(), (int) pos.getY())); - } // for i + int i = 0; int flag = TTGlyph.ARG_1_AND_2_ARE_WORDS | TTGlyph.ARGS_ARE_XY_VALUES @@ -632,14 +501,14 @@ public class TypefaceFile extends GlyphFile { numOfCompositeContours += glyph.getNumOfCompositeContours(); if (glyph.getComponentDepth() > componentDepth) { componentDepth = glyph.getComponentDepth(); - } // if + } retval.addGlyfIndex(glyfIndex); if (i < indeces.size() - 1) { retval.addFlag(flag | TTGlyph.MORE_COMPONENTS); } else { retval.addFlag(flag); - } // if-else + } Point loc = locs.get(i); retval.addArg1(loc.x); diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/VarStack.java b/libsrc/ttf/src/org/doubletype/ossa/module/VarStack.java deleted file mode 100644 index 2f8526487..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/VarStack.java +++ /dev/null @@ -1,112 +0,0 @@ - /* - * $Id: VarStack.java,v 1.1 2004/04/21 10:54:41 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -import java.util.*; - -/** - * @author e.e - */ -public class VarStack { - private static VarStack s_varstack = null; - - public static VarStack getSingletonInstance() { - if (s_varstack == null) - s_varstack = new VarStack(); - - return s_varstack; - } - - // -------------------------------------------------------------- - - private ArrayList m_stack = new ArrayList<>(); - - // -------------------------------------------------------------- - - public void push(VarStackFrame a_frame) { - a_frame.beforePush(); - m_stack.add(a_frame); - } - - public VarStackFrame pop() { - VarStackFrame retval = peek(); - if (retval == null) { - return retval; - } // if - - m_stack.remove(retval); - - return retval; - } - - public VarStackFrame peek() { - if (m_stack.size() <= 0) { - return null; - } // if - - return (VarStackFrame) m_stack.get(m_stack.size() - 1); - } - - public void clear() { - m_stack.clear(); - } - - public int size() { - return m_stack.size(); - } - - /** - * goes through the var stack and returns the variable value - * @param a_name name of the variable - * @return the value of the variable - */ - public double get(String a_name) { - int i; - double retval = 0.0; - - for (i = 0; i < m_stack.size(); i++) { - VarStackFrame frame - = (VarStackFrame) m_stack.get(m_stack.size() - i - 1); - if (!frame.hasVariable(a_name)) { - continue; - } // if - - return frame.getValue(a_name); - } // for i - - return retval; - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/VarStackFrame.java b/libsrc/ttf/src/org/doubletype/ossa/module/VarStackFrame.java deleted file mode 100644 index aa27f9709..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/VarStackFrame.java +++ /dev/null @@ -1,53 +0,0 @@ - /* - * $Id: VarStackFrame.java,v 1.1 2004/04/21 10:55:02 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.module; - -/** - * @author e.e - */ -public interface VarStackFrame { - /** - * tests if the variable is declared in this module. - * @param a_name name of the variable - * @return true, if declared; false, otherwise. - */ - boolean hasVariable(String a_name); - double getValue(String a_name); - - /** fired before push by the var stack. - */ - void beforePush(); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/empty.glyph b/libsrc/ttf/src/org/doubletype/ossa/module/empty.glyph deleted file mode 100644 index 6fdefeb4d..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/module/empty.glyph +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - Nobody - 2004 - temp - Regular - All rights reserved. - - - - - - - - - - diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java index c752b193c..b76c0721e 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java @@ -93,7 +93,7 @@ public class CmapWriter extends FontFormatWriter { { m_unicodes.add(unicode); } // for unicode - } // for i + } m_startCodes.add(k_tableEnd); m_endCodes.add(k_tableEnd); @@ -106,7 +106,7 @@ public class CmapWriter extends FontFormatWriter { if (m_isIncludeVersion0) { storeVersion0(); - } // if + } storeVersion4(); reset(); @@ -118,19 +118,19 @@ public class CmapWriter extends FontFormatWriter { writeUInt16(TTName.k_macintosh); writeUInt16(TTName.k_macRomanEncode); writeUInt32(size() + 4 + 8); - } // if + } writeUInt16(TTName.k_microsoft); writeUInt16(TTName.k_winUnicodeEncode); int version4Offset = size() + 4; if (m_isIncludeVersion0) { version4Offset += m_version0.length; - } // if + } writeUInt32(version4Offset); if (m_isIncludeVersion0) { m_buffer.write(m_version0); - } // if + } m_buffer.write(m_version4); pad(); @@ -139,7 +139,7 @@ public class CmapWriter extends FontFormatWriter { private int getNumOfEncoding() { if (m_isIncludeVersion0) { return 2; - } // if + } return 1; } @@ -164,7 +164,7 @@ public class CmapWriter extends FontFormatWriter { if (m_unicode2glyph.containsKey(a_key)) { retval = m_unicode2glyph.get(a_key); - } // if + } return retval; } @@ -208,8 +208,8 @@ public class CmapWriter extends FontFormatWriter { } else { writeUInt8((int) getGlyfIndex((long) i)); - } // if - } // for i + } + } } private void writeVersion4() throws IOException { @@ -220,7 +220,7 @@ public class CmapWriter extends FontFormatWriter { for (i = 0; i < segCount; i++) { Long n = (Long) m_endCodes.get(i); writeUInt16(n.intValue()); - } // for i + } // reserverdPad writeUInt16(0); @@ -229,13 +229,13 @@ public class CmapWriter extends FontFormatWriter { for (i = 0; i < segCount; i++) { Long n = m_startCodes.get(i); writeUInt16(n.intValue()); - } // for i + } // idDelta for (i = 0; i < segCount; i++) { Long n = m_idDeltas.get(i); writeInt16(n.intValue()); - } // for i + } // idRangeOffset for (i = 0; i < segCount; i++) { @@ -247,7 +247,7 @@ public class CmapWriter extends FontFormatWriter { for (i = 0; i < m_unicodes.size(); i++) { Long unicode = m_unicodes.get(i); writeUInt16((int) getGlyfIndex(unicode)); - } // for i + } byte [] bytes = m_bytes.toByteArray(); @@ -287,7 +287,7 @@ public class CmapWriter extends FontFormatWriter { writeUInt32(startCharCode.get(i)); writeUInt32(endCharCode.get(i)); writeUInt32(startGlyphCode.get(i)); - } // for i + } } /** diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java index 78a4c2681..4d182d965 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java @@ -269,7 +269,7 @@ public class FontFileWriter extends FontFormatWriter { // padding is always 4 zeros for (int i = 0; i < 4; i++) { writeUInt8(0); - } // for i + } } private int getSearchRange(int a_value) { diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFormatWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFormatWriter.java index 2d2030cc8..c4f3dd3e0 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFormatWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFormatWriter.java @@ -1,173 +1,173 @@ -/* - * $Id: FontFormatWriter.java,v 1.6 2004/01/28 11:44:08 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * @author e.e - */ -public class FontFormatWriter { - protected DataOutputStream m_buffer; - protected ByteArrayOutputStream m_bytes; - private int m_offset; - - public FontFormatWriter() { - init(); - } - - protected void init() { - m_bytes = new ByteArrayOutputStream(); - m_buffer = new DataOutputStream(m_bytes); - m_offset = 0; - } - - public void write() throws IOException { - } - - public byte[] toByteArray() { - return m_bytes.toByteArray(); - } - - /** - * Size of buffer in bytes. - * @return size of buffer in bytes. - */ - public int size() { - return m_bytes.size(); - } - - public void reset() { - m_bytes.reset(); - } - - protected void writeFixed32(double a_value) throws IOException { - final int k_denom = 16384; - - short mantissa = (short) Math.floor(a_value); - int fraction = (int) ((a_value - mantissa) * k_denom); - if (fraction > k_denom) { - fraction = 0; - mantissa++; - } // if - - m_buffer.writeShort(mantissa); - m_buffer.writeShort(fraction); - } - - protected void writeUInt16(int a_value) throws IOException { - writeInt16((short) (0xffff & a_value)); - } - - protected void writeInt16(int a_value) throws IOException { - m_buffer.writeShort((short) a_value); - } - - protected void writeFWord(int a_value) throws IOException { - writeInt16(a_value); - } - - protected void writeUFWord(int a_value) throws IOException { - writeUInt16(a_value); - } - - protected void writeUInt32 (long a_value) throws IOException { - writeInt32((int) (0xffffffff & a_value)); - } - - protected void writeInt32(int a_value) throws IOException { - m_buffer.writeInt(a_value); - } - - protected void writeUInt8(int a_byte) throws IOException { - m_buffer.writeByte(a_byte); - } - - protected void writeTag(String a_value) throws IOException { - String s = a_value + " "; - - int i; - for (i = 0; i < 4; i++) { - writeUInt8(s.charAt(i)); - } // for i - } - - protected void writeLongDateTime(Date a_date) throws IOException { - long sec = a_date.getTime() / 1000; - sec += (1970 - 1904) * 365 * 24 * 60 * 60; - m_buffer.writeLong(sec); - } - - protected String getTag() { - throw new RuntimeException("unimplemnted call to getTag"); - } - - protected long getCheckSum() { - long retval = 0; - byte [] bytes = toByteArray(); - - for (int i = 0; i < bytes.length / 4; i++) { - long n = 0; - for (int j = 0; j < 4; j++) { - n += bytes[4 * i + j] << ((4 - j) * 8); - } // for j - retval += n; - } // for i - - return retval; - } - - protected void pad() throws IOException { - int align = 4; - int numOfPad = align - toByteArray().length % align; - if (numOfPad == align) - return; - - int i; - for (i = 0; i < numOfPad; i++) { - writeUInt8(0); - } // for i - } - - public int getOffset() { - return m_offset; - } - - public void setOffset(int a_value) { - m_offset = a_value; - } -} +/* + * $Id: FontFormatWriter.java,v 1.6 2004/01/28 11:44:08 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * @author e.e + */ +public class FontFormatWriter { + protected DataOutputStream m_buffer; + protected ByteArrayOutputStream m_bytes; + private int m_offset; + + public FontFormatWriter() { + init(); + } + + protected void init() { + m_bytes = new ByteArrayOutputStream(); + m_buffer = new DataOutputStream(m_bytes); + m_offset = 0; + } + + public void write() throws IOException { + } + + public byte[] toByteArray() { + return m_bytes.toByteArray(); + } + + /** + * Size of buffer in bytes. + * @return size of buffer in bytes. + */ + public int size() { + return m_bytes.size(); + } + + public void reset() { + m_bytes.reset(); + } + + protected void writeFixed32(double a_value) throws IOException { + final int k_denom = 16384; + + short mantissa = (short) Math.floor(a_value); + int fraction = (int) ((a_value - mantissa) * k_denom); + if (fraction > k_denom) { + fraction = 0; + mantissa++; + } + + m_buffer.writeShort(mantissa); + m_buffer.writeShort(fraction); + } + + protected void writeUInt16(int a_value) throws IOException { + writeInt16((short) (0xffff & a_value)); + } + + protected void writeInt16(int a_value) throws IOException { + m_buffer.writeShort((short) a_value); + } + + protected void writeFWord(int a_value) throws IOException { + writeInt16(a_value); + } + + protected void writeUFWord(int a_value) throws IOException { + writeUInt16(a_value); + } + + protected void writeUInt32 (long a_value) throws IOException { + writeInt32((int) (0xffffffff & a_value)); + } + + protected void writeInt32(int a_value) throws IOException { + m_buffer.writeInt(a_value); + } + + protected void writeUInt8(int a_byte) throws IOException { + m_buffer.writeByte(a_byte); + } + + protected void writeTag(String a_value) throws IOException { + String s = a_value + " "; + + int i; + for (i = 0; i < 4; i++) { + writeUInt8(s.charAt(i)); + } + } + + protected void writeLongDateTime(Date a_date) throws IOException { + long sec = a_date.getTime() / 1000; + sec += (1970 - 1904) * 365 * 24 * 60 * 60; + m_buffer.writeLong(sec); + } + + protected String getTag() { + throw new RuntimeException("unimplemnted call to getTag"); + } + + protected long getCheckSum() { + long retval = 0; + byte [] bytes = toByteArray(); + + for (int i = 0; i < bytes.length / 4; i++) { + long n = 0; + for (int j = 0; j < 4; j++) { + n += bytes[4 * i + j] << ((4 - j) * 8); + } // for j + retval += n; + } + + return retval; + } + + protected void pad() throws IOException { + int align = 4; + int numOfPad = align - m_bytes.size() % align; + if (numOfPad == align) + return; + + int i; + for (i = 0; i < numOfPad; i++) { + writeUInt8(0); + } + } + + public int getOffset() { + return m_offset; + } + + public void setOffset(int a_value) { + m_offset = a_value; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/GlyfWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/GlyfWriter.java index a0e650029..16b9ca46f 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/GlyfWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/GlyfWriter.java @@ -71,7 +71,7 @@ public class GlyfWriter extends FontFormatWriter { TTGlyph glyph = m_glyphs.get(i); writeGlyph(glyph); m_hdmx.updatePixelWidth(i, glyph); - } // for i + } m_loca.m_offsets.add(size()); } @@ -97,13 +97,13 @@ public class GlyfWriter extends FontFormatWriter { if (a_glyph == null) { return; - } // if + } if (a_glyph.isSimple()) { writeSimpleGlyph(a_glyph); } else { writeCompoundGlyph(a_glyph); - } // if-else + } pad(); } @@ -115,7 +115,7 @@ public class GlyfWriter extends FontFormatWriter { private void writeSimpleGlyph(TTGlyph a_glyph) throws IOException { if (a_glyph.getNumOfContours() == 0) { return; - } // if + } m_maxp.updateNumOfContours(a_glyph.getNumOfContours()); writeInt16(a_glyph.getNumOfContours()); @@ -124,7 +124,7 @@ public class GlyfWriter extends FontFormatWriter { int i; for (i = 0; i < a_glyph.getNumOfContours(); i++) { writeUInt16(a_glyph.getEndPoint(i)); - } // for i + } int numOfInst = a_glyph.getNumOfInstructions(); m_maxp.updateSizeOfInstructions(numOfInst); @@ -132,12 +132,12 @@ public class GlyfWriter extends FontFormatWriter { writeUInt16(numOfInst); for (i = 0; i < numOfInst; i++) { writeUInt8(a_glyph.getInstruction(i)); - } // for i + } for (i = 0; i < a_glyph.getNumOfFlags(); i++) { int flag = a_glyph.getFlag(i); writeUInt8(flag); - } // for i + } // update num of points m_maxp.updateNumOfPoints(a_glyph.getNumOfPoints()); @@ -148,7 +148,7 @@ public class GlyfWriter extends FontFormatWriter { writeInt16(point.x - lastX); lastX = point.x; - } // for i + } int lastY = 0; for (i = 0; i < a_glyph.getNumOfPoints(); i++) { @@ -156,7 +156,7 @@ public class GlyfWriter extends FontFormatWriter { writeInt16(point.y - lastY); lastY = point.y; - } // for i + } } /** @@ -181,7 +181,7 @@ public class GlyfWriter extends FontFormatWriter { writeUInt16(a_glyph.getGlyfIndex(i)); writeInt16(a_glyph.getArg1(i)); writeInt16(a_glyph.getArg2(i)); - } // for i + } } /** diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HdmxWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HdmxWriter.java index 1ba5a6c3f..83561fd20 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HdmxWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HdmxWriter.java @@ -1,117 +1,117 @@ -/* - * $Copyright: copyright (c) 2003-2008, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * HtmxWriter depends on GlyfWriter. - * - * @author e.e - */ -public class HdmxWriter extends FontFormatWriter { - static public int getNumOfPixelSizes() { - return TTPixelSize.getList().size(); - } - - static public ArrayList getPixelSizes() { - return TTPixelSize.getList(); - } - - private int m_numGlyphs = 98; // set by GlyfWriter - - public HdmxWriter() { - super(); - } - - /** set the number of glyphs in the font */ - public void setNumGlyphs(int a_value) { - m_numGlyphs = a_value; - - for (TTPixelSize pixelSize: getPixelSizes()) { - pixelSize.setPixelWidthsSize(a_value); - } // for pixelSize - } - - public void updatePixelWidth(int a_glyphIndex, TTGlyph a_glyph) { - double advanceWidth = a_glyph.getAdvanceWidth(); - double em = TTPixelSize.getEm(); - - for (TTPixelSize pixelSize: TTPixelSize.getList()) { - int width = (int) Math.round(((double) pixelSize.getPixel() * advanceWidth) / em); - pixelSize.setPixelWidth(a_glyphIndex, width); - } // pixelSize - } - - /** - * writes htmx record. - * The size of a device record is calculated to align it to 32bit boundary. - */ - public void write() throws IOException { - int numOfPads = 4 - ((m_numGlyphs + 2) % 4); - if (numOfPads == 4) { - numOfPads = 0; - } // if - int size = m_numGlyphs + 2 + numOfPads; // 2 comes from the ppem and max - - // format version number - writeInt16(0); - - // number of device records - writeInt16(getNumOfPixelSizes()); - //System.out.printf("num of pixel sizes %d\n", getNumOfPixelSizes()); - // size of device record - writeInt32(size); - //System.out.printf("num of glyphs %d\n", m_numGlyphs); - for (TTPixelSize pixelSize: getPixelSizes()) { - writeUInt8(pixelSize.getPixel()); - writeUInt8(pixelSize.getMaxPixelWidth()); - for (int pixelWidth: pixelSize.getPixelWidths()) { - writeUInt8(pixelWidth); - } // for pixelWidth - - for (int j = 0; j < numOfPads; j++) { - writeUInt8(0); - } // for j - } // for pixelSize - - pad(); - } - - protected String getTag() { - return "hdmx"; - } -} +/* + * $Copyright: copyright (c) 2003-2008, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * HtmxWriter depends on GlyfWriter. + * + * @author e.e + */ +public class HdmxWriter extends FontFormatWriter { + static public int getNumOfPixelSizes() { + return TTPixelSize.getList().size(); + } + + static public ArrayList getPixelSizes() { + return TTPixelSize.getList(); + } + + private int m_numGlyphs = 98; // set by GlyfWriter + + public HdmxWriter() { + super(); + } + + /** set the number of glyphs in the font */ + public void setNumGlyphs(int a_value) { + m_numGlyphs = a_value; + + for (TTPixelSize pixelSize: getPixelSizes()) { + pixelSize.setPixelWidthsSize(a_value); + } // for pixelSize + } + + public void updatePixelWidth(int a_glyphIndex, TTGlyph a_glyph) { + double advanceWidth = a_glyph.getAdvanceWidth(); + double em = TTPixelSize.getEm(); + + for (TTPixelSize pixelSize: TTPixelSize.getList()) { + int width = (int) Math.round(((double) pixelSize.getPixel() * advanceWidth) / em); + pixelSize.setPixelWidth(a_glyphIndex, width); + } // pixelSize + } + + /** + * writes htmx record. + * The size of a device record is calculated to align it to 32bit boundary. + */ + public void write() throws IOException { + int numOfPads = 4 - ((m_numGlyphs + 2) % 4); + if (numOfPads == 4) { + numOfPads = 0; + } + int size = m_numGlyphs + 2 + numOfPads; // 2 comes from the ppem and max + + // format version number + writeInt16(0); + + // number of device records + writeInt16(getNumOfPixelSizes()); + //System.out.printf("num of pixel sizes %d\n", getNumOfPixelSizes()); + // size of device record + writeInt32(size); + //System.out.printf("num of glyphs %d\n", m_numGlyphs); + for (TTPixelSize pixelSize: getPixelSizes()) { + writeUInt8(pixelSize.getPixel()); + writeUInt8(pixelSize.getMaxPixelWidth()); + for (int pixelWidth: pixelSize.getPixelWidths()) { + writeUInt8(pixelWidth); + } // for pixelWidth + + for (int j = 0; j < numOfPads; j++) { + writeUInt8(0); + } // for j + } // for pixelSize + + pad(); + } + + protected String getTag() { + return "hdmx"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java index 3b23d4e49..80c13c4f6 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java @@ -1,156 +1,156 @@ -/* - * $Id: HeadWriter.java,v 1.7 2004/09/26 09:15:48 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; -import java.awt.*; - -/** - * @author e.e - */ -public class HeadWriter extends FontFormatWriter { - static public final int k_yZeroIsBaseLine = 0x1; // bit 0 - static public final int k_xLeftMostBlackIsLsb = 0x2; // bit 1 - static public final int k_scaledPointDiffer = 0x4; // bit 2 - static public final int k_useIntegerScaling = 0x8; // bit 3 - - // used by microsoft - static public final int k_scaleLinear = 0x10; - - // for vertical fonts - static public final int k_xZeroIsBaseLine = 0x20; - // 0x40 - static public final int k_linguisticRendering = 0x80; - static public final int k_defaultMetamorphosis = 0x100; - static public final int k_rightToLeft = 0x200; - static public final int k_indicRearrangement = 0x400; - - - private final long k_magicNumber = 0x5f0f3cf5; - - private long m_checkSumAdjustment = 0; - private Point m_min = new Point(0, 0); - private Point m_max = new Point(0, 0); - - public HeadWriter() { - super(); - } - - void setCheckSumAdjustment(long a_value) { - m_checkSumAdjustment = a_value; - } - - public Point getMin() { - return m_min; - } - - public Point getMax() { - return m_max; - } - - public void updateMin(Point a_value) { - if (a_value.x < m_min.x) { - m_min.x = a_value.x; - } // if - - if (a_value.y < m_min.y) { - m_min.y = a_value.y; - } // if - } - - public void updateMax(Point a_value) { - if (a_value.x > m_max.x) { - m_max.x = a_value.x; - } // if - - if (a_value.y > m_max.y) { - m_max.y = a_value.y; - } // if - } - - public void write() throws IOException { - // table version number - writeFixed32(1.0); - - // fontRevision - writeFixed32(1.0); - - writeUInt32(m_checkSumAdjustment); - writeUInt32(k_magicNumber); - - // LSB is the distance from 0, 0 to the left of the glyph bounds. - // flags - writeUInt16(k_yZeroIsBaseLine - | k_xLeftMostBlackIsLsb - | k_scaledPointDiffer);; - - // unitsPerEm - writeUInt16(1024); - - // created, modified - writeLongDateTime(new Date()); - writeLongDateTime(new Date()); - - writeFWord(m_min.x); - writeFWord(m_min.y); - writeFWord(m_max.x); - writeFWord(m_max.y); - - // macStyle - writeUInt16(0); - - // lowestRecPPEM - writeUInt16(11); - - // font direction hint - // 2, for strongly left to right - // but also contains neutrals - writeInt16(2); - - // indexToLocFormat. 1, for long - writeInt16(1); - - // glyfDataFormat - writeInt16(0); - pad(); - } - - protected String getTag() { - return "head"; - } -} +/* + * $Id: HeadWriter.java,v 1.7 2004/09/26 09:15:48 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; +import java.awt.*; + +/** + * @author e.e + */ +public class HeadWriter extends FontFormatWriter { + static public final int k_yZeroIsBaseLine = 0x1; // bit 0 + static public final int k_xLeftMostBlackIsLsb = 0x2; // bit 1 + static public final int k_scaledPointDiffer = 0x4; // bit 2 + static public final int k_useIntegerScaling = 0x8; // bit 3 + + // used by microsoft + static public final int k_scaleLinear = 0x10; + + // for vertical fonts + static public final int k_xZeroIsBaseLine = 0x20; + // 0x40 + static public final int k_linguisticRendering = 0x80; + static public final int k_defaultMetamorphosis = 0x100; + static public final int k_rightToLeft = 0x200; + static public final int k_indicRearrangement = 0x400; + + + private final long k_magicNumber = 0x5f0f3cf5; + + private long m_checkSumAdjustment = 0; + private Point m_min = new Point(0, 0); + private Point m_max = new Point(0, 0); + + public HeadWriter() { + super(); + } + + void setCheckSumAdjustment(long a_value) { + m_checkSumAdjustment = a_value; + } + + public Point getMin() { + return m_min; + } + + public Point getMax() { + return m_max; + } + + public void updateMin(Point a_value) { + if (a_value.x < m_min.x) { + m_min.x = a_value.x; + } + + if (a_value.y < m_min.y) { + m_min.y = a_value.y; + } + } + + public void updateMax(Point a_value) { + if (a_value.x > m_max.x) { + m_max.x = a_value.x; + } + + if (a_value.y > m_max.y) { + m_max.y = a_value.y; + } + } + + public void write() throws IOException { + // table version number + writeFixed32(1.0); + + // fontRevision + writeFixed32(1.0); + + writeUInt32(m_checkSumAdjustment); + writeUInt32(k_magicNumber); + + // LSB is the distance from 0, 0 to the left of the glyph bounds. + // flags + writeUInt16(k_yZeroIsBaseLine + | k_xLeftMostBlackIsLsb + | k_scaledPointDiffer);; + + // unitsPerEm + writeUInt16(1024); + + // created, modified + writeLongDateTime(new Date()); + writeLongDateTime(new Date()); + + writeFWord(m_min.x); + writeFWord(m_min.y); + writeFWord(m_max.x); + writeFWord(m_max.y); + + // macStyle + writeUInt16(0); + + // lowestRecPPEM + writeUInt16(11); + + // font direction hint + // 2, for strongly left to right + // but also contains neutrals + writeInt16(2); + + // indexToLocFormat. 1, for long + writeInt16(1); + + // glyfDataFormat + writeInt16(0); + pad(); + } + + protected String getTag() { + return "head"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java index 7c75f8748..8320314fe 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java @@ -1,108 +1,108 @@ -/* - * $Id: HheaWriter.java,v 1.5 2004/09/26 09:15:48 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; - -/** - * HheaWriter depends on HtmxWriter. - * @author e.e - */ -public class HheaWriter extends FontFormatWriter { - private GlyfWriter m_glyf; - private HeadWriter m_head; - - private int m_lineGap = 0; - private int m_maxAdvanceWidth = 0; - private int m_minRightSideBearing = 0; - - public HheaWriter(GlyfWriter a_glyf, HeadWriter a_head) { - super(); - - m_glyf = a_glyf; - m_head = a_head; - } - - public void setLineGap(int a_value) { - m_lineGap = a_value; - } - - public void setMaxAdvanceWidth(int a_value) { - m_maxAdvanceWidth = a_value; - } - - public void setMinRightSideBearing(int a_value) { - m_minRightSideBearing = a_value; - } - - public void write() throws IOException { - // table version number - writeFixed32(1.0); - - writeFWord(m_head.getMax().y); - writeFWord(m_head.getMin().y); - writeFWord(m_lineGap); - writeUFWord(m_maxAdvanceWidth); - - int minLeftSideBearing = m_head.getMin().x; - writeFWord(minLeftSideBearing); - writeFWord(m_minRightSideBearing); - - int xMaxExtent = m_head.getMax().x - m_head.getMin().x; - writeFWord(xMaxExtent); - - // caratSlopeRise - writeInt16(1); - writeInt16(0); - - // reserved - for (int i = 0; i < 5; i++) { - writeInt16(0); - } // for i - - writeInt16(0); - - int numOfHMetrics = m_glyf.numOfGlyph(); - writeUInt16(numOfHMetrics); - - pad(); - } - - protected String getTag() { - return "hhea"; - } -} +/* + * $Id: HheaWriter.java,v 1.5 2004/09/26 09:15:48 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; + +/** + * HheaWriter depends on HtmxWriter. + * @author e.e + */ +public class HheaWriter extends FontFormatWriter { + private GlyfWriter m_glyf; + private HeadWriter m_head; + + private int m_lineGap = 0; + private int m_maxAdvanceWidth = 0; + private int m_minRightSideBearing = 0; + + public HheaWriter(GlyfWriter a_glyf, HeadWriter a_head) { + super(); + + m_glyf = a_glyf; + m_head = a_head; + } + + public void setLineGap(int a_value) { + m_lineGap = a_value; + } + + public void setMaxAdvanceWidth(int a_value) { + m_maxAdvanceWidth = a_value; + } + + public void setMinRightSideBearing(int a_value) { + m_minRightSideBearing = a_value; + } + + public void write() throws IOException { + // table version number + writeFixed32(1.0); + + writeFWord(m_head.getMax().y); + writeFWord(m_head.getMin().y); + writeFWord(m_lineGap); + writeUFWord(m_maxAdvanceWidth); + + int minLeftSideBearing = m_head.getMin().x; + writeFWord(minLeftSideBearing); + writeFWord(m_minRightSideBearing); + + int xMaxExtent = m_head.getMax().x - m_head.getMin().x; + writeFWord(xMaxExtent); + + // caratSlopeRise + writeInt16(1); + writeInt16(0); + + // reserved + for (int i = 0; i < 5; i++) { + writeInt16(0); + } + + writeInt16(0); + + int numOfHMetrics = m_glyf.numOfGlyph(); + writeUInt16(numOfHMetrics); + + pad(); + } + + protected String getTag() { + return "hhea"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HmtxWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HmtxWriter.java index f8a487329..f74bab3d2 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HmtxWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HmtxWriter.java @@ -1,89 +1,89 @@ -/* - * $Id: HmtxWriter.java,v 1.10 2004/10/04 02:25:39 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; - -/** - * HtmxWriter depends on GlyfWriter. - * - * @author e.e - */ -public class HmtxWriter extends FontFormatWriter { - HheaWriter m_hhea; - GlyfWriter m_glyf; - - public HmtxWriter(GlyfWriter a_glyf, HheaWriter a_hhea) { - super(); - - m_hhea = a_hhea; - m_glyf = a_glyf; - } - - public void write() throws IOException { - int i; - - TTGlyph glyphZero = m_glyf.getGlyph(0); - int maxWidth = glyphZero.getAdvanceWidth(); - int minRightSideBearing = glyphZero.getRightSideBearing(); - for (i = 0; i < m_glyf.numOfGlyph(); i++) { - TTGlyph glyph = m_glyf.getGlyph(i); - - if (glyph.getAdvanceWidth() > maxWidth) { - maxWidth = glyph.getAdvanceWidth(); - } // if - - if (glyph.getRightSideBearing() < minRightSideBearing) { - minRightSideBearing = glyph.getRightSideBearing(); - } // if - - writeUFWord(glyph.getAdvanceWidth()); - writeFWord(glyph.getLeftSideBearing()); - } // for i - - writeFWord(0); - - m_hhea.setMaxAdvanceWidth(maxWidth); - m_hhea.setMinRightSideBearing(minRightSideBearing); - - pad(); - } - - protected String getTag() { - return "hmtx"; - } -} +/* + * $Id: HmtxWriter.java,v 1.10 2004/10/04 02:25:39 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; + +/** + * HtmxWriter depends on GlyfWriter. + * + * @author e.e + */ +public class HmtxWriter extends FontFormatWriter { + HheaWriter m_hhea; + GlyfWriter m_glyf; + + public HmtxWriter(GlyfWriter a_glyf, HheaWriter a_hhea) { + super(); + + m_hhea = a_hhea; + m_glyf = a_glyf; + } + + public void write() throws IOException { + int i; + + TTGlyph glyphZero = m_glyf.getGlyph(0); + int maxWidth = glyphZero.getAdvanceWidth(); + int minRightSideBearing = glyphZero.getRightSideBearing(); + for (i = 0; i < m_glyf.numOfGlyph(); i++) { + TTGlyph glyph = m_glyf.getGlyph(i); + + if (glyph.getAdvanceWidth() > maxWidth) { + maxWidth = glyph.getAdvanceWidth(); + } + + if (glyph.getRightSideBearing() < minRightSideBearing) { + minRightSideBearing = glyph.getRightSideBearing(); + } + + writeUFWord(glyph.getAdvanceWidth()); + writeFWord(glyph.getLeftSideBearing()); + } + + writeFWord(0); + + m_hhea.setMaxAdvanceWidth(maxWidth); + m_hhea.setMinRightSideBearing(minRightSideBearing); + + pad(); + } + + protected String getTag() { + return "hmtx"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/LocaWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/LocaWriter.java index 4a2056d0b..857634e6b 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/LocaWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/LocaWriter.java @@ -1,67 +1,67 @@ -/* - * $Id: LocaWriter.java,v 1.3 2004/01/15 07:06:27 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * @author e.e - */ -public class LocaWriter extends FontFormatWriter { - public ArrayList m_offsets = new ArrayList<>(); - - public LocaWriter() { - super(); - } - - public void write() throws IOException { - // assume glyf table is already written, - // and offsets are stored in m_offsets - - int i; - for (i = 0; i < m_offsets.size(); i++) { - writeUInt32(m_offsets.get(i)); - } // for i - - pad(); - } - - protected String getTag() { - return "loca"; - } -} +/* + * $Id: LocaWriter.java,v 1.3 2004/01/15 07:06:27 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * @author e.e + */ +public class LocaWriter extends FontFormatWriter { + public ArrayList m_offsets = new ArrayList<>(); + + public LocaWriter() { + super(); + } + + public void write() throws IOException { + // assume glyf table is already written, + // and offsets are stored in m_offsets + + int i; + for (i = 0; i < m_offsets.size(); i++) { + writeUInt32(m_offsets.get(i)); + } + + pad(); + } + + protected String getTag() { + return "loca"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/MaxpWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/MaxpWriter.java index 16880ab29..b82b035b1 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/MaxpWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/MaxpWriter.java @@ -1,137 +1,137 @@ -/* - * $Id: MaxpWriter.java,v 1.11 2004/06/27 07:26:46 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; - -/** - * @author e.e - */ -public class MaxpWriter extends FontFormatWriter { - private int m_numGlyphs = 98; // set by GlyfWriter - private int m_maxPoints = 0; - private int m_maxContours = 0; - private int m_maxCompositePoints = 0; - private int m_maxCompositeContours = 0; - private int m_maxZones = 2; - private int m_maxTwilightPoints = 128; - private int m_maxStorage = 64; - private int m_maxFunctionDefs = 128; - private int m_maxInstructionDefs = 128; - private int m_maxStackElements = 128; - private int m_maxSizeOfInstructions = 128; - private int m_maxComponentElements = 128; - private int m_maxComponentDepth = 0; - - public MaxpWriter() { - super(); - } - - public void write() throws IOException { - writeFixed32(1.0); - writeUInt16(m_numGlyphs); - writeUInt16(m_maxPoints); - writeUInt16(m_maxContours); - writeUInt16(m_maxCompositePoints); - writeUInt16(m_maxCompositeContours); - writeUInt16(m_maxZones); - writeUInt16(m_maxTwilightPoints); - writeUInt16(m_maxStorage); - writeUInt16(m_maxFunctionDefs); - writeUInt16(m_maxInstructionDefs); - writeUInt16(m_maxStackElements); - writeUInt16(m_maxSizeOfInstructions); - writeUInt16(m_maxComponentElements); - writeUInt16(m_maxComponentDepth); - pad(); - } - - protected String getTag() { - return "maxp"; - } - - /** set the number of glyphs in the font */ - public void setNumGlyphs(int a_value) { - m_numGlyphs = a_value; - } - - /** update points in non-compound glyph */ - public void updateNumOfPoints(int a_value) { - if (a_value > m_maxPoints) { - m_maxPoints = a_value; - } // if - } - - /** update points in non-compound glyph */ - public void updateNumOfContours(int a_value) { - if (a_value > m_maxContours) { - m_maxContours = a_value; - } // if - } - - public void updateNumOfCompositePoints(int a_value) { - if (a_value > m_maxCompositePoints) { - m_maxCompositePoints = a_value; - } // if - } - - public void updateNumOfCompositeContours(int a_value) { - if (a_value > m_maxCompositeContours) { - m_maxCompositeContours = a_value; - } // if - } - - /** update byte count for glyph instructions */ - public void updateSizeOfInstructions(int a_value) { - if (a_value > m_maxSizeOfInstructions) { - m_maxSizeOfInstructions = a_value; - } // if - } - - public void updateNumOfComponentElements(int a_value) { - if (a_value > m_maxComponentElements) { - m_maxComponentElements = a_value; - } // if - } - - public void updateComponentDepth(int a_value) { - if (a_value > m_maxComponentDepth) { - m_maxComponentDepth = a_value; - } // if - } - -} +/* + * $Id: MaxpWriter.java,v 1.11 2004/06/27 07:26:46 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; + +/** + * @author e.e + */ +public class MaxpWriter extends FontFormatWriter { + private int m_numGlyphs = 98; // set by GlyfWriter + private int m_maxPoints = 0; + private int m_maxContours = 0; + private int m_maxCompositePoints = 0; + private int m_maxCompositeContours = 0; + private int m_maxZones = 2; + private int m_maxTwilightPoints = 128; + private int m_maxStorage = 64; + private int m_maxFunctionDefs = 128; + private int m_maxInstructionDefs = 128; + private int m_maxStackElements = 128; + private int m_maxSizeOfInstructions = 128; + private int m_maxComponentElements = 128; + private int m_maxComponentDepth = 0; + + public MaxpWriter() { + super(); + } + + public void write() throws IOException { + writeFixed32(1.0); + writeUInt16(m_numGlyphs); + writeUInt16(m_maxPoints); + writeUInt16(m_maxContours); + writeUInt16(m_maxCompositePoints); + writeUInt16(m_maxCompositeContours); + writeUInt16(m_maxZones); + writeUInt16(m_maxTwilightPoints); + writeUInt16(m_maxStorage); + writeUInt16(m_maxFunctionDefs); + writeUInt16(m_maxInstructionDefs); + writeUInt16(m_maxStackElements); + writeUInt16(m_maxSizeOfInstructions); + writeUInt16(m_maxComponentElements); + writeUInt16(m_maxComponentDepth); + pad(); + } + + protected String getTag() { + return "maxp"; + } + + /** set the number of glyphs in the font */ + public void setNumGlyphs(int a_value) { + m_numGlyphs = a_value; + } + + /** update points in non-compound glyph */ + public void updateNumOfPoints(int a_value) { + if (a_value > m_maxPoints) { + m_maxPoints = a_value; + } + } + + /** update points in non-compound glyph */ + public void updateNumOfContours(int a_value) { + if (a_value > m_maxContours) { + m_maxContours = a_value; + } + } + + public void updateNumOfCompositePoints(int a_value) { + if (a_value > m_maxCompositePoints) { + m_maxCompositePoints = a_value; + } + } + + public void updateNumOfCompositeContours(int a_value) { + if (a_value > m_maxCompositeContours) { + m_maxCompositeContours = a_value; + } + } + + /** update byte count for glyph instructions */ + public void updateSizeOfInstructions(int a_value) { + if (a_value > m_maxSizeOfInstructions) { + m_maxSizeOfInstructions = a_value; + } + } + + public void updateNumOfComponentElements(int a_value) { + if (a_value > m_maxComponentElements) { + m_maxComponentElements = a_value; + } + } + + public void updateComponentDepth(int a_value) { + if (a_value > m_maxComponentDepth) { + m_maxComponentDepth = a_value; + } + } + +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/NameWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/NameWriter.java index 37641a200..cfe93a533 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/NameWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/NameWriter.java @@ -1,183 +1,183 @@ -/* - * $Id: NameWriter.java,v 1.9 2004/06/16 07:02:52 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * @author e.e - */ -public class NameWriter extends FontFormatWriter { - public static final String k_regular = "Regular"; - private static final String k_utf16be = "UTF-16BE"; - private static final String k_iso8859_1 = "ISO-8859-1"; - - String m_copyright = "\u00A9 Copyright"; - String m_familyName = "Temp"; - String m_subFamilyName = k_regular; - String m_unique = "eed3si9n: Temp Regular: 2003"; - String m_fullFontName = "Temp"; - String m_version = "0.00"; - String m_psName = "Temp"; - String m_tradeMark = ""; - String m_manufacturer = "eed3si9n"; - String m_year = "2004"; - String m_sample = "The quick brown fox jumps over the lazy dog."; - - private ArrayList m_names = new ArrayList<>(); - - public NameWriter() { - super(); - } - - private void prepare() { - m_copyright = "\u00A9 Copyright " - + m_year - + ", " - + m_manufacturer - + "."; - m_unique = "dtype: " - + m_manufacturer + ": " - + m_familyName + " " - + m_subFamilyName + ": " - + "Version " + m_version + ": " - + m_year; - m_fullFontName = m_familyName; - m_psName = m_fullFontName; - - if (m_tradeMark.length() == 0) { - m_tradeMark = "n/a"; - } // if - - m_names.clear(); - addNames(); - } - - private void addNames() { - addMacintoshRomanEnglish(0, m_copyright); - addMacintoshRomanEnglish(1, m_familyName); - addMacintoshRomanEnglish(2, m_subFamilyName); - addMacintoshRomanEnglish(3, m_unique); - addMacintoshRomanEnglish(4, m_fullFontName); - addMacintoshRomanEnglish(5, "Version " + m_version); - addMacintoshRomanEnglish(6, m_psName); - addMacintoshRomanEnglish(7, m_tradeMark); - addMacintoshRomanEnglish(8, m_manufacturer); - - addMicrosoftUnicodeEnglish(0, m_copyright); - addMicrosoftUnicodeEnglish(1, m_familyName); - addMicrosoftUnicodeEnglish(2, m_subFamilyName); - addMicrosoftUnicodeEnglish(3, m_unique); - addMicrosoftUnicodeEnglish(4, m_fullFontName); - addMicrosoftUnicodeEnglish(5, "Version " + m_version); - addMicrosoftUnicodeEnglish(6, m_psName); - addMicrosoftUnicodeEnglish(7, m_tradeMark); - addMicrosoftUnicodeEnglish(8, m_manufacturer); - // addMicrosoftUnicodeEnglish(19, m_sample); - } - - private void addMacintoshRomanEnglish(int a_nameId, String a_value) { - try { - add(TTName.k_macintosh, - TTName.k_macRomanEncode, - TTName.k_macEnglishLang, - a_nameId, - a_value.getBytes(k_iso8859_1)); - } - catch (IOException e) { - e.printStackTrace(); - } // try-catch - } - - private void addMicrosoftUnicodeEnglish(int a_nameId, String a_value) { - try { - add(TTName.k_microsoft, - TTName.k_winUnicodeEncode, - TTName.k_winEnglishLang, - a_nameId, - a_value.getBytes(k_utf16be)); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - private void add(int a_platformId, int a_encodingId, int a_languageId, - int a_nameId, byte a_bytes[]) { - TTName name = new TTName(a_platformId, - a_encodingId, - a_languageId, - a_nameId, - a_bytes); - m_names.add(name); - } - - public void write() throws IOException { - prepare(); - - // table version number - writeUInt16(0); - - // number of name records - writeUInt16(m_names.size()); - - // Offset to start of string storage (from start of table). - writeUInt16(12 * m_names.size() + 6); - - int offset = 0; - for (TTName name: m_names) { - writeUInt16(name.getPlatformId()); - writeUInt16(name.getEncodingId()); - writeUInt16(name.getLanguageId()); - writeUInt16(name.getNameId()); - writeUInt16(name.getStringLength()); - writeUInt16(offset); - offset += name.getStringLength(); - } // for i - - for (TTName name: m_names) { - m_buffer.write(name.getBytes()); - } // for i - - pad(); - } - - protected String getTag() { - return "name"; - } -} +/* + * $Id: NameWriter.java,v 1.9 2004/06/16 07:02:52 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * @author e.e + */ +public class NameWriter extends FontFormatWriter { + public static final String k_regular = "Regular"; + private static final String k_utf16be = "UTF-16BE"; + private static final String k_iso8859_1 = "ISO-8859-1"; + + String m_copyright = "\u00A9 Copyright"; + String m_familyName = "Temp"; + String m_subFamilyName = k_regular; + String m_unique = "eed3si9n: Temp Regular: 2003"; + String m_fullFontName = "Temp"; + String m_version = "0.00"; + String m_psName = "Temp"; + String m_tradeMark = ""; + String m_manufacturer = "eed3si9n"; + String m_year = "2004"; + String m_sample = "The quick brown fox jumps over the lazy dog."; + + private ArrayList m_names = new ArrayList<>(); + + public NameWriter() { + super(); + } + + private void prepare() { + m_copyright = "\u00A9 Copyright " + + m_year + + ", " + + m_manufacturer + + "."; + m_unique = "dtype: " + + m_manufacturer + ": " + + m_familyName + " " + + m_subFamilyName + ": " + + "Version " + m_version + ": " + + m_year; + m_fullFontName = m_familyName; + m_psName = m_fullFontName; + + if (m_tradeMark.length() == 0) { + m_tradeMark = "n/a"; + } + + m_names.clear(); + addNames(); + } + + private void addNames() { + addMacintoshRomanEnglish(0, m_copyright); + addMacintoshRomanEnglish(1, m_familyName); + addMacintoshRomanEnglish(2, m_subFamilyName); + addMacintoshRomanEnglish(3, m_unique); + addMacintoshRomanEnglish(4, m_fullFontName); + addMacintoshRomanEnglish(5, "Version " + m_version); + addMacintoshRomanEnglish(6, m_psName); + addMacintoshRomanEnglish(7, m_tradeMark); + addMacintoshRomanEnglish(8, m_manufacturer); + + addMicrosoftUnicodeEnglish(0, m_copyright); + addMicrosoftUnicodeEnglish(1, m_familyName); + addMicrosoftUnicodeEnglish(2, m_subFamilyName); + addMicrosoftUnicodeEnglish(3, m_unique); + addMicrosoftUnicodeEnglish(4, m_fullFontName); + addMicrosoftUnicodeEnglish(5, "Version " + m_version); + addMicrosoftUnicodeEnglish(6, m_psName); + addMicrosoftUnicodeEnglish(7, m_tradeMark); + addMicrosoftUnicodeEnglish(8, m_manufacturer); + // addMicrosoftUnicodeEnglish(19, m_sample); + } + + private void addMacintoshRomanEnglish(int a_nameId, String a_value) { + try { + add(TTName.k_macintosh, + TTName.k_macRomanEncode, + TTName.k_macEnglishLang, + a_nameId, + a_value.getBytes(k_iso8859_1)); + } + catch (IOException e) { + e.printStackTrace(); + } // try-catch + } + + private void addMicrosoftUnicodeEnglish(int a_nameId, String a_value) { + try { + add(TTName.k_microsoft, + TTName.k_winUnicodeEncode, + TTName.k_winEnglishLang, + a_nameId, + a_value.getBytes(k_utf16be)); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private void add(int a_platformId, int a_encodingId, int a_languageId, + int a_nameId, byte a_bytes[]) { + TTName name = new TTName(a_platformId, + a_encodingId, + a_languageId, + a_nameId, + a_bytes); + m_names.add(name); + } + + public void write() throws IOException { + prepare(); + + // table version number + writeUInt16(0); + + // number of name records + writeUInt16(m_names.size()); + + // Offset to start of string storage (from start of table). + writeUInt16(12 * m_names.size() + 6); + + int offset = 0; + for (TTName name: m_names) { + writeUInt16(name.getPlatformId()); + writeUInt16(name.getEncodingId()); + writeUInt16(name.getLanguageId()); + writeUInt16(name.getNameId()); + writeUInt16(name.getStringLength()); + writeUInt16(offset); + offset += name.getStringLength(); + } + + for (TTName name: m_names) { + m_buffer.write(name.getBytes()); + } + + pad(); + } + + protected String getTag() { + return "name"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java index 54cf6a398..c846bff26 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java @@ -1,242 +1,242 @@ -/* - * $Id: OS2Writer.java,v 1.11 2004/10/04 02:25:39 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; - -/** - * @author e.e - */ -public class OS2Writer extends FontFormatWriter { - final int FW_THIN = 100; - final int FW_EXTRALIGHT = 200; - final int FW_LIGHT = 300; - final int FW_NORMAL = 400; - final int FW_MEDIUM = 500; - final int FW_SEMIBOLD = 600; - final int FW_BOLD = 700; - final int FW_EXTRABOLD = 800; - final int FW_BLACK = 900; - - final int FWIDTH_NORMAL = 5; - - final int k_editableEmbedding = 0x0008; - - final int k_sansSerif = 0x0800; - - // unicode - final int k_basicLatin = 0x0001; - final int k_latin1Supplement = 0x0002; - - final int k_regular = 0x40; - final int k_basicLatinStart = 0x0020; - final int k_basciLatinEnd = 0x007e; - - private HeadWriter m_head; - - int m_xAvgCharWidth = 512; - int m_usWeightClass = FW_NORMAL; - int m_usWidthClass = FWIDTH_NORMAL; - int m_fsType = 0; - int m_ySubscriptXSize = 128; - int m_ySubscriptYSize = 128; - int m_ySubscriptXOffset = 0; - int m_ySubscriptYOffset = -64; - int m_ySuperscriptXSize = 128; - int m_ySuperscriptYSize = 128; - int m_ySuperscriptXOffset = 0; - int m_ySuperscriptYOffset = 64; - int m_yStrikeoutSize = 51; - int m_yStrikeoutPosition = 512; - int m_sFamilyClass = k_sansSerif; - - long m_ulUnicodeRange1 = k_basicLatin | k_latin1Supplement; - long m_ulUnicodeRange2 = 0; - long m_ulUnicodeRange3 = 0; - long m_ulUnicodeRange4 = 0; - String m_vendId = "dtyp"; - int m_fsSelection = k_regular; - int m_usFirstCharIndex = k_basicLatinStart; - int m_usLastCharIndex = k_basciLatinEnd; - private int m_sTypoAscender = 1024; - private int m_sTypoDescender = 0; - private int m_sTypoLineGap = 0; - private int m_usWinAscent = 1024; - private int m_usWinDescent = 0; - long m_ulCodePageRange1 = 0; - long m_ulCodePageRange2 = 0; - private int m_sxHeight = 512; - private int m_sCapHeight = 1024; - int m_usDefaultChar = 0x0; - int m_usBreakChar = 0x20; - int m_usMaxContext = 1; - - public OS2Writer(HeadWriter a_head) { - super(); - - m_head = a_head; - } - - public void setCapHeight(int a_value) { - m_sCapHeight = a_value; - } - - public void setXHeight(int a_value) { - m_sxHeight = a_value; - } - - public void setTypoAscender(int a_value) { - m_sTypoAscender = a_value; - } - - public void setTypoDescender(int a_value) { - m_sTypoDescender = a_value; - } - - public void setTypoLineGap(int a_value) { - m_sTypoLineGap = a_value; - } - - public void setUnicodeRangeFlag(int a_pos) { - int which = a_pos / 32; - int where = a_pos % 32; - long what = 0x1 << where; - - switch (which) { - case 0: { - m_ulUnicodeRange1 |= what; - } break; - - case 1: { - m_ulUnicodeRange2 |= what; - } break; - - case 2: { - m_ulUnicodeRange3 |= what; - } break; - - case 3: { - m_ulUnicodeRange4 |= what; - } break; - } // switch - } - - public void setCodePageRangeFlag(int a_pos) { - int which = a_pos / 32; - int where = a_pos % 32; - long what = 0x1 << where; - - switch (which) { - case 0: { - m_ulCodePageRange1 |= what; - } break; - - case 1: { - m_ulCodePageRange2 |= what; - } break; - } // switch - } - - public void write() throws IOException { - m_usWinAscent = m_head.getMax().y; - m_usWinDescent = 0; - if (m_head.getMin().y < 0) { - m_usWinDescent = -m_head.getMin().y; - } // if - - // table version number - writeUInt16(0x02); - - writeInt16(m_xAvgCharWidth); - writeUInt16(m_usWeightClass); - writeUInt16(m_usWidthClass); - writeInt16(m_fsType); - writeInt16(m_ySubscriptXSize); - writeInt16(m_ySubscriptYSize); - writeInt16(m_ySubscriptXOffset); - writeInt16(m_ySubscriptYOffset); - writeInt16(m_ySuperscriptXSize); - writeInt16(m_ySuperscriptYSize); - writeInt16(m_ySuperscriptXOffset); - writeInt16(m_ySuperscriptYOffset); - writeInt16(m_yStrikeoutSize); - writeInt16(m_yStrikeoutPosition); - writeInt16(m_sFamilyClass); - - writePanose(); - - writeUInt32(m_ulUnicodeRange1); - writeUInt32(m_ulUnicodeRange2); - writeUInt32(m_ulUnicodeRange3); - writeUInt32(m_ulUnicodeRange4); - writeTag(m_vendId); - writeUInt16(m_fsSelection); - writeUInt16(m_usFirstCharIndex); - writeUInt16(m_usLastCharIndex); - writeUInt16(m_sTypoAscender); - writeUInt16(m_sTypoDescender); - writeUInt16(m_sTypoLineGap); - writeUInt16(m_usWinAscent); - writeUInt16(m_usWinDescent); - writeUInt32(m_ulCodePageRange1); - writeUInt32(m_ulCodePageRange2); - writeInt16(m_sxHeight); - writeInt16(m_sCapHeight); - writeUInt16(m_usDefaultChar); - writeUInt16(m_usBreakChar); - writeUInt16(m_usMaxContext); - - pad(); - } - - private void writePanose() throws IOException { - writeUInt8(0); // family - writeUInt8(0); // serif - writeUInt8(0); // weight - writeUInt8(0); // proportion - writeUInt8(0); // contrast - writeUInt8(0); // stroke - writeUInt8(0); // arm style - writeUInt8(0); // letterform - writeUInt8(0); // midline - writeUInt8(0); // x-height - } - - protected String getTag() { - return "OS/2 "; - } -} +/* + * $Id: OS2Writer.java,v 1.11 2004/10/04 02:25:39 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; + +/** + * @author e.e + */ +public class OS2Writer extends FontFormatWriter { + final int FW_THIN = 100; + final int FW_EXTRALIGHT = 200; + final int FW_LIGHT = 300; + final int FW_NORMAL = 400; + final int FW_MEDIUM = 500; + final int FW_SEMIBOLD = 600; + final int FW_BOLD = 700; + final int FW_EXTRABOLD = 800; + final int FW_BLACK = 900; + + final int FWIDTH_NORMAL = 5; + + final int k_editableEmbedding = 0x0008; + + final int k_sansSerif = 0x0800; + + // unicode + final int k_basicLatin = 0x0001; + final int k_latin1Supplement = 0x0002; + + final int k_regular = 0x40; + final int k_basicLatinStart = 0x0020; + final int k_basciLatinEnd = 0x007e; + + private HeadWriter m_head; + + int m_xAvgCharWidth = 512; + int m_usWeightClass = FW_NORMAL; + int m_usWidthClass = FWIDTH_NORMAL; + int m_fsType = 0; + int m_ySubscriptXSize = 128; + int m_ySubscriptYSize = 128; + int m_ySubscriptXOffset = 0; + int m_ySubscriptYOffset = -64; + int m_ySuperscriptXSize = 128; + int m_ySuperscriptYSize = 128; + int m_ySuperscriptXOffset = 0; + int m_ySuperscriptYOffset = 64; + int m_yStrikeoutSize = 51; + int m_yStrikeoutPosition = 512; + int m_sFamilyClass = k_sansSerif; + + long m_ulUnicodeRange1 = k_basicLatin | k_latin1Supplement; + long m_ulUnicodeRange2 = 0; + long m_ulUnicodeRange3 = 0; + long m_ulUnicodeRange4 = 0; + String m_vendId = "dtyp"; + int m_fsSelection = k_regular; + int m_usFirstCharIndex = k_basicLatinStart; + int m_usLastCharIndex = k_basciLatinEnd; + private int m_sTypoAscender = 1024; + private int m_sTypoDescender = 0; + private int m_sTypoLineGap = 0; + private int m_usWinAscent = 1024; + private int m_usWinDescent = 0; + long m_ulCodePageRange1 = 0; + long m_ulCodePageRange2 = 0; + private int m_sxHeight = 512; + private int m_sCapHeight = 1024; + int m_usDefaultChar = 0x0; + int m_usBreakChar = 0x20; + int m_usMaxContext = 1; + + public OS2Writer(HeadWriter a_head) { + super(); + + m_head = a_head; + } + + public void setCapHeight(int a_value) { + m_sCapHeight = a_value; + } + + public void setXHeight(int a_value) { + m_sxHeight = a_value; + } + + public void setTypoAscender(int a_value) { + m_sTypoAscender = a_value; + } + + public void setTypoDescender(int a_value) { + m_sTypoDescender = a_value; + } + + public void setTypoLineGap(int a_value) { + m_sTypoLineGap = a_value; + } + + public void setUnicodeRangeFlag(int a_pos) { + int which = a_pos / 32; + int where = a_pos % 32; + long what = 0x1 << where; + + switch (which) { + case 0: { + m_ulUnicodeRange1 |= what; + } break; + + case 1: { + m_ulUnicodeRange2 |= what; + } break; + + case 2: { + m_ulUnicodeRange3 |= what; + } break; + + case 3: { + m_ulUnicodeRange4 |= what; + } break; + } // switch + } + + public void setCodePageRangeFlag(int a_pos) { + int which = a_pos / 32; + int where = a_pos % 32; + long what = 0x1 << where; + + switch (which) { + case 0: { + m_ulCodePageRange1 |= what; + } break; + + case 1: { + m_ulCodePageRange2 |= what; + } break; + } // switch + } + + public void write() throws IOException { + m_usWinAscent = m_head.getMax().y; + m_usWinDescent = 0; + if (m_head.getMin().y < 0) { + m_usWinDescent = -m_head.getMin().y; + } + + // table version number + writeUInt16(0x02); + + writeInt16(m_xAvgCharWidth); + writeUInt16(m_usWeightClass); + writeUInt16(m_usWidthClass); + writeInt16(m_fsType); + writeInt16(m_ySubscriptXSize); + writeInt16(m_ySubscriptYSize); + writeInt16(m_ySubscriptXOffset); + writeInt16(m_ySubscriptYOffset); + writeInt16(m_ySuperscriptXSize); + writeInt16(m_ySuperscriptYSize); + writeInt16(m_ySuperscriptXOffset); + writeInt16(m_ySuperscriptYOffset); + writeInt16(m_yStrikeoutSize); + writeInt16(m_yStrikeoutPosition); + writeInt16(m_sFamilyClass); + + writePanose(); + + writeUInt32(m_ulUnicodeRange1); + writeUInt32(m_ulUnicodeRange2); + writeUInt32(m_ulUnicodeRange3); + writeUInt32(m_ulUnicodeRange4); + writeTag(m_vendId); + writeUInt16(m_fsSelection); + writeUInt16(m_usFirstCharIndex); + writeUInt16(m_usLastCharIndex); + writeUInt16(m_sTypoAscender); + writeUInt16(m_sTypoDescender); + writeUInt16(m_sTypoLineGap); + writeUInt16(m_usWinAscent); + writeUInt16(m_usWinDescent); + writeUInt32(m_ulCodePageRange1); + writeUInt32(m_ulCodePageRange2); + writeInt16(m_sxHeight); + writeInt16(m_sCapHeight); + writeUInt16(m_usDefaultChar); + writeUInt16(m_usBreakChar); + writeUInt16(m_usMaxContext); + + pad(); + } + + private void writePanose() throws IOException { + writeUInt8(0); // family + writeUInt8(0); // serif + writeUInt8(0); // weight + writeUInt8(0); // proportion + writeUInt8(0); // contrast + writeUInt8(0); // stroke + writeUInt8(0); // arm style + writeUInt8(0); // letterform + writeUInt8(0); // midline + writeUInt8(0); // x-height + } + + protected String getTag() { + return "OS/2 "; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java index ecd99a16b..b7ac25959 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java @@ -1,76 +1,76 @@ -/* - * $Id: PostWriter.java,v 1.3 2004/01/11 13:14:45 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; - -/** - * @author e.e - */ -public class PostWriter extends FontFormatWriter { - boolean m_isMonospaced = false; - - public PostWriter() { - super(); - } - - public void write() throws IOException { - // table version number - writeFixed32(1.0); - writeFixed32(10.0); // italic angle - writeFWord(0); // underline pos - writeFWord(60); // underline thickness - - if (m_isMonospaced) { - writeUInt32(1); // fixed pitch - } else { - writeUInt32(0); - } // if - - // vm memory stuff - writeUInt32(0); - writeUInt32(0); - writeUInt32(0); - writeUInt32(0); - - pad(); - } - - protected String getTag() { - return "post"; - } -} +/* + * $Id: PostWriter.java,v 1.3 2004/01/11 13:14:45 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; + +/** + * @author e.e + */ +public class PostWriter extends FontFormatWriter { + boolean m_isMonospaced = false; + + public PostWriter() { + super(); + } + + public void write() throws IOException { + // table version number + writeFixed32(1.0); + writeFixed32(10.0); // italic angle + writeFWord(0); // underline pos + writeFWord(60); // underline thickness + + if (m_isMonospaced) { + writeUInt32(1); // fixed pitch + } else { + writeUInt32(0); + } + + // vm memory stuff + writeUInt32(0); + writeUInt32(0); + writeUInt32(0); + writeUInt32(0); + + pad(); + } + + protected String getTag() { + return "post"; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTCodePage.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTCodePage.java index ccf0398a0..b619a1e1c 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTCodePage.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTCodePage.java @@ -1,189 +1,189 @@ -/* - * $Id: TTCodePage.java,v 1.3 2004/05/16 12:59:07 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.truetype; - -import java.util.*; -import java.nio.charset.*; - -/** - * @author e.e - */ -public class TTCodePage { - static public TTCodePage US_ASCII = new TTCodePage("US-ASCII", - "US-ASCII", - 64); - static public TTCodePage Latin_1 = new TTCodePage("windows-1252", - "Latin 1 windows-1252", - 0); - static private boolean s_isInitialized = false; - static private ArrayList s_list = new ArrayList<>(); - - static public String [] getNames() { - initList(); - String [] retval = new String[s_list.size()]; - int i; - for (i = 0; i < s_list.size(); i++) { - TTCodePage codePage = (TTCodePage) s_list.get(i); - retval[i] = codePage.getName(); - } // for i - - return retval; - } - - static public TTCodePage forName(String a_name) { - initList(); - - TTCodePage retval = null; - for (TTCodePage codePage: s_list) { - if (codePage.getName().equals(a_name)) { - return codePage; - } - } // for - - for (TTCodePage codePage: s_list) { - if (codePage.getCharset() == null) { - continue; - } // if - - if (codePage.getCharset().name().equals(a_name)) { - return codePage; - } - } // for - - return retval; - } - - static private void initList() { - if (s_isInitialized) - return; - - s_isInitialized = true; - - s_list.add(US_ASCII); - s_list.add(Latin_1); - s_list.add(new TTCodePage("ISO-2022-JP", - "Japan-JIS", - 17)); - s_list.add(new TTCodePage("windows-1250", - "Latin 2: Eastern Europe windows-1250", - 1)); - s_list.add(new TTCodePage("windows-1251", - "Cyrillic windows-1251", - 2)); - s_list.add(new TTCodePage("windows-1253", - "Greek windows-1253", - 3)); - s_list.add(new TTCodePage("windows-1254", - "Turkish windows-1254", - 4)); - s_list.add(new TTCodePage("windows-1258", - "Vietnamese windows-1258", - 8)); - - - // extended - s_list.add(new TTCodePage("windows-1255", - "Hebrew windows-1255", - 5)); - s_list.add(new TTCodePage("windows-1256", - "Arabic windows-1256", - 6)); - s_list.add(new TTCodePage("windows-1257", - "Windows Baltic", - 7)); - - // TODO: 16 Thai 874 - s_list.add(new TTCodePage( - "Thai windows-874", - 16)); - - s_list.add(new TTCodePage("x-mswin-936", - "Chinese: Simplified", - 18)); - - // TODO: 19 Korean Wansung - s_list.add(new TTCodePage( - "Korean Wansung", - 19)); - - s_list.add(new TTCodePage("x-windows-950", - "Chinese: Traditional", - 20)); - } - - - private String m_name; - - /** http://www.microsoft.com/typography/otspec/os2.htm - */ - private int m_osTwoFlag = 0; - private Charset m_charset = null; - - public TTCodePage(String a_charsetName, String a_name, - int a_osTwoFlag) - { - if (Charset.isSupported(a_charsetName)) { - m_charset = Charset.forName(a_charsetName); - } // if - - m_name = a_name; - m_osTwoFlag = a_osTwoFlag; - } - - public TTCodePage(String a_name, - int a_osTwoFlag) - { - m_name = a_name; - m_osTwoFlag = a_osTwoFlag; - } - - public String toString() { - return m_name; - } - - public String getName() { - return m_name; - } - - - public Charset getCharset() { - return m_charset; - } - - public int getOsTwoFlag() { - return m_osTwoFlag; - } -} +/* + * $Id: TTCodePage.java,v 1.3 2004/05/16 12:59:07 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.truetype; + +import java.util.*; +import java.nio.charset.*; + +/** + * @author e.e + */ +public class TTCodePage { + static public TTCodePage US_ASCII = new TTCodePage("US-ASCII", + "US-ASCII", + 64); + static public TTCodePage Latin_1 = new TTCodePage("windows-1252", + "Latin 1 windows-1252", + 0); + static private boolean s_isInitialized = false; + static private ArrayList s_list = new ArrayList<>(); + + static public String [] getNames() { + initList(); + String [] retval = new String[s_list.size()]; + int i; + for (i = 0; i < s_list.size(); i++) { + TTCodePage codePage = (TTCodePage) s_list.get(i); + retval[i] = codePage.getName(); + } + + return retval; + } + + static public TTCodePage forName(String a_name) { + initList(); + + TTCodePage retval = null; + for (TTCodePage codePage: s_list) { + if (codePage.getName().equals(a_name)) { + return codePage; + } + } // for + + for (TTCodePage codePage: s_list) { + if (codePage.getCharset() == null) { + continue; + } + + if (codePage.getCharset().name().equals(a_name)) { + return codePage; + } + } // for + + return retval; + } + + static private void initList() { + if (s_isInitialized) + return; + + s_isInitialized = true; + + s_list.add(US_ASCII); + s_list.add(Latin_1); + s_list.add(new TTCodePage("ISO-2022-JP", + "Japan-JIS", + 17)); + s_list.add(new TTCodePage("windows-1250", + "Latin 2: Eastern Europe windows-1250", + 1)); + s_list.add(new TTCodePage("windows-1251", + "Cyrillic windows-1251", + 2)); + s_list.add(new TTCodePage("windows-1253", + "Greek windows-1253", + 3)); + s_list.add(new TTCodePage("windows-1254", + "Turkish windows-1254", + 4)); + s_list.add(new TTCodePage("windows-1258", + "Vietnamese windows-1258", + 8)); + + + // extended + s_list.add(new TTCodePage("windows-1255", + "Hebrew windows-1255", + 5)); + s_list.add(new TTCodePage("windows-1256", + "Arabic windows-1256", + 6)); + s_list.add(new TTCodePage("windows-1257", + "Windows Baltic", + 7)); + + // TODO: 16 Thai 874 + s_list.add(new TTCodePage( + "Thai windows-874", + 16)); + + s_list.add(new TTCodePage("x-mswin-936", + "Chinese: Simplified", + 18)); + + // TODO: 19 Korean Wansung + s_list.add(new TTCodePage( + "Korean Wansung", + 19)); + + s_list.add(new TTCodePage("x-windows-950", + "Chinese: Traditional", + 20)); + } + + + private String m_name; + + /** http://www.microsoft.com/typography/otspec/os2.htm + */ + private int m_osTwoFlag = 0; + private Charset m_charset = null; + + public TTCodePage(String a_charsetName, String a_name, + int a_osTwoFlag) + { + if (Charset.isSupported(a_charsetName)) { + m_charset = Charset.forName(a_charsetName); + } + + m_name = a_name; + m_osTwoFlag = a_osTwoFlag; + } + + public TTCodePage(String a_name, + int a_osTwoFlag) + { + m_name = a_name; + m_osTwoFlag = a_osTwoFlag; + } + + public String toString() { + return m_name; + } + + public String getName() { + return m_name; + } + + + public Charset getCharset() { + return m_charset; + } + + public int getOsTwoFlag() { + return m_osTwoFlag; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTGlyph.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTGlyph.java index de32707b3..775f0a977 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTGlyph.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTGlyph.java @@ -1,391 +1,391 @@ -/* - * $Copyright: copyright (c) 2003-2008, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.truetype; - -import java.awt.*; -import java.util.*; - -/** - * @author e.e - */ -public class TTGlyph { - // -------------------------------------------------------------- - public static final int k_onCurve = 0x1; - - public static final int ARG_1_AND_2_ARE_WORDS = 0x1; - public static final int ARGS_ARE_XY_VALUES = 0x2; - public static final int ROUND_XY_TO_GRID = 0x4; - public static final int WE_HAVE_A_SCALE = 0x8; - // 0x10 is obsolete - public static final int MORE_COMPONENTS = 0x20; - public static final int WE_HAVE_AN_X_AND_Y_SCALE = 0x40; - public static final int WE_HAVE_A_TWO_BY_TWO = 0x80; - public static final int WE_HAVE_INSTRUCTIONS = 0x100; - public static final int USE_MY_METRICS = 0x200; - public static final int OVERLAP_COMPOUND = 0x400; - - /** Move Direct Absolute Point - do not round */ - public static final int MDAP0 = 0x2E; - - /** Move Direct Absolute Point - round the value */ - public static final int MDAP1 = 0x2F; - - /** Interpolate Untouched Points through the outline - y-direction */ - public static final int IUP0 = 0x30; - - /** Interpolate Untouched Points through the outline - x-direction */ - public static final int IUP1 = 0x31; - - /** push one byte */ - public static final int PUSHB000 = 0xB0; - - /** push two bytes */ - public static final int PUSHB001 = 0xB1; - - /** push three bytes */ - public static final int PUSHB010 = 0xB2; - public static final int PUSHB011 = 0xB3; - public static final int PUSHB100 = 0xB4; - public static final int PUSHB101 = 0xB5; - public static final int PUSHB110 = 0xB6; - public static final int PUSHB111 = 0xB7; - - /** set vector to y-axis. */ - public static final int SVTCA0 = 0x00; - - /** set vector to x-axis. */ - public static final int SVTCA1 = 0x01; - public static final int SPVFS = 0x0A; // set projection vector - public static final int SFVFS = 0x0B; // set freedom vector - public static final int SFVTPV = 0x0E; - public static final int DELTAP1 = 0x5D; - public static final int DELTAP2 = 0x71; - public static final int DELTAP3 = 0x72; - - /** set delta base */ - public static final int SDB = 0x5E; - - // -------------------------------------------------------------- - - /** - * converts double into F2Dot14, 16 bit fixed point format. - * @param a_value - * @return - */ - public static int toF2Dot14(double a_value) { - int retval = 0; - - if (a_value >= 2.0 || a_value < -2.0) { - throw new RuntimeException(Double.toString(a_value) + " out of range"); - } // if - - int mantissa = (int) Math.floor(a_value); - int fraction = (int) Math.floor((a_value - mantissa) * 16384); - - int twoBitPart = mantissa; - if (mantissa < 0) { - twoBitPart = 4 + mantissa; - } // if - - retval = (twoBitPart << 14) | fraction; - - return retval; - } - - public static int toDeltaArg(int a_relativePpem, int a_step) { - int retval = 0; - - if (a_step < -8 || a_step > 8 || a_step == 0) { - throw new RuntimeException("Out of range"); - } // if - - int selector = 0; - if (a_step > 0) { - selector = a_step + 7; - } else { - selector = a_step + 8; - } // if - - retval = (a_relativePpem << 4) | (selector); - - return retval; - } - - // -------------------------------------------------------------- - - private ArrayList m_points = new ArrayList<>(); - private ArrayList m_endPtsOfContours = new ArrayList<>(); - private ArrayList m_instructions = new ArrayList<>(); - private ArrayList m_flags = new ArrayList<>(); - private ArrayList m_glyfIndeces = new ArrayList<>(); - private ArrayList m_arg1s = new ArrayList<>(); - private ArrayList m_arg2s = new ArrayList<>(); - - private boolean m_isSimple = true; - private int m_advanceWidth = 512; - - private int m_numOfCompositePoints = 0; - private int m_numOfCompositeContours = 0; - private int m_componentDepth = 0; - - private Point m_min = null; - private Point m_max = null; - - // -------------------------------------------------------------- - - public TTGlyph() { - init(); - } - - public void init() { - m_isSimple = true; - m_points.clear(); - m_endPtsOfContours.clear(); - m_instructions.clear(); - m_flags.clear(); - m_glyfIndeces.clear(); - m_arg1s.clear(); - m_arg2s.clear(); - m_advanceWidth = 512; - } - - public void buildCompound() { - init(); - - m_isSimple = false; - - addFlag(ARG_1_AND_2_ARE_WORDS - | ARGS_ARE_XY_VALUES - | ROUND_XY_TO_GRID - | MORE_COMPONENTS); - addFlag(ARG_1_AND_2_ARE_WORDS - | ARGS_ARE_XY_VALUES - | ROUND_XY_TO_GRID); - - addGlyfIndex(3); - addGlyfIndex(3); - - addArg1(0); - addArg2(0); - addArg1(0); - addArg2(500); - } - - /** - * add the index of the last point in the contour - * @param a_index - */ - public void addEndPoint(int a_value) { - m_endPtsOfContours.add(a_value); - } - - public int getNumOfContours() { - if (isSimple()) { - return m_endPtsOfContours.size(); - } else { - return -1; - } // if-else - } - - public int getEndPoint(int a_index) { - return m_endPtsOfContours.get(a_index); - } - - public int getAdvanceWidth() { - return m_advanceWidth; - } - - public void setAdvanceWidth(int a_value) { - m_advanceWidth = a_value; - } - - public Point getMax() { - if (m_max == null) { - m_max = new Point(0, 0); - } // if - - return m_max; - } - - public Point getMin() { - if (m_min == null) { - m_min = new Point(0, 0); - } // if - - return m_min; - } - - public boolean isSimple() { - return m_isSimple; - } - - public void setSimple(boolean a_isSimple) { - m_isSimple = a_isSimple; - } - - public void addInstruction(int a_value) { - m_instructions.add(a_value); - } - - public int getInstruction(int a_index) { - return m_instructions.get(a_index); - } - - public int getNumOfInstructions() { - return m_instructions.size(); - } - - public void addFlag(int a_value) { - m_flags.add(a_value); - } - - public int getFlag(int a_index) { - return m_flags.get(a_index); - } - - public int getNumOfFlags() { - return m_flags.size(); - } - - public void addPoint(Point a_value) { - m_points.add(a_value); - updateMinMax(a_value); - } - - private void updateMinMax(Point a_value) { - if (m_max == null) { - m_max = new Point(a_value); - } // if - - if (m_min == null) { - m_min = new Point(a_value); - } // if - - if (a_value.x > m_max.x) { - m_max.x = a_value.x; - } // if - - if (a_value.x < m_min.x) { - m_min.x = a_value.x; - } // if - - if (a_value.y > m_max.y) { - m_max.y = a_value.y; - } // if - - if (a_value.y < m_min.y) { - m_min.y = a_value.y; - } // if - } - - public Point getPoint(int a_index) { - return m_points.get(a_index); - } - - public int getNumOfPoints() { - return m_points.size(); - } - - public int getLastIndex() { - return m_points.size() - 1; - } - - public void addGlyfIndex(int a_value) { - m_glyfIndeces.add(a_value); - } - - public int getGlyfIndex(int a_index) { - return m_glyfIndeces.get(a_index); - } - - public void addArg1(int a_value) { - m_arg1s.add(a_value); - } - - public int getArg1(int a_index) { - return m_arg1s.get(a_index); - } - - public void addArg2(int a_value) { - m_arg2s.add(a_value); - } - - public int getArg2(int a_index) { - return m_arg2s.get(a_index); - } - - public int getNumOfCompositePoints() { - if (isSimple()) { - return getNumOfPoints(); - } else { - return m_numOfCompositePoints; - } - } - - public void setNumOfCompositePoints(int a_value) { - m_numOfCompositePoints = a_value; - } - - public int getNumOfCompositeContours() { - if (isSimple()) { - return getNumOfContours(); - } else { - return m_numOfCompositeContours; - } // if-else - } - - public void setNumOfCompositeContours(int a_value) { - m_numOfCompositeContours = a_value; - } - - public int getComponentDepth() { - if (isSimple()) { - return 0; - } else { - return m_componentDepth; - } // if-else - } - - public void setComponentDepth(int a_value) { - m_componentDepth = a_value; - } - - public int getLeftSideBearing() { - return getMin().x; - } - - public int getRightSideBearing() { - return getAdvanceWidth() - getMax().x; - } -} +/* + * $Copyright: copyright (c) 2003-2008, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.truetype; + +import java.awt.*; +import java.util.*; + +/** + * @author e.e + */ +public class TTGlyph { + // -------------------------------------------------------------- + public static final int k_onCurve = 0x1; + + public static final int ARG_1_AND_2_ARE_WORDS = 0x1; + public static final int ARGS_ARE_XY_VALUES = 0x2; + public static final int ROUND_XY_TO_GRID = 0x4; + public static final int WE_HAVE_A_SCALE = 0x8; + // 0x10 is obsolete + public static final int MORE_COMPONENTS = 0x20; + public static final int WE_HAVE_AN_X_AND_Y_SCALE = 0x40; + public static final int WE_HAVE_A_TWO_BY_TWO = 0x80; + public static final int WE_HAVE_INSTRUCTIONS = 0x100; + public static final int USE_MY_METRICS = 0x200; + public static final int OVERLAP_COMPOUND = 0x400; + + /** Move Direct Absolute Point - do not round */ + public static final int MDAP0 = 0x2E; + + /** Move Direct Absolute Point - round the value */ + public static final int MDAP1 = 0x2F; + + /** Interpolate Untouched Points through the outline - y-direction */ + public static final int IUP0 = 0x30; + + /** Interpolate Untouched Points through the outline - x-direction */ + public static final int IUP1 = 0x31; + + /** push one byte */ + public static final int PUSHB000 = 0xB0; + + /** push two bytes */ + public static final int PUSHB001 = 0xB1; + + /** push three bytes */ + public static final int PUSHB010 = 0xB2; + public static final int PUSHB011 = 0xB3; + public static final int PUSHB100 = 0xB4; + public static final int PUSHB101 = 0xB5; + public static final int PUSHB110 = 0xB6; + public static final int PUSHB111 = 0xB7; + + /** set vector to y-axis. */ + public static final int SVTCA0 = 0x00; + + /** set vector to x-axis. */ + public static final int SVTCA1 = 0x01; + public static final int SPVFS = 0x0A; // set projection vector + public static final int SFVFS = 0x0B; // set freedom vector + public static final int SFVTPV = 0x0E; + public static final int DELTAP1 = 0x5D; + public static final int DELTAP2 = 0x71; + public static final int DELTAP3 = 0x72; + + /** set delta base */ + public static final int SDB = 0x5E; + + // -------------------------------------------------------------- + + /** + * converts double into F2Dot14, 16 bit fixed point format. + * @param a_value + * @return + */ + public static int toF2Dot14(double a_value) { + int retval = 0; + + if (a_value >= 2.0 || a_value < -2.0) { + throw new RuntimeException(Double.toString(a_value) + " out of range"); + } + + int mantissa = (int) Math.floor(a_value); + int fraction = (int) Math.floor((a_value - mantissa) * 16384); + + int twoBitPart = mantissa; + if (mantissa < 0) { + twoBitPart = 4 + mantissa; + } + + retval = (twoBitPart << 14) | fraction; + + return retval; + } + + public static int toDeltaArg(int a_relativePpem, int a_step) { + int retval = 0; + + if (a_step < -8 || a_step > 8 || a_step == 0) { + throw new RuntimeException("Out of range"); + } + + int selector = 0; + if (a_step > 0) { + selector = a_step + 7; + } else { + selector = a_step + 8; + } + + retval = (a_relativePpem << 4) | (selector); + + return retval; + } + + // -------------------------------------------------------------- + + private ArrayList m_points = new ArrayList<>(); + private ArrayList m_endPtsOfContours = new ArrayList<>(); + private ArrayList m_instructions = new ArrayList<>(); + private ArrayList m_flags = new ArrayList<>(); + private ArrayList m_glyfIndeces = new ArrayList<>(); + private ArrayList m_arg1s = new ArrayList<>(); + private ArrayList m_arg2s = new ArrayList<>(); + + private boolean m_isSimple = true; + private int m_advanceWidth = 512; + + private int m_numOfCompositePoints = 0; + private int m_numOfCompositeContours = 0; + private int m_componentDepth = 0; + + private Point m_min = null; + private Point m_max = null; + + // -------------------------------------------------------------- + + public TTGlyph() { + init(); + } + + public void init() { + m_isSimple = true; + m_points.clear(); + m_endPtsOfContours.clear(); + m_instructions.clear(); + m_flags.clear(); + m_glyfIndeces.clear(); + m_arg1s.clear(); + m_arg2s.clear(); + m_advanceWidth = 512; + } + + public void buildCompound() { + init(); + + m_isSimple = false; + + addFlag(ARG_1_AND_2_ARE_WORDS + | ARGS_ARE_XY_VALUES + | ROUND_XY_TO_GRID + | MORE_COMPONENTS); + addFlag(ARG_1_AND_2_ARE_WORDS + | ARGS_ARE_XY_VALUES + | ROUND_XY_TO_GRID); + + addGlyfIndex(3); + addGlyfIndex(3); + + addArg1(0); + addArg2(0); + addArg1(0); + addArg2(500); + } + + /** + * add the index of the last point in the contour + * @param a_index + */ + public void addEndPoint(int a_value) { + m_endPtsOfContours.add(a_value); + } + + public int getNumOfContours() { + if (isSimple()) { + return m_endPtsOfContours.size(); + } else { + return -1; + } + } + + public int getEndPoint(int a_index) { + return m_endPtsOfContours.get(a_index); + } + + public int getAdvanceWidth() { + return m_advanceWidth; + } + + public void setAdvanceWidth(int a_value) { + m_advanceWidth = a_value; + } + + public Point getMax() { + if (m_max == null) { + m_max = new Point(0, 0); + } + + return m_max; + } + + public Point getMin() { + if (m_min == null) { + m_min = new Point(0, 0); + } + + return m_min; + } + + public boolean isSimple() { + return m_isSimple; + } + + public void setSimple(boolean a_isSimple) { + m_isSimple = a_isSimple; + } + + public void addInstruction(int a_value) { + m_instructions.add(a_value); + } + + public int getInstruction(int a_index) { + return m_instructions.get(a_index); + } + + public int getNumOfInstructions() { + return m_instructions.size(); + } + + public void addFlag(int a_value) { + m_flags.add(a_value); + } + + public int getFlag(int a_index) { + return m_flags.get(a_index); + } + + public int getNumOfFlags() { + return m_flags.size(); + } + + public void addPoint(Point a_value) { + m_points.add(a_value); + updateMinMax(a_value); + } + + private void updateMinMax(Point a_value) { + if (m_max == null) { + m_max = new Point(a_value); + } + + if (m_min == null) { + m_min = new Point(a_value); + } + + if (a_value.x > m_max.x) { + m_max.x = a_value.x; + } + + if (a_value.x < m_min.x) { + m_min.x = a_value.x; + } + + if (a_value.y > m_max.y) { + m_max.y = a_value.y; + } + + if (a_value.y < m_min.y) { + m_min.y = a_value.y; + } + } + + public Point getPoint(int a_index) { + return m_points.get(a_index); + } + + public int getNumOfPoints() { + return m_points.size(); + } + + public int getLastIndex() { + return m_points.size() - 1; + } + + public void addGlyfIndex(int a_value) { + m_glyfIndeces.add(a_value); + } + + public int getGlyfIndex(int a_index) { + return m_glyfIndeces.get(a_index); + } + + public void addArg1(int a_value) { + m_arg1s.add(a_value); + } + + public int getArg1(int a_index) { + return m_arg1s.get(a_index); + } + + public void addArg2(int a_value) { + m_arg2s.add(a_value); + } + + public int getArg2(int a_index) { + return m_arg2s.get(a_index); + } + + public int getNumOfCompositePoints() { + if (isSimple()) { + return getNumOfPoints(); + } else { + return m_numOfCompositePoints; + } + } + + public void setNumOfCompositePoints(int a_value) { + m_numOfCompositePoints = a_value; + } + + public int getNumOfCompositeContours() { + if (isSimple()) { + return getNumOfContours(); + } else { + return m_numOfCompositeContours; + } + } + + public void setNumOfCompositeContours(int a_value) { + m_numOfCompositeContours = a_value; + } + + public int getComponentDepth() { + if (isSimple()) { + return 0; + } else { + return m_componentDepth; + } + } + + public void setComponentDepth(int a_value) { + m_componentDepth = a_value; + } + + public int getLeftSideBearing() { + return getMin().x; + } + + public int getRightSideBearing() { + return getAdvanceWidth() - getMax().x; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTPixelSize.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTPixelSize.java index d81b15dc7..a417d40f3 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTPixelSize.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTPixelSize.java @@ -1,107 +1,107 @@ -package org.doubletype.ossa.truetype; - -import java.util.ArrayList; - -public class TTPixelSize { - static private int s_em = 1024; - static private boolean s_isInitialized = false; - static private ArrayList s_list = new ArrayList<>(); - - static public int getEm() { - return s_em; - } - - static public ArrayList getList() { - initList(); - return s_list; - } - - static private void initList() { - if (s_isInitialized) - return; - - s_isInitialized = true; - - // s_list.add(new TTPixelSize(9, "9px: 7pt(96dpi)/9pt(72dpi)")); - // s_list.add(new TTPixelSize(10, "10px: 7.5pt(96dpi)/10pt(72dpi)")); - s_list.add(new TTPixelSize(11, "11px: 8pt(96dpi)/11pt(72dpi)")); - s_list.add(new TTPixelSize(12, "12px: 9pt(96dpi)/12pt(72dpi)")); - s_list.add(new TTPixelSize(13, "13px: 10pt(96dpi)/13pt(72dpi)")); - s_list.add(new TTPixelSize(14, "14px: 10.5pt(96dpi)/14pt(72dpi)")); - s_list.add(new TTPixelSize(15, "15px: 11pt(96dpi)/15pt(72dpi)")); - s_list.add(new TTPixelSize(16, "16px: 12pt(96dpi)/16pt(72dpi)")); - s_list.add(new TTPixelSize(17, "17px: 13pt(96dpi)/17pt(72dpi)")); - s_list.add(new TTPixelSize(18, "18px: 13.5pt(96dpi)/18pt(72dpi)")); - s_list.add(new TTPixelSize(19, "19px: 14pt(96dpi)/14pt(72dpi)")); - s_list.add(new TTPixelSize(20, "20px: 15pt(96dpi)/20pt(72dpi)")); - s_list.add(new TTPixelSize(21, "21px: 16pt(96dpi)/21pt(72dpi)")); - s_list.add(new TTPixelSize(22, "22px: 16.5pt(96dpi)/22pt(72dpi)")); - s_list.add(new TTPixelSize(23, "23px: 17pt(96dpi)/23pt(72dpi)")); - s_list.add(new TTPixelSize(24, "24px: 18pt(96dpi)/24pt(72dpi)")); - s_list.add(new TTPixelSize(27, "27px: 20pt(96dpi)")); - s_list.add(new TTPixelSize(29, "29px: 22pt(96dpi)")); - s_list.add(new TTPixelSize(32, "32px: 24pt(96dpi)")); - s_list.add(new TTPixelSize(33, "33px: 8pt(300dpi) ")); - // s_list.add(new TTPixelSize(35, "35px: 26pt(96dpi) ")); - s_list.add(new TTPixelSize(37, "37px: 28pt(96dpi)")); - // s_list.add(new TTPixelSize(38, "38px: 9pt(300dpi)"); - s_list.add(new TTPixelSize(42, "42px: 10pt(300dpi)")); - // s_list.add(new TTPixelSize(44, "44px: 10.5pt(300dpi)")); - s_list.add(new TTPixelSize(46, "46px: 11pt(300dpi)")); - s_list.add(new TTPixelSize(50, "50px: 12pt(300dpi)")); - s_list.add(new TTPixelSize(54, "54px: 13pt(300dpi)")); - s_list.add(new TTPixelSize(58, "58px: 14pt(300dpi)")); - s_list.add(new TTPixelSize(67, "67px: 16pt(300dpi)")); - s_list.add(new TTPixelSize(75, "75px: 18pt(300dpi)")); - s_list.add(new TTPixelSize(83, "83px: 20pt(300dpi)")); - s_list.add(new TTPixelSize(92, "92px: 22pt(300dpi)")); - s_list.add(new TTPixelSize(100, "100px: 24pt(300dpi)")); - } - - private int m_pixel; - private String m_description; - private int m_pixelWidths[]; - private int m_maxPixelWidth = 0; - - public TTPixelSize(int a_pixel, String a_description) - { - m_pixel = a_pixel; - m_description = a_description; - } - - public int getPixel() { - return m_pixel; - } - - public String getDescription() { - return m_description; - } - - /** - * sets the size of the pixel widths. Use num of glyphs. - * @param a_size - */ - public void setPixelWidthsSize(int a_size) { - m_pixelWidths = new int[a_size]; - m_maxPixelWidth = 0; - } - - public void setPixelWidth(int a_glyphIndex, int a_value) { - m_pixelWidths[a_glyphIndex] = a_value; - if (a_value > m_maxPixelWidth) { - m_maxPixelWidth = a_value; - } // if - } - - public int [] getPixelWidths() { - return m_pixelWidths; - } - - public int getPixelWidth(int a_glyphIndex) { - return m_pixelWidths[a_glyphIndex]; - } - - public int getMaxPixelWidth() { - return m_maxPixelWidth; - } -} +package org.doubletype.ossa.truetype; + +import java.util.ArrayList; + +public class TTPixelSize { + static private int s_em = 1024; + static private boolean s_isInitialized = false; + static private ArrayList s_list = new ArrayList<>(); + + static public int getEm() { + return s_em; + } + + static public ArrayList getList() { + initList(); + return s_list; + } + + static private void initList() { + if (s_isInitialized) + return; + + s_isInitialized = true; + + // s_list.add(new TTPixelSize(9, "9px: 7pt(96dpi)/9pt(72dpi)")); + // s_list.add(new TTPixelSize(10, "10px: 7.5pt(96dpi)/10pt(72dpi)")); + s_list.add(new TTPixelSize(11, "11px: 8pt(96dpi)/11pt(72dpi)")); + s_list.add(new TTPixelSize(12, "12px: 9pt(96dpi)/12pt(72dpi)")); + s_list.add(new TTPixelSize(13, "13px: 10pt(96dpi)/13pt(72dpi)")); + s_list.add(new TTPixelSize(14, "14px: 10.5pt(96dpi)/14pt(72dpi)")); + s_list.add(new TTPixelSize(15, "15px: 11pt(96dpi)/15pt(72dpi)")); + s_list.add(new TTPixelSize(16, "16px: 12pt(96dpi)/16pt(72dpi)")); + s_list.add(new TTPixelSize(17, "17px: 13pt(96dpi)/17pt(72dpi)")); + s_list.add(new TTPixelSize(18, "18px: 13.5pt(96dpi)/18pt(72dpi)")); + s_list.add(new TTPixelSize(19, "19px: 14pt(96dpi)/14pt(72dpi)")); + s_list.add(new TTPixelSize(20, "20px: 15pt(96dpi)/20pt(72dpi)")); + s_list.add(new TTPixelSize(21, "21px: 16pt(96dpi)/21pt(72dpi)")); + s_list.add(new TTPixelSize(22, "22px: 16.5pt(96dpi)/22pt(72dpi)")); + s_list.add(new TTPixelSize(23, "23px: 17pt(96dpi)/23pt(72dpi)")); + s_list.add(new TTPixelSize(24, "24px: 18pt(96dpi)/24pt(72dpi)")); + s_list.add(new TTPixelSize(27, "27px: 20pt(96dpi)")); + s_list.add(new TTPixelSize(29, "29px: 22pt(96dpi)")); + s_list.add(new TTPixelSize(32, "32px: 24pt(96dpi)")); + s_list.add(new TTPixelSize(33, "33px: 8pt(300dpi) ")); + // s_list.add(new TTPixelSize(35, "35px: 26pt(96dpi) ")); + s_list.add(new TTPixelSize(37, "37px: 28pt(96dpi)")); + // s_list.add(new TTPixelSize(38, "38px: 9pt(300dpi)"); + s_list.add(new TTPixelSize(42, "42px: 10pt(300dpi)")); + // s_list.add(new TTPixelSize(44, "44px: 10.5pt(300dpi)")); + s_list.add(new TTPixelSize(46, "46px: 11pt(300dpi)")); + s_list.add(new TTPixelSize(50, "50px: 12pt(300dpi)")); + s_list.add(new TTPixelSize(54, "54px: 13pt(300dpi)")); + s_list.add(new TTPixelSize(58, "58px: 14pt(300dpi)")); + s_list.add(new TTPixelSize(67, "67px: 16pt(300dpi)")); + s_list.add(new TTPixelSize(75, "75px: 18pt(300dpi)")); + s_list.add(new TTPixelSize(83, "83px: 20pt(300dpi)")); + s_list.add(new TTPixelSize(92, "92px: 22pt(300dpi)")); + s_list.add(new TTPixelSize(100, "100px: 24pt(300dpi)")); + } + + private int m_pixel; + private String m_description; + private int m_pixelWidths[]; + private int m_maxPixelWidth = 0; + + public TTPixelSize(int a_pixel, String a_description) + { + m_pixel = a_pixel; + m_description = a_description; + } + + public int getPixel() { + return m_pixel; + } + + public String getDescription() { + return m_description; + } + + /** + * sets the size of the pixel widths. Use num of glyphs. + * @param a_size + */ + public void setPixelWidthsSize(int a_size) { + m_pixelWidths = new int[a_size]; + m_maxPixelWidth = 0; + } + + public void setPixelWidth(int a_glyphIndex, int a_value) { + m_pixelWidths[a_glyphIndex] = a_value; + if (a_value > m_maxPixelWidth) { + m_maxPixelWidth = a_value; + } + } + + public int [] getPixelWidths() { + return m_pixelWidths; + } + + public int getPixelWidth(int a_glyphIndex) { + return m_pixelWidths[a_glyphIndex]; + } + + public int getMaxPixelWidth() { + return m_maxPixelWidth; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java index 0437f0f36..95e5c8df1 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java @@ -65,8 +65,8 @@ public class TTUnicodeRange implements Comparable { TTUnicodeRange range = s_list.get(i); if (range.m_block.equals(block)) { return range; - } // if - } // for i + } + } return retval; } @@ -300,8 +300,8 @@ public class TTUnicodeRange implements Comparable { s_selected = range; return true; - } // if - } // for i + } + } return false; } diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/AbstractGlyphFactory.java b/libsrc/ttf/src/org/doubletype/ossa/xml/AbstractGlyphFactory.java deleted file mode 100644 index d2d75cb43..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/AbstractGlyphFactory.java +++ /dev/null @@ -1,3291 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -import java.io.*; -import java.net.URL; -import javax.xml.parsers.*; -import org.w3c.dom.*; -import org.xml.sax.*; - -/** - * AbstractGlyphFactory is generated by Relaxer based on glyph.rng. - * - * @version glyph.rng 1.0 (Tue Nov 09 20:22:48 EST 2004) - * @author Relaxer 1.1b (http://www.relaxer.org) - */ -public abstract class AbstractGlyphFactory implements IGlyphFactory { - protected org.xml.sax.ErrorHandler errorHandler; - protected org.xml.sax.EntityResolver entityResolver; - protected String baseUri; - - /** - * Gets a Class of XParamListParam. - * - * @return Class - */ - public Class getXParamListParamClass() { - return (createXParamListParam().getClass()); - } - - /** - * Gets a Class of XHeadGlobal. - * - * @return Class - */ - public Class getXHeadGlobalClass() { - return (createXHeadGlobal().getClass()); - } - - /** - * Gets a Class of XHeadLocal. - * - * @return Class - */ - public Class getXHeadLocalClass() { - return (createXHeadLocal().getClass()); - } - - /** - * Gets a Class of XHead. - * - * @return Class - */ - public Class getXHeadClass() { - return (createXHead().getClass()); - } - - /** - * Gets a Class of XGlyphFile. - * - * @return Class - */ - public Class getXGlyphFileClass() { - return (createXGlyphFile().getClass()); - } - - /** - * Gets a Class of XContour. - * - * @return Class - */ - public Class getXContourClass() { - return (createXContour().getClass()); - } - - /** - * Gets a Class of XPoint2d. - * - * @return Class - */ - public Class getXPoint2dClass() { - return (createXPoint2d().getClass()); - } - - /** - * Gets a Class of XInvokePos. - * - * @return Class - */ - public Class getXInvokePosClass() { - return (createXInvokePos().getClass()); - } - - /** - * Gets a Class of XInvokeArg. - * - * @return Class - */ - public Class getXInvokeArgClass() { - return (createXInvokeArg().getClass()); - } - - /** - * Gets a Class of XInvokeVarg. - * - * @return Class - */ - public Class getXInvokeVargClass() { - return (createXInvokeVarg().getClass()); - } - - /** - * Gets a Class of XInvoke. - * - * @return Class - */ - public Class getXInvokeClass() { - return (createXInvoke().getClass()); - } - - /** - * Gets a Class of XInclude. - * - * @return Class - */ - public Class getXIncludeClass() { - return (createXInclude().getClass()); - } - - /** - * Gets a Class of XModule. - * - * @return Class - */ - public Class getXModuleClass() { - return (createXModule().getClass()); - } - - /** - * Gets a Class of XBody. - * - * @return Class - */ - public Class getXBodyClass() { - return (createXBody().getClass()); - } - - /** - * Gets a Class of XStartGlyphElement. - * - * @return Class - */ - public Class getXStartGlyphElementClass() { - return (createXStartGlyphElement().getClass()); - } - - /** - * Gets a Class of XControlPoint. - * - * @return Class - */ - public Class getXControlPointClass() { - return (createXControlPoint().getClass()); - } - - /** - * Gets a Class of XHint. - * - * @return Class - */ - public Class getXHintClass() { - return (createXHint().getClass()); - } - - /** - * Gets a Class of XContourPoint. - * - * @return Class - */ - public Class getXContourPointClass() { - return (createXContourPoint().getClass()); - } - - /** - * Gets a Class of XParamList. - * - * @return Class - */ - public Class getXParamListClass() { - return (createXParamList().getClass()); - } - - /** - * Sets a errorHandler. - * - * @param errorHandler - */ - public void setErrorHandler(org.xml.sax.ErrorHandler errorHandler) { - this.errorHandler = errorHandler; - } - - /** - * Gets a errorHandler. - * - * @return org.xml.sax.ErrorHandler - */ - public org.xml.sax.ErrorHandler getErrorHandler() { - return (errorHandler); - } - - /** - * Sets a entityResolver. - * - * @param entityResolver - */ - public void setEntityResolver(org.xml.sax.EntityResolver entityResolver) { - this.entityResolver = entityResolver; - } - - /** - * Gets a entityResolver. - * - * @return org.xml.sax.EntityResolver - */ - public org.xml.sax.EntityResolver getEntityResolver() { - return (entityResolver); - } - - /** - * Sets a baseUri. - * - * @param baseUri - */ - public void setBaseUri(String baseUri) { - this.baseUri = baseUri; - } - - /** - * Gets a baseUri. - * - * @return String - */ - public String getBaseUri() { - return (baseUri); - } - - /** - * Creates a Object by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(File file) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(String uri) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(URL url) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(InputStream in) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(InputSource is) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(Reader reader) throws IOException, SAXException, ParserConfigurationException { - Object node = create(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (node); - } - - /** - * Creates a Object by the copy Object. - * This method is a template method for concrete classes. - * - * @param source - * @return Object - */ - public Object create(Object source) { - if (source instanceof XParamListParam) { - XParamListParam node = createXParamListParam(); - node.setup((XParamListParam)source); - return(node); - } else if (source instanceof XHeadGlobal) { - XHeadGlobal node = createXHeadGlobal(); - node.setup((XHeadGlobal)source); - return(node); - } else if (source instanceof XHeadLocal) { - XHeadLocal node = createXHeadLocal(); - node.setup((XHeadLocal)source); - return(node); - } else if (source instanceof XHead) { - XHead node = createXHead(); - node.setup((XHead)source); - return(node); - } else if (source instanceof XGlyphFile) { - XGlyphFile node = createXGlyphFile(); - node.setup((XGlyphFile)source); - return(node); - } else if (source instanceof XContour) { - XContour node = createXContour(); - node.setup((XContour)source); - return(node); - } else if (source instanceof XPoint2d) { - XPoint2d node = createXPoint2d(); - node.setup((XPoint2d)source); - return(node); - } else if (source instanceof XInvokePos) { - XInvokePos node = createXInvokePos(); - node.setup((XInvokePos)source); - return(node); - } else if (source instanceof XInvokeArg) { - XInvokeArg node = createXInvokeArg(); - node.setup((XInvokeArg)source); - return(node); - } else if (source instanceof XInvokeVarg) { - XInvokeVarg node = createXInvokeVarg(); - node.setup((XInvokeVarg)source); - return(node); - } else if (source instanceof XInvoke) { - XInvoke node = createXInvoke(); - node.setup((XInvoke)source); - return(node); - } else if (source instanceof XInclude) { - XInclude node = createXInclude(); - node.setup((XInclude)source); - return(node); - } else if (source instanceof XModule) { - XModule node = createXModule(); - node.setup((XModule)source); - return(node); - } else if (source instanceof XBody) { - XBody node = createXBody(); - node.setup((XBody)source); - return(node); - } else if (source instanceof XStartGlyphElement) { - XStartGlyphElement node = createXStartGlyphElement(); - node.setup((XStartGlyphElement)source); - return(node); - } else if (source instanceof XControlPoint) { - XControlPoint node = createXControlPoint(); - node.setup((XControlPoint)source); - return(node); - } else if (source instanceof XHint) { - XHint node = createXHint(); - node.setup((XHint)source); - return(node); - } else if (source instanceof XContourPoint) { - XContourPoint node = createXContourPoint(); - node.setup((XContourPoint)source); - return(node); - } else { - return (null); - } - } - - /** - * Creates a Object by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(Document doc) throws IOException, SAXException, ParserConfigurationException { - Object node = create(doc.getDocumentElement()); - return (node); - } - - /** - * Creates a Object by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - public Object create(Element element) throws IOException, SAXException, ParserConfigurationException { - if (XParamListParam.isMatch(element)) { - XParamListParam node = createXParamListParam(); - node.setup(element); - return(node); - } else if (XHeadGlobal.isMatch(element)) { - XHeadGlobal node = createXHeadGlobal(); - node.setup(element); - return(node); - } else if (XHeadLocal.isMatch(element)) { - XHeadLocal node = createXHeadLocal(); - node.setup(element); - return(node); - } else if (XHead.isMatch(element)) { - XHead node = createXHead(); - node.setup(element); - return(node); - } else if (XGlyphFile.isMatch(element)) { - XGlyphFile node = createXGlyphFile(); - node.setup(element); - return(node); - } else if (XContour.isMatch(element)) { - XContour node = createXContour(); - node.setup(element); - return(node); - } else if (XPoint2d.isMatch(element)) { - XPoint2d node = createXPoint2d(); - node.setup(element); - return(node); - } else if (XInvokePos.isMatch(element)) { - XInvokePos node = createXInvokePos(); - node.setup(element); - return(node); - } else if (XInvokeArg.isMatch(element)) { - XInvokeArg node = createXInvokeArg(); - node.setup(element); - return(node); - } else if (XInvokeVarg.isMatch(element)) { - XInvokeVarg node = createXInvokeVarg(); - node.setup(element); - return(node); - } else if (XInvoke.isMatch(element)) { - XInvoke node = createXInvoke(); - node.setup(element); - return(node); - } else if (XInclude.isMatch(element)) { - XInclude node = createXInclude(); - node.setup(element); - return(node); - } else if (XModule.isMatch(element)) { - XModule node = createXModule(); - node.setup(element); - return(node); - } else if (XBody.isMatch(element)) { - XBody node = createXBody(); - node.setup(element); - return(node); - } else if (XStartGlyphElement.isMatch(element)) { - XStartGlyphElement node = createXStartGlyphElement(); - node.setup(element); - return(node); - } else if (XControlPoint.isMatch(element)) { - XControlPoint node = createXControlPoint(); - node.setup(element); - return(node); - } else if (XHint.isMatch(element)) { - XHint node = createXHint(); - node.setup(element); - return(node); - } else if (XContourPoint.isMatch(element)) { - XContourPoint node = createXContourPoint(); - node.setup(element); - return(node); - } else { - return (null); - } - } - - /** - * Creates a XParamListParam by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(File file) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(File file) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(File file) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(File file) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(File file) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(File file) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(File file) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(File file) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(File file) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(File file) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(File file) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(File file) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(File file) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(File file) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(File file) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(File file) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(File file) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint by the File file. - * This method is a template method for concrete classes. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(File file) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(file, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(String uri) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(String uri) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(String uri) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(String uri) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(String uri) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(String uri) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(String uri) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(String uri) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(String uri) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(String uri) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(String uri) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(String uri) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(String uri) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(String uri) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(String uri) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(String uri) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(String uri) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint - * by the String representation of URI uri. - * This method is a template method for concrete classes. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(String uri) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(uri, baseUri, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(URL url) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(URL url) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(URL url) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(URL url) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(URL url) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(URL url) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(URL url) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(URL url) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(URL url) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(URL url) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(URL url) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(URL url) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(URL url) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(URL url) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(URL url) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(URL url) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(URL url) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint by the URL url. - * This method is a template method for concrete classes. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(URL url) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(url, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint by the InputStream in. - * This method is a template method for concrete classes. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(InputStream in) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(in, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint by the InputSource is. - * This method is a template method for concrete classes. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(InputSource is) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(is, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - public XParamListParam createXParamListParam(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - public XHead createXHead(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XHead xHead_ = createXHead(); - xHead_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - public XContour createXContour(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XContour xContour_ = createXContour(); - xContour_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContour_); - } - - /** - * Creates a XPoint2d by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - public XPoint2d createXPoint2d(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - public XInvokePos createXInvokePos(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - public XInvoke createXInvoke(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInvoke_); - } - - /** - * Creates a XInclude by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - public XInclude createXInclude(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xInclude_); - } - - /** - * Creates a XModule by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - public XModule createXModule(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XModule xModule_ = createXModule(); - xModule_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xModule_); - } - - /** - * Creates a XBody by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - public XBody createXBody(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XBody xBody_ = createXBody(); - xBody_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - public XControlPoint createXControlPoint(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xControlPoint_); - } - - /** - * Creates a XHint by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - public XHint createXHint(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XHint xHint_ = createXHint(); - xHint_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xHint_); - } - - /** - * Creates a XContourPoint by the Reader reader. - * This method is a template method for concrete classes. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - public XContourPoint createXContourPoint(Reader reader) throws IOException, SAXException, ParserConfigurationException { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(UJAXP.getDocument(reader, UJAXP.FLAG_NONE, errorHandler, entityResolver)); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XParamListParam - */ - public XParamListParam createXParamListParam(XParamListParam source) { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(source); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(XHeadGlobal source) { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(source); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(XHeadLocal source) { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(source); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XHead - */ - public XHead createXHead(XHead source) { - XHead xHead_ = createXHead(); - xHead_.setup(source); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(XGlyphFile source) { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(source); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XContour - */ - public XContour createXContour(XContour source) { - XContour xContour_ = createXContour(); - xContour_.setup(source); - return (xContour_); - } - - /** - * Creates a XPoint2d by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XPoint2d - */ - public XPoint2d createXPoint2d(XPoint2d source) { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(source); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XInvokePos - */ - public XInvokePos createXInvokePos(XInvokePos source) { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(source); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(XInvokeArg source) { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(source); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(XInvokeVarg source) { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(source); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XInvoke - */ - public XInvoke createXInvoke(XInvoke source) { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(source); - return (xInvoke_); - } - - /** - * Creates a XInclude by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XInclude - */ - public XInclude createXInclude(XInclude source) { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(source); - return (xInclude_); - } - - /** - * Creates a XModule by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XModule - */ - public XModule createXModule(XModule source) { - XModule xModule_ = createXModule(); - xModule_.setup(source); - return (xModule_); - } - - /** - * Creates a XBody by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XBody - */ - public XBody createXBody(XBody source) { - XBody xBody_ = createXBody(); - xBody_.setup(source); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(XStartGlyphElement source) { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(source); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XControlPoint - */ - public XControlPoint createXControlPoint(XControlPoint source) { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(source); - return (xControlPoint_); - } - - /** - * Creates a XHint by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XHint - */ - public XHint createXHint(XHint source) { - XHint xHint_ = createXHint(); - xHint_.setup(source); - return (xHint_); - } - - /** - * Creates a XContourPoint by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XContourPoint - */ - public XContourPoint createXContourPoint(XContourPoint source) { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(source); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XParamListParam - */ - public XParamListParam createXParamListParam(Document doc) { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(doc); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(Document doc) { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(doc); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(Document doc) { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(doc); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XHead - */ - public XHead createXHead(Document doc) { - XHead xHead_ = createXHead(); - xHead_.setup(doc); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(Document doc) { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(doc); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XContour - */ - public XContour createXContour(Document doc) { - XContour xContour_ = createXContour(); - xContour_.setup(doc); - return (xContour_); - } - - /** - * Creates a XPoint2d by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XPoint2d - */ - public XPoint2d createXPoint2d(Document doc) { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(doc); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XInvokePos - */ - public XInvokePos createXInvokePos(Document doc) { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(doc); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(Document doc) { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(doc); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(Document doc) { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(doc); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XInvoke - */ - public XInvoke createXInvoke(Document doc) { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(doc); - return (xInvoke_); - } - - /** - * Creates a XInclude by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XInclude - */ - public XInclude createXInclude(Document doc) { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(doc); - return (xInclude_); - } - - /** - * Creates a XModule by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XModule - */ - public XModule createXModule(Document doc) { - XModule xModule_ = createXModule(); - xModule_.setup(doc); - return (xModule_); - } - - /** - * Creates a XBody by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XBody - */ - public XBody createXBody(Document doc) { - XBody xBody_ = createXBody(); - xBody_.setup(doc); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(Document doc) { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(doc); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XControlPoint - */ - public XControlPoint createXControlPoint(Document doc) { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(doc); - return (xControlPoint_); - } - - /** - * Creates a XHint by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XHint - */ - public XHint createXHint(Document doc) { - XHint xHint_ = createXHint(); - xHint_.setup(doc); - return (xHint_); - } - - /** - * Creates a XContourPoint by the Document doc. - * This method is a template method for concrete classes. - * - * @param doc - * @return XContourPoint - */ - public XContourPoint createXContourPoint(Document doc) { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(doc); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XParamListParam - */ - public XParamListParam createXParamListParam(Element element) { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(element); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(Element element) { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(element); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(Element element) { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(element); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XHead - */ - public XHead createXHead(Element element) { - XHead xHead_ = createXHead(); - xHead_.setup(element); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(Element element) { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(element); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XContour - */ - public XContour createXContour(Element element) { - XContour xContour_ = createXContour(); - xContour_.setup(element); - return (xContour_); - } - - /** - * Creates a XPoint2d by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XPoint2d - */ - public XPoint2d createXPoint2d(Element element) { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(element); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XInvokePos - */ - public XInvokePos createXInvokePos(Element element) { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(element); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(Element element) { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(element); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(Element element) { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(element); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XInvoke - */ - public XInvoke createXInvoke(Element element) { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(element); - return (xInvoke_); - } - - /** - * Creates a XInclude by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XInclude - */ - public XInclude createXInclude(Element element) { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(element); - return (xInclude_); - } - - /** - * Creates a XModule by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XModule - */ - public XModule createXModule(Element element) { - XModule xModule_ = createXModule(); - xModule_.setup(element); - return (xModule_); - } - - /** - * Creates a XBody by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XBody - */ - public XBody createXBody(Element element) { - XBody xBody_ = createXBody(); - xBody_.setup(element); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(Element element) { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(element); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XControlPoint - */ - public XControlPoint createXControlPoint(Element element) { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(element); - return (xControlPoint_); - } - - /** - * Creates a XHint by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XHint - */ - public XHint createXHint(Element element) { - XHint xHint_ = createXHint(); - xHint_.setup(element); - return (xHint_); - } - - /** - * Creates a XContourPoint by the Element element. - * This method is a template method for concrete classes. - * - * @param element - * @return XContourPoint - */ - public XContourPoint createXContourPoint(Element element) { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(element); - return (xContourPoint_); - } - - /** - * Creates a XParamListParam by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XParamListParam - */ - public XParamListParam createXParamListParam(RStack stack) { - XParamListParam xParamListParam_ = createXParamListParam(); - xParamListParam_.setup(stack); - return (xParamListParam_); - } - - /** - * Creates a XHeadGlobal by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal(RStack stack) { - XHeadGlobal xHeadGlobal_ = createXHeadGlobal(); - xHeadGlobal_.setup(stack); - return (xHeadGlobal_); - } - - /** - * Creates a XHeadLocal by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal(RStack stack) { - XHeadLocal xHeadLocal_ = createXHeadLocal(); - xHeadLocal_.setup(stack); - return (xHeadLocal_); - } - - /** - * Creates a XHead by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XHead - */ - public XHead createXHead(RStack stack) { - XHead xHead_ = createXHead(); - xHead_.setup(stack); - return (xHead_); - } - - /** - * Creates a XGlyphFile by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile(RStack stack) { - XGlyphFile xGlyphFile_ = createXGlyphFile(); - xGlyphFile_.setup(stack); - return (xGlyphFile_); - } - - /** - * Creates a XContour by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XContour - */ - public XContour createXContour(RStack stack) { - XContour xContour_ = createXContour(); - xContour_.setup(stack); - return (xContour_); - } - - /** - * Creates a XPoint2d by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XPoint2d - */ - public XPoint2d createXPoint2d(RStack stack) { - XPoint2d xPoint2d_ = createXPoint2d(); - xPoint2d_.setup(stack); - return (xPoint2d_); - } - - /** - * Creates a XInvokePos by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XInvokePos - */ - public XInvokePos createXInvokePos(RStack stack) { - XInvokePos xInvokePos_ = createXInvokePos(); - xInvokePos_.setup(stack); - return (xInvokePos_); - } - - /** - * Creates a XInvokeArg by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg(RStack stack) { - XInvokeArg xInvokeArg_ = createXInvokeArg(); - xInvokeArg_.setup(stack); - return (xInvokeArg_); - } - - /** - * Creates a XInvokeVarg by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg(RStack stack) { - XInvokeVarg xInvokeVarg_ = createXInvokeVarg(); - xInvokeVarg_.setup(stack); - return (xInvokeVarg_); - } - - /** - * Creates a XInvoke by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XInvoke - */ - public XInvoke createXInvoke(RStack stack) { - XInvoke xInvoke_ = createXInvoke(); - xInvoke_.setup(stack); - return (xInvoke_); - } - - /** - * Creates a XInclude by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XInclude - */ - public XInclude createXInclude(RStack stack) { - XInclude xInclude_ = createXInclude(); - xInclude_.setup(stack); - return (xInclude_); - } - - /** - * Creates a XModule by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XModule - */ - public XModule createXModule(RStack stack) { - XModule xModule_ = createXModule(); - xModule_.setup(stack); - return (xModule_); - } - - /** - * Creates a XBody by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XBody - */ - public XBody createXBody(RStack stack) { - XBody xBody_ = createXBody(); - xBody_.setup(stack); - return (xBody_); - } - - /** - * Creates a XStartGlyphElement by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement(RStack stack) { - XStartGlyphElement xStartGlyphElement_ = createXStartGlyphElement(); - xStartGlyphElement_.setup(stack); - return (xStartGlyphElement_); - } - - /** - * Creates a XControlPoint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XControlPoint - */ - public XControlPoint createXControlPoint(RStack stack) { - XControlPoint xControlPoint_ = createXControlPoint(); - xControlPoint_.setup(stack); - return (xControlPoint_); - } - - /** - * Creates a XHint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XHint - */ - public XHint createXHint(RStack stack) { - XHint xHint_ = createXHint(); - xHint_.setup(stack); - return (xHint_); - } - - /** - * Creates a XContourPoint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XContourPoint - */ - public XContourPoint createXContourPoint(RStack stack) { - XContourPoint xContourPoint_ = createXContourPoint(); - xContourPoint_.setup(stack); - return (xContourPoint_); - } - - /** - * Creates a XParamList by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * This method is a template method for concrete classes. - * - * @param stack - * @return XParamList - */ - public XParamList createXParamList(RStack stack) { - XParamList xParamList_ = createXParamList(); - xParamList_.setup(stack); - return (xParamList_); - } - - /** - * Creates a XParamList by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XParamList - */ - public XParamList createXParamList(XParamList source) { - XParamList xParamList_ = createXParamList(); - xParamList_.setup(source); - return (xParamList_); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/DefaultGlyphFactory.java b/libsrc/ttf/src/org/doubletype/ossa/xml/DefaultGlyphFactory.java deleted file mode 100644 index bf2d11249..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/DefaultGlyphFactory.java +++ /dev/null @@ -1,394 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -/** - * DefaultGlyphFactory is generated by Relaxer based on glyph.rng. - * - * @version glyph.rng 1.0 (Tue Nov 09 20:22:48 EST 2004) - * @author Relaxer 1.1b (http://www.relaxer.org) - */ -public class DefaultGlyphFactory extends AbstractGlyphFactory { - - /** - * Gets a Class of XParamListParam. - * - * @return Class - */ - public Class getXParamListParamClass() { - return (XParamListParam.class); - } - - /** - * Gets a Class of XHeadGlobal. - * - * @return Class - */ - public Class getXHeadGlobalClass() { - return (XHeadGlobal.class); - } - - /** - * Gets a Class of XHeadLocal. - * - * @return Class - */ - public Class getXHeadLocalClass() { - return (XHeadLocal.class); - } - - /** - * Gets a Class of XHead. - * - * @return Class - */ - public Class getXHeadClass() { - return (XHead.class); - } - - /** - * Gets a Class of XGlyphFile. - * - * @return Class - */ - public Class getXGlyphFileClass() { - return (XGlyphFile.class); - } - - /** - * Gets a Class of XContour. - * - * @return Class - */ - public Class getXContourClass() { - return (XContour.class); - } - - /** - * Gets a Class of XPoint2d. - * - * @return Class - */ - public Class getXPoint2dClass() { - return (XPoint2d.class); - } - - /** - * Gets a Class of XInvokePos. - * - * @return Class - */ - public Class getXInvokePosClass() { - return (XInvokePos.class); - } - - /** - * Gets a Class of XInvokeArg. - * - * @return Class - */ - public Class getXInvokeArgClass() { - return (XInvokeArg.class); - } - - /** - * Gets a Class of XInvokeVarg. - * - * @return Class - */ - public Class getXInvokeVargClass() { - return (XInvokeVarg.class); - } - - /** - * Gets a Class of XInvoke. - * - * @return Class - */ - public Class getXInvokeClass() { - return (XInvoke.class); - } - - /** - * Gets a Class of XInclude. - * - * @return Class - */ - public Class getXIncludeClass() { - return (XInclude.class); - } - - /** - * Gets a Class of XModule. - * - * @return Class - */ - public Class getXModuleClass() { - return (XModule.class); - } - - /** - * Gets a Class of XBody. - * - * @return Class - */ - public Class getXBodyClass() { - return (XBody.class); - } - - /** - * Gets a Class of XStartGlyphElement. - * - * @return Class - */ - public Class getXStartGlyphElementClass() { - return (XStartGlyphElement.class); - } - - /** - * Gets a Class of XControlPoint. - * - * @return Class - */ - public Class getXControlPointClass() { - return (XControlPoint.class); - } - - /** - * Gets a Class of XHint. - * - * @return Class - */ - public Class getXHintClass() { - return (XHint.class); - } - - /** - * Gets a Class of XContourPoint. - * - * @return Class - */ - public Class getXContourPointClass() { - return (XContourPoint.class); - } - - /** - * Gets a Class of XParamList. - * - * @return Class - */ - public Class getXParamListClass() { - return (XParamList.class); - } - - /** - * Creates a default XParamListParam. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XParamListParam - */ - public XParamListParam createXParamListParam() { - return (new XParamListParam()); - } - - /** - * Creates a default XHeadGlobal. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XHeadGlobal - */ - public XHeadGlobal createXHeadGlobal() { - return (new XHeadGlobal()); - } - - /** - * Creates a default XHeadLocal. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XHeadLocal - */ - public XHeadLocal createXHeadLocal() { - return (new XHeadLocal()); - } - - /** - * Creates a default XHead. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XHead - */ - public XHead createXHead() { - return (new XHead()); - } - - /** - * Creates a default XGlyphFile. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XGlyphFile - */ - public XGlyphFile createXGlyphFile() { - return (new XGlyphFile()); - } - - /** - * Creates a default XContour. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XContour - */ - public XContour createXContour() { - return (new XContour()); - } - - /** - * Creates a default XPoint2d. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XPoint2d - */ - public XPoint2d createXPoint2d() { - return (new XPoint2d()); - } - - /** - * Creates a default XInvokePos. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XInvokePos - */ - public XInvokePos createXInvokePos() { - return (new XInvokePos()); - } - - /** - * Creates a default XInvokeArg. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XInvokeArg - */ - public XInvokeArg createXInvokeArg() { - return (new XInvokeArg()); - } - - /** - * Creates a default XInvokeVarg. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XInvokeVarg - */ - public XInvokeVarg createXInvokeVarg() { - return (new XInvokeVarg()); - } - - /** - * Creates a default XInvoke. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XInvoke - */ - public XInvoke createXInvoke() { - return (new XInvoke()); - } - - /** - * Creates a default XInclude. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XInclude - */ - public XInclude createXInclude() { - return (new XInclude()); - } - - /** - * Creates a default XModule. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XModule - */ - public XModule createXModule() { - return (new XModule()); - } - - /** - * Creates a default XBody. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XBody - */ - public XBody createXBody() { - return (new XBody()); - } - - /** - * Creates a default XStartGlyphElement. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XStartGlyphElement - */ - public XStartGlyphElement createXStartGlyphElement() { - return (new XStartGlyphElement()); - } - - /** - * Creates a default XControlPoint. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XControlPoint - */ - public XControlPoint createXControlPoint() { - return (new XControlPoint()); - } - - /** - * Creates a default XHint. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XHint - */ - public XHint createXHint() { - return (new XHint()); - } - - /** - * Creates a default XContourPoint. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XContourPoint - */ - public XContourPoint createXContourPoint() { - return (new XContourPoint()); - } - - /** - * Creates a default XParamList. - * This method is a hook method of the AbstractGlyphFactory. - * - * @return XParamList - */ - public XParamList createXParamList() { - return (new XParamList()); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/GlyphFactory.java b/libsrc/ttf/src/org/doubletype/ossa/xml/GlyphFactory.java deleted file mode 100644 index b9c5ae8bf..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/GlyphFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -/** - * GlyphFactory is generated by Relaxer based on glyph.rng. - * - * @version glyph.rng 1.0 (Tue Nov 09 20:22:48 EST 2004) - * @author Relaxer 1.1b (http://www.relaxer.org) - */ -public class GlyphFactory { - private static IGlyphFactory factory; - - /** - * Sets a factory. - * - * @param newFactory - */ - public static void setFactory(IGlyphFactory newFactory) { - factory = newFactory; - } - - /** - * Gets the factory. - * - * @return IGlyphFactory - */ - public static IGlyphFactory getFactory() { - if (factory == null) { - factory = new DefaultGlyphFactory(); - } - return (factory); - } -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/IGlyphFactory.java b/libsrc/ttf/src/org/doubletype/ossa/xml/IGlyphFactory.java deleted file mode 100644 index 36547070c..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/IGlyphFactory.java +++ /dev/null @@ -1,2279 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -import java.io.*; -import java.net.URL; -import javax.xml.parsers.*; -import org.w3c.dom.*; -import org.xml.sax.*; - -/** - * IGlyphFactory is generated by Relaxer based on glyph.rng. - * - * @version glyph.rng 1.0 (Tue Nov 09 20:22:48 EST 2004) - * @author Relaxer 1.1b (http://www.relaxer.org) - */ -public interface IGlyphFactory { - /** - * Gets a Class of XParamListParam. - * - * @return Class - */ - Class getXParamListParamClass(); - - /** - * Gets a Class of XHeadGlobal. - * - * @return Class - */ - Class getXHeadGlobalClass(); - - /** - * Gets a Class of XHeadLocal. - * - * @return Class - */ - Class getXHeadLocalClass(); - - /** - * Gets a Class of XHead. - * - * @return Class - */ - Class getXHeadClass(); - - /** - * Gets a Class of XGlyphFile. - * - * @return Class - */ - Class getXGlyphFileClass(); - - /** - * Gets a Class of XContour. - * - * @return Class - */ - Class getXContourClass(); - - /** - * Gets a Class of XPoint2d. - * - * @return Class - */ - Class getXPoint2dClass(); - - /** - * Gets a Class of XInvokePos. - * - * @return Class - */ - Class getXInvokePosClass(); - - /** - * Gets a Class of XInvokeArg. - * - * @return Class - */ - Class getXInvokeArgClass(); - - /** - * Gets a Class of XInvokeVarg. - * - * @return Class - */ - Class getXInvokeVargClass(); - - /** - * Gets a Class of XInvoke. - * - * @return Class - */ - Class getXInvokeClass(); - - /** - * Gets a Class of XInclude. - * - * @return Class - */ - Class getXIncludeClass(); - - /** - * Gets a Class of XModule. - * - * @return Class - */ - Class getXModuleClass(); - - /** - * Gets a Class of XBody. - * - * @return Class - */ - Class getXBodyClass(); - - /** - * Gets a Class of XStartGlyphElement. - * - * @return Class - */ - Class getXStartGlyphElementClass(); - - /** - * Gets a Class of XControlPoint. - * - * @return Class - */ - Class getXControlPointClass(); - - /** - * Gets a Class of XHint. - * - * @return Class - */ - Class getXHintClass(); - - /** - * Gets a Class of XContourPoint. - * - * @return Class - */ - Class getXContourPointClass(); - - /** - * Gets a Class of XParamList. - * - * @return Class - */ - Class getXParamListClass(); - - /** - * Sets a errorHandler. - * - * @param errorHandler - */ - void setErrorHandler(org.xml.sax.ErrorHandler errorHandler); - - /** - * Gets a errorHandler. - * - * @return org.xml.sax.ErrorHandler - */ - org.xml.sax.ErrorHandler getErrorHandler(); - - /** - * Sets a entityResolver. - * - * @param entityResolver - */ - void setEntityResolver(org.xml.sax.EntityResolver entityResolver); - - /** - * Gets a entityResolver. - * - * @return org.xml.sax.EntityResolver - */ - org.xml.sax.EntityResolver getEntityResolver(); - - /** - * Sets a baseUri. - * - * @param baseUri - */ - void setBaseUri(String baseUri); - - /** - * Gets a baseUri. - * - * @return String - */ - String getBaseUri(); - - /** - * Creates a Object by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the Object source. - * - * @param source - * @return Object - */ - Object create(Object source); - - /** - * Creates a Object by the Document dom. - * - * @param doc - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(Document doc) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a Object by the Element element. - * - * @param element - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return Object - */ - Object create(Element element) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint by the File file. - * - * @param file - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(File file) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint - * by the String representation of URI uri. - * - * @param uri - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(String uri) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint by the URL url. - * - * @param url - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(URL url) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint by the InputStream in. - * - * @param in - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(InputStream in) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint by the InputSource is. - * - * @param is - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(InputSource is) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XParamListParam - */ - XParamListParam createXParamListParam(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadGlobal by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHeadLocal by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHead by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHead - */ - XHead createXHead(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XGlyphFile by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContour by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContour - */ - XContour createXContour(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XPoint2d by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XPoint2d - */ - XPoint2d createXPoint2d(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokePos by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokePos - */ - XInvokePos createXInvokePos(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeArg by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvokeVarg by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInvoke by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInvoke - */ - XInvoke createXInvoke(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XInclude by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XInclude - */ - XInclude createXInclude(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XModule by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XModule - */ - XModule createXModule(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XBody by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XBody - */ - XBody createXBody(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XStartGlyphElement by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XControlPoint by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XControlPoint - */ - XControlPoint createXControlPoint(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XHint by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XHint - */ - XHint createXHint(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XContourPoint by the Reader reader. - * - * @param reader - * @exception IOException - * @exception SAXException - * @exception ParserConfigurationException - * @return XContourPoint - */ - XContourPoint createXContourPoint(Reader reader) throws IOException, SAXException, ParserConfigurationException; - - /** - * Creates a XParamListParam. - * - * @return XParamListParam - */ - XParamListParam createXParamListParam(); - - /** - * Creates a XHeadGlobal. - * - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(); - - /** - * Creates a XHeadLocal. - * - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(); - - /** - * Creates a XHead. - * - * @return XHead - */ - XHead createXHead(); - - /** - * Creates a XGlyphFile. - * - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(); - - /** - * Creates a XContour. - * - * @return XContour - */ - XContour createXContour(); - - /** - * Creates a XPoint2d. - * - * @return XPoint2d - */ - XPoint2d createXPoint2d(); - - /** - * Creates a XInvokePos. - * - * @return XInvokePos - */ - XInvokePos createXInvokePos(); - - /** - * Creates a XInvokeArg. - * - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(); - - /** - * Creates a XInvokeVarg. - * - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(); - - /** - * Creates a XInvoke. - * - * @return XInvoke - */ - XInvoke createXInvoke(); - - /** - * Creates a XInclude. - * - * @return XInclude - */ - XInclude createXInclude(); - - /** - * Creates a XModule. - * - * @return XModule - */ - XModule createXModule(); - - /** - * Creates a XBody. - * - * @return XBody - */ - XBody createXBody(); - - /** - * Creates a XStartGlyphElement. - * - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(); - - /** - * Creates a XControlPoint. - * - * @return XControlPoint - */ - XControlPoint createXControlPoint(); - - /** - * Creates a XHint. - * - * @return XHint - */ - XHint createXHint(); - - /** - * Creates a XContourPoint. - * - * @return XContourPoint - */ - XContourPoint createXContourPoint(); - - /** - * Creates a XParamListParam by the XParamListParam source. - * - * @param source - * @return XParamListParam - */ - XParamListParam createXParamListParam(XParamListParam source); - - /** - * Creates a XHeadGlobal by the XHeadGlobal source. - * - * @param source - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(XHeadGlobal source); - - /** - * Creates a XHeadLocal by the XHeadLocal source. - * - * @param source - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(XHeadLocal source); - - /** - * Creates a XHead by the XHead source. - * - * @param source - * @return XHead - */ - XHead createXHead(XHead source); - - /** - * Creates a XGlyphFile by the XGlyphFile source. - * - * @param source - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(XGlyphFile source); - - /** - * Creates a XContour by the XContour source. - * - * @param source - * @return XContour - */ - XContour createXContour(XContour source); - - /** - * Creates a XPoint2d by the XPoint2d source. - * - * @param source - * @return XPoint2d - */ - XPoint2d createXPoint2d(XPoint2d source); - - /** - * Creates a XInvokePos by the XInvokePos source. - * - * @param source - * @return XInvokePos - */ - XInvokePos createXInvokePos(XInvokePos source); - - /** - * Creates a XInvokeArg by the XInvokeArg source. - * - * @param source - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(XInvokeArg source); - - /** - * Creates a XInvokeVarg by the XInvokeVarg source. - * - * @param source - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(XInvokeVarg source); - - /** - * Creates a XInvoke by the XInvoke source. - * - * @param source - * @return XInvoke - */ - XInvoke createXInvoke(XInvoke source); - - /** - * Creates a XInclude by the XInclude source. - * - * @param source - * @return XInclude - */ - XInclude createXInclude(XInclude source); - - /** - * Creates a XModule by the XModule source. - * - * @param source - * @return XModule - */ - XModule createXModule(XModule source); - - /** - * Creates a XBody by the XBody source. - * - * @param source - * @return XBody - */ - XBody createXBody(XBody source); - - /** - * Creates a XStartGlyphElement by the XStartGlyphElement source. - * - * @param source - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(XStartGlyphElement source); - - /** - * Creates a XControlPoint by the XControlPoint source. - * - * @param source - * @return XControlPoint - */ - XControlPoint createXControlPoint(XControlPoint source); - - /** - * Creates a XHint by the XHint source. - * - * @param source - * @return XHint - */ - XHint createXHint(XHint source); - - /** - * Creates a XContourPoint by the XContourPoint source. - * - * @param source - * @return XContourPoint - */ - XContourPoint createXContourPoint(XContourPoint source); - - /** - * Creates a XParamListParam by the Document doc. - * - * @param doc - * @return XParamListParam - */ - XParamListParam createXParamListParam(Document doc); - - /** - * Creates a XHeadGlobal by the Document doc. - * - * @param doc - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(Document doc); - - /** - * Creates a XHeadLocal by the Document doc. - * - * @param doc - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(Document doc); - - /** - * Creates a XHead by the Document doc. - * - * @param doc - * @return XHead - */ - XHead createXHead(Document doc); - - /** - * Creates a XGlyphFile by the Document doc. - * - * @param doc - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(Document doc); - - /** - * Creates a XContour by the Document doc. - * - * @param doc - * @return XContour - */ - XContour createXContour(Document doc); - - /** - * Creates a XPoint2d by the Document doc. - * - * @param doc - * @return XPoint2d - */ - XPoint2d createXPoint2d(Document doc); - - /** - * Creates a XInvokePos by the Document doc. - * - * @param doc - * @return XInvokePos - */ - XInvokePos createXInvokePos(Document doc); - - /** - * Creates a XInvokeArg by the Document doc. - * - * @param doc - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(Document doc); - - /** - * Creates a XInvokeVarg by the Document doc. - * - * @param doc - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(Document doc); - - /** - * Creates a XInvoke by the Document doc. - * - * @param doc - * @return XInvoke - */ - XInvoke createXInvoke(Document doc); - - /** - * Creates a XInclude by the Document doc. - * - * @param doc - * @return XInclude - */ - XInclude createXInclude(Document doc); - - /** - * Creates a XModule by the Document doc. - * - * @param doc - * @return XModule - */ - XModule createXModule(Document doc); - - /** - * Creates a XBody by the Document doc. - * - * @param doc - * @return XBody - */ - XBody createXBody(Document doc); - - /** - * Creates a XStartGlyphElement by the Document doc. - * - * @param doc - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(Document doc); - - /** - * Creates a XControlPoint by the Document doc. - * - * @param doc - * @return XControlPoint - */ - XControlPoint createXControlPoint(Document doc); - - /** - * Creates a XHint by the Document doc. - * - * @param doc - * @return XHint - */ - XHint createXHint(Document doc); - - /** - * Creates a XContourPoint by the Document doc. - * - * @param doc - * @return XContourPoint - */ - XContourPoint createXContourPoint(Document doc); - - /** - * Creates a XParamListParam by the Element element. - * - * @param element - * @return XParamListParam - */ - XParamListParam createXParamListParam(Element element); - - /** - * Creates a XHeadGlobal by the Element element. - * - * @param element - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(Element element); - - /** - * Creates a XHeadLocal by the Element element. - * - * @param element - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(Element element); - - /** - * Creates a XHead by the Element element. - * - * @param element - * @return XHead - */ - XHead createXHead(Element element); - - /** - * Creates a XGlyphFile by the Element element. - * - * @param element - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(Element element); - - /** - * Creates a XContour by the Element element. - * - * @param element - * @return XContour - */ - XContour createXContour(Element element); - - /** - * Creates a XPoint2d by the Element element. - * - * @param element - * @return XPoint2d - */ - XPoint2d createXPoint2d(Element element); - - /** - * Creates a XInvokePos by the Element element. - * - * @param element - * @return XInvokePos - */ - XInvokePos createXInvokePos(Element element); - - /** - * Creates a XInvokeArg by the Element element. - * - * @param element - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(Element element); - - /** - * Creates a XInvokeVarg by the Element element. - * - * @param element - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(Element element); - - /** - * Creates a XInvoke by the Element element. - * - * @param element - * @return XInvoke - */ - XInvoke createXInvoke(Element element); - - /** - * Creates a XInclude by the Element element. - * - * @param element - * @return XInclude - */ - XInclude createXInclude(Element element); - - /** - * Creates a XModule by the Element element. - * - * @param element - * @return XModule - */ - XModule createXModule(Element element); - - /** - * Creates a XBody by the Element element. - * - * @param element - * @return XBody - */ - XBody createXBody(Element element); - - /** - * Creates a XStartGlyphElement by the Element element. - * - * @param element - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(Element element); - - /** - * Creates a XControlPoint by the Element element. - * - * @param element - * @return XControlPoint - */ - XControlPoint createXControlPoint(Element element); - - /** - * Creates a XHint by the Element element. - * - * @param element - * @return XHint - */ - XHint createXHint(Element element); - - /** - * Creates a XContourPoint by the Element element. - * - * @param element - * @return XContourPoint - */ - XContourPoint createXContourPoint(Element element); - - /** - * Creates a XParamListParam by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XParamListParam - */ - XParamListParam createXParamListParam(RStack stack); - - /** - * Creates a XHeadGlobal by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XHeadGlobal - */ - XHeadGlobal createXHeadGlobal(RStack stack); - - /** - * Creates a XHeadLocal by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XHeadLocal - */ - XHeadLocal createXHeadLocal(RStack stack); - - /** - * Creates a XHead by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XHead - */ - XHead createXHead(RStack stack); - - /** - * Creates a XGlyphFile by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XGlyphFile - */ - XGlyphFile createXGlyphFile(RStack stack); - - /** - * Creates a XContour by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XContour - */ - XContour createXContour(RStack stack); - - /** - * Creates a XPoint2d by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XPoint2d - */ - XPoint2d createXPoint2d(RStack stack); - - /** - * Creates a XInvokePos by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XInvokePos - */ - XInvokePos createXInvokePos(RStack stack); - - /** - * Creates a XInvokeArg by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XInvokeArg - */ - XInvokeArg createXInvokeArg(RStack stack); - - /** - * Creates a XInvokeVarg by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XInvokeVarg - */ - XInvokeVarg createXInvokeVarg(RStack stack); - - /** - * Creates a XInvoke by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XInvoke - */ - XInvoke createXInvoke(RStack stack); - - /** - * Creates a XInclude by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XInclude - */ - XInclude createXInclude(RStack stack); - - /** - * Creates a XModule by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XModule - */ - XModule createXModule(RStack stack); - - /** - * Creates a XBody by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XBody - */ - XBody createXBody(RStack stack); - - /** - * Creates a XStartGlyphElement by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XStartGlyphElement - */ - XStartGlyphElement createXStartGlyphElement(RStack stack); - - /** - * Creates a XControlPoint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XControlPoint - */ - XControlPoint createXControlPoint(RStack stack); - - /** - * Creates a XHint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XHint - */ - XHint createXHint(RStack stack); - - /** - * Creates a XContourPoint by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XContourPoint - */ - XContourPoint createXContourPoint(RStack stack); - - /** - * Creates a XParamList by the Element element. - * - * @return XParamList - */ - XParamList createXParamList(); - - /** - * Creates a XParamList by the Stack stack. - * This mehtod is supposed to be used internally - * by the Relaxer system. - * - * @param stack - * @return XParamList - */ - XParamList createXParamList(RStack stack); - - /** - * Creates a XParamList by the object source. - * This method is a template method for concrete classes. - * - * @param source - * @return XParamList - */ - XParamList createXParamList(XParamList source); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/IRNode.java b/libsrc/ttf/src/org/doubletype/ossa/xml/IRNode.java deleted file mode 100644 index 2e513627e..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/IRNode.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -/** - * @version glyph.rng 1.0 (Tue Nov 09 20:22:48 EST 2004) - * @author Relaxer 1.1b (http://www.relaxer.org) - */ -public interface IRNode { - /** - * Sets parent RNode. - * - * @param parent - */ - void rSetParentRNode(IRNode parent); - - /** - * Gets parent RNode. - * - * @return IRNode - */ - IRNode rGetParentRNode(); - - /** - * Gets child RNodes. - * - * @return IRNode[] - */ - IRNode[] rGetRNodes(); -} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java b/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java deleted file mode 100644 index 2c158592a..000000000 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java +++ /dev/null @@ -1,753 +0,0 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -import java.util.*; -import java.net.URL; -import java.math.*; -import java.lang.reflect.*; -import java.sql.Time; -import java.sql.Timestamp; -import org.w3c.dom.*; - -/** - * RInterleave - * - * @since May. 13, 2002 - * @version Oct. 22, 2003 - * @author ASAMI, Tomoharu (asami@relaxer.org) - */ -public final class RInterleave { - private RStack rstack_; - private List entries_ = new ArrayList<>(); - private Map entryByStateClass_ = new HashMap<>(); - private Map entryByElementName_ = new HashMap<>(); - private Boolean isMatch_ = null; - - public RInterleave(RStack rstack) { - rstack_ = rstack; - } - - public Object getProperty(Class stateClass) { - StateClassEntry entry = _getEntryByStateClass(stateClass); - return (entry.getObject()); - } - - public Object[] getPropertyList(Class stateClass) { - StateClassEntry entry = _getEntryByStateClass(stateClass); - return (entry.getObjects()); - } - - public String getElementPropertyAsString(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsString(element)); - } - - public boolean getElementPropertyAsBoolean(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (false); - } - return (URelaxer.getElementPropertyAsBoolean(element)); - } - - public Boolean getElementPropertyAsBooleanObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBooleanObject(element)); - } - - public byte getElementPropertyAsByte(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsByte(element)); - } - - public Byte getElementPropertyAsByteObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsByteObject(element)); - } - - public short getElementPropertyAsShort(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsShort(element)); - } - - public Short getElementPropertyAsShortObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsShortObject(element)); - } - - public int getElementPropertyAsInt(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsInt(element)); - } - - public Integer getElementPropertyAsIntObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsIntObject(element)); - } - - public long getElementPropertyAsLong(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsLong(element)); - } - - public Long getElementPropertyAsLongObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsLongObject(element)); - } - - public float getElementPropertyAsFloat(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (Float.NaN); - } - return (URelaxer.getElementPropertyAsFloat(element)); - } - - public Float getElementPropertyAsFloatObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsFloatObject(element)); - } - - public double getElementPropertyAsDouble(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (Double.NaN); - } - return (URelaxer.getElementPropertyAsDouble(element)); - } - - public Double getElementPropertyAsDoubleObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsDoubleObject(element)); - } - - public BigDecimal getElementPropertyAsBigDecimal(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBigDecimal(element)); - } - - public BigInteger getElementPropertyAsBigInteger(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBigInteger(element)); - } - - public Date getElementPropertyAsDate(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsDate(element)); - } - - public Locale getElementPropertyAsLocale(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsLocale(element)); - } - - public URL getElementPropertyAsURL(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsURL(element)); - } - - public java.sql.Timestamp getElementPropertyAsSQLTimestamp( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLTimestamp(element)); - } - - public java.sql.Time getElementPropertyAsSQLTime( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLTime(element)); - } - - public java.sql.Date getElementPropertyAsSQLDate( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLDate(element)); - } - - public byte[] getElementPropertyAsBinaryBASE64( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBinaryBASE64(element)); - } - - public byte[] getElementPropertyAsBinaryHEX( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBinaryHEX(element)); - } - - public List getElementPropertyAsStringList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsString(element)); - } - return (result); - } - - public List getElementPropertyAsBooleanList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBooleanObject(element)); - } - return (result); - } - - public List getElementPropertyAsByteList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsByteObject(element)); - } - return (result); - } - - public List getElementPropertyAsShortList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsShortObject(element)); - } - return (result); - } - - public List getElementPropertyAsIntList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsIntObject(element)); - } - return (result); - } - - public List getElementPropertyAsLongList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsLongObject(element)); - } - return (result); - } - - public List getElementPropertyAsFloatList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsFloatObject(element)); - } - return (result); - } - - public List getElementPropertyAsDoubleList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsDoubleObject(element)); - } - return (result); - } - - public List getElementPropertyAsBigDecimalList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBigDecimal(element)); - } - return (result); - } - - public List getElementPropertyAsBigIntegerList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBigInteger(element)); - } - return (result); - } - - public List getElementPropertyAsDateList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsDate(element)); - } - return (result); - } - - public List getElementPropertyAsLocaleList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsLocale(element)); - } - return (result); - } - - public List getElementPropertyAsURLList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsURL(element)); - } - return (result); - } - - public List getElementPropertyAsSQLTimestampList( - String elementName - ) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsSQLTimestamp(element)); - } - return (result); - } - - public List