From 076b9f13cdad32679abb55eb7159cd21f542fc04 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sun, 19 May 2019 10:36:07 -0700 Subject: [PATCH] start woff support --- fontland/fontland/assets/charter.woff | Bin 0 -> 13996 bytes fontland/fontland/helper.rkt | 1 + fontland/fontland/woff-directory.rkt | 60 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100755 fontland/fontland/assets/charter.woff create mode 100644 fontland/fontland/woff-directory.rkt diff --git a/fontland/fontland/assets/charter.woff b/fontland/fontland/assets/charter.woff new file mode 100755 index 0000000000000000000000000000000000000000..217aac7aa7dfa8dcd11a01f11f2f8601e6bf0d12 GIT binary patch literal 13996 zcmY*=V{|4>)a?`7wylZnWMU^1+qR$Bw(VqMn-kla*vZ7UZr<;HKkltwyHB0nyUwca zI;(#4I_0kL^CtiV@ZC7707(B?W48b6|JVQj+s~h>asU8`#y5-qAG~NJrX<9~e|~c= z-#)=N2mw@pLj@HkmTxZk+gJLAK{TfjyHgS0NSwsLXwUy zf5#GoPy>SO3~f!nx$n7vrUC$v9VLxJgAVr2-|x!)9Umm{nj=n*pj zfItm`@U8jpx!Jryc3qmT8^ob6;QIVBh#8WTA$?Q#8C}ettuF zdVhfME+^VT?Ux9AYkKXEuAmA-;3ylBB+ZW>pn!H_q|pD3X<%UHZ-4{&6B5}2?0`A& zg&rQuzX>D=G@hbQailJESFnhr2+jD1F{v?xF~I_JskW>;x)^#f`T=?}`XV|!dKJ13 zdW!1TyV>g(QMpQhA;}+}d_;+1;$iUoSgmqILkJiMoN`2&a>U`UuP?z*zw57nua7Uh zPpnUckE^fkH=>E{I6pzYzYhj)LAFR7f`6|KUV>hbN;kJX&p^%y%B`h9qix_FY@=m` z0%3GPeo$*@tp4TZYH#!OczK2Z4+$0*8ych_FDW)PIXu8XPf1o&U0P&kYi@FNdALV_ zkBOF(otk8zudcGSxi}}l&&k%++1%jg>+bRae!PQ$1_g?W{23r4Eh;oN+TTM%#nIAQ z=cSU*YINu?q=-sm)NeOhI&HRIuHJ6*Tu8OmcE8x@4l5w$rr5VyeebGTr^tY}WyOZY z!Je1yubHSZ(r76XpurlPuIL$_o#lJDPG~%4)D`eEOw(d8Xi@V=LFCZ`*- zNzm={!Jkz2LpGD$`zS!g{1yjWULC*=3dplbJOq5_{dcy2e0>3sJl0BpFgjU>AJ1=m zFfiawT`(jduq2$|k|K$mB*+6k+sVpnA^}d#%^`#>M%GJ&Rtjf}u4_xnYoa;MjmySa zH9W`c4`tIQh?`B*wk?fzc5Vw5UGI6vp4;G{Qrd!F3NjureA{op+$%I#Wv@t34v%7~=*7#jKEfY30%8=3W9TKQ*btb*`^r>sIy9#y33CQF9$#!T+zLOA7ET|u zV)_Bje{FZXe5`bH0_FOz{^fYVQz2!8^E|^+6f8o=&PDdMq2Sk>z1FK21aWhC6!F2W zIRUs{0%TPciB*Bu0rb;q@#qRl*z&83p3eYaf^?ZnxOU9n3sHS5vX_R}QLO!8{bzN9 zoT3MVtRmByC%D+0OP8ii{_Q!(b(G^>q72xcvrs15?Jug2o_)8G;ysmnB7QEr-W-v6 zx=bGEPXxizXjQ~RA&m{IR+%CW9{-{8Y4C9S`n6Gws%UK}TGouj2^9NqH2&fM&y{!yN^$v8{~ z-+RVNy}>xNmP2sSxo+qQvyS7>z+ju7)#XU#6^sL`V+Cv|o>nKVm!TX(qSZ#{IOCJ-B$MTEgrGcDy>QaIu} zVK*{)Cz8&B(e0XSEvT0Mm4th0q2%O3rS*iwE`xPR`|a6SUi+}x_2d}=$5VLQq+Y+H z_NO^q0EJ@^`m3uT7d^C3uU5;KOKvvC=#UXW1jqmv~hO@_;%;CbW zytbky42gg2^MFba#Fh7|=PtJM5_C12F|9C79VMEa6wJiis}z0K2=e)eqS{EITA>3< zfXy?EZ#tE(&~S|pPcKOSGi*8EVt3(f!$L|?QdYC-XfhRRTp+%7(i|=m3jy6^36g-L znS;T3VegYYOdAWI34w#5+OB@N#j-Zhy!55xXJ-e|NS$-(Cm18~U-^5m`Xpo_d@P;p zk#L-q`^L;?sss}1jO|AEi@;`0tq|F?9R23<3Ol{uLXC4g*B%& z2us{FIF4{lGPGca14fE!$~sx~s+koJO;2pPqDDrqi{3v7a)myLDH4S{MC~ff{reD> z(W`aWCv!nC^noA>butrzpKbU*&MU=oYbu!fJd0~(i|tL6tn|0ixd{<`K zTlLqu@)hLb&Cd|nH|<~VuO%lYB2#pOIG?97Wrfw}_cFmqMUvo7v?GDZ!?Q}sKf(w3 zJV15(=yFFP_$bo3@-1~6Joa-}T0gu9Y-$i%T2ovH)FU4^R2$muJ)R1(a`|Tn70vB8 zSk~5>f@k%jJbsa^p+R3jgUm+7H1DuK*1zP3`pE72OEge%mh{2AACHpWl?s6A_lG4! zyQtcU@ht>=+Pzb4wOj3VH91VxrCWYr)WY!?yU#1>(m9UT;W_m zCwcZ&R&lLsZg2UAlo>a{Lzh~$-flHCXq}(z$Vh}|k=GmUGuU(Ldo~|O5~$Z7R(j7CMZvH+=*xND8&502yw4YqfC(b{ zgUU6bDEeC+;-87RziwSn?ojS>UZs^NXWlADGca3=SekDN~_DPLnfrB%!FccMl zUsHx{FFp@uv$yG%00bxss&8=BeC?+ASBSJ-H}53e?Gp%kJ_=&2dsKk>E4z7^nQ2&T zP3j)juyRFuVcM%?QMD&|SB6e~+!yaexJhbSGw&C8NQl*b2hULtp_k3-Ild>9_B$i3 zG42?toK!AuD-Y}#&-3h<9-?0!L)z(a6-;vzb{>MaOD6b&s^!bV0ZUc~^PLJI1EXD$ zGoVBeL#|j>6o)fdKJ3r1U4FOA#o5_htE@AldrnS?2B2>+kE}Z9s|otF2|3#Jl#W(M zfn*WOi21PM7zqi8P}uzJ4=Y#nxNR?xk1~RCZ*ejzX^cFKEtHuqWHJgGQM(Cm%bNXx zp*@DdC|ahZ$yc;z959r5XsR4r^dfEvQG0S|^PIPgte9M5H@gin?#;^oLghrsf|_l+ zXYjSUek(FQye)4vnXBm4kd`PKPqq;0yZyuY(@!zp6vVmdRjbN8y-ImxiM1yc(8#mn znhwY1hK+DBU6?Qs@VMBhoqfjBLk!;pI>cZxRq?0nP1cfcZuN025A4syTRnksIwd&T z+}RPx33K(&=1%msF|_It1uu9+pdxjW4^W5Fk&C=xpIGXrx5y8Bed4_2rLTJV>0A|f zA~JzQX{Rj|RkE2tIfXyNt7yWEQ06{PCt)O`F1FC;1p?e}f|?(Br-v%&%0B|4Oy7OT zjln7+4uuF*W(9^p`sQkZ_k#nwYmd3d^7J^2$rJCN51d!47EHy~!Vm*@3Z&O$3g-C2 zpuKNLJ`yGN<9i|vFA#;>lBdYr(|5%?$zYip1-S{;fvq&d1NQk^zi;)$rp7=wHk9 zxEr*e5gsLdbO${z6BvDbL7!axX~Mx0rm5lJtvlc`@C#e6had; zY9zvbH4Sn?8=R98HeIhdg)h%gA46Y#HCeuZ8I((s z@utbtDW(cR5aWH?Af^zVx;W6n3Z^vI+NPjJ`rMxQm<>|cwBkegv)~ceYi88j!^kr?DI#$)yB7f zO7TFZfEWvk2T7J1wm+(OFvF3}l<75K5yu~gu@~NyY=j*x>lHe6ZLQn+@DW|+Q+>m2 zSn(!8!a6JOEtINU`CdH;0*DGE+M@Gue;7l%Cyz|D}upAvsW@?JKrsaHK>_zzw z6zx#k>w(H_8GsL_qa0oTcLJ=2g{`szQD6af&q?MRE(>}EX-F*>iN1bGS#v~W+rcSq zM#SS+(4csZo7767fJbqsc^1uTf?EoodoBfuXs$J_QZm<$U@5=KU@p|*gB->vA?WCg zfP~{ntkrX!b%EO?D#Nn{O9)ULi&{SMNNuSl#f5s$JF`}w*{?u?vDHKREQrCVb1j`@ zYTbKk{6J!PArqEqpCvMQ6+umx?%1a{?w9&AzFoIaM!u@d9W7=Y8LlEPOl5+NYB3K? zm?Aw`5k59X{LPpNR7%SEO3HW;O9m1l_g}g^V9Ie=!qZ+`^xpAD_E&kEfiPD=nQ@p# za)_tMRq-cP`T4o_S_SMoWq$F3%xYuFNkRNDA@;=;5kydSOrv{hi#a>{$+~pE7yfMD z;!8#CE@omaH3($(v^W*BlU(HyP-$-=P9~5E;_KIk6b=+4Auxh~ALeBzlU$67F+I+~ zaf+di1t0o}Em`dP2CT$fX1|rNn%mdb=nyYO;x{25jQVIp~&F&L2c!3p}j*SM|7e@HDueHdWwW)%DI=d##mb-@Pi~LY6 zVQt?cW%p+!dOd?-uh|#U5|PoWgn3F~Ha?9c#EEk7v2!p~2G;aqLRY1yD>G>2eYU>S z6BrCdZAw=~xe-+*I#Y_lY{YpPu~KS!4uh$J-zd$c?JV8yo|!;k*7PCthP^{Y28dVj zoAfoF8&n+?ZFd!_joDX`GV#SaWnQY@od;r70wcxQldLWj<<4Dkhd2%PlZCecKk!-Q z8F*Q|IJ_HQ`1#VS^HnAC(bxq3UKiXn^UwXUVv3ldDVKxg--Pe(!0w;x7yI1Fki4Xa zUQh*S7R4C~Qnl*xt6D4pwboSM&ixeuglu)O?d`@`RK4TnRmO$#}2QXs!Vud;T4K=?}%LEx~c6p|t*6MsChRd4ktVYh2nEqH}oV{PD<= z^?;zEek=EoL!`{|6b}7q#>tV07|hK%;|IKc5|1us0A41irp0lN9K+p+opze;4m;a} zt15H2;=%zbIY42op`Ze7gWom4ZPt0{NH$-FRAx?*h26Bc` zkHcfLWjEH;-^WYJ8R5PI7B`sACm_ez`l2uE7{c9h_cfVZbBI^94tn+dRec|ZURWIC5R8^aq^nwE6Dg1%c+rnvE?yzz$$K7K)XtU z18Qr!*Ai_IUCc73z@pcL41$b#(0G@5GgWdc*l8k9Hm?nS6Bg|PK_`R*4&s?@q3qT! z_Ek_@du1Z0RR`}VqfYG{KQkJ1C4OJ?VZU8HV}2?ambLdV(djM#?HiW*7QZ4MS?D|%_lfH`lig^ z#3o(3{hF08rX^2KDExUXWNQ7<)bjJsc%+A31?vkaAH!^<#aO0rCr@aG2`YXiKgLqi z6F*f0iaE{&yl9jenU2m-&xd|68KE_a4biTg(y;TF^}2gk1A#`3wG|@_N07qfr{mRD z{mtjiXAk?osJ>a^JTy{l+>I1VQks}wURKc6)oOR@+bniBbEX&a&Y}w1A>GfqRWY=( z*DZ&5_Hu1RN-&8S#{6)Q2>8{Q)L>X`ALztEhRm`OJU7wEueAO`WAEL`cCc=>0(H&g z(+P78#ofP%09Q2dw7Umib0SGnl7i+PhKGaITZ2nr{C}Jx(|FT`-iv>ZZjNAh8V0aR z4+b}KlCc zcM@+|O-?tj?aQ4;lTR49cW-ByoH-r8Rf6%u(f0FNTQ6aXma>aW$|S>Ngs|J5+QK!x zxTdn{CNvfXEP5v8qe8YPF+!@ta%ED6MY_Q)=xQZc_na|y(@p3Qz#jylbwqEaAU;kA z33qW1UH)+?ll#CjBkov`1d>{xXs$wh04s-fZy^)tlVf?kt;Q>@`>D?N^%N-6Ygro^ zB*8;47-EDf$v(Lr*u7qGf!NKA(QjZ$O}oP$R~36iScD89M42J5k7fD40zNWrK^4Mh zy)diM@*ik+A5g?e0zpxdDLB(?@P++hpP*{HDLl}S&S)I?I}udFc5Kb;Nq>y#eTsuS z|I!@|%XQGzh`gruGmksdLA?T2IgAhlxZ5~(lR19oz1er-7$ZxyY*S-oOeGS1actRO zj`%(CN*M*8VD*aC`&vaFlpxj9lf4X25n+k?fYJ#yDcD3j325CnRE$+L7C#(k5$;rc zVO%>Vm$|zBQ)X>W4K%zi53hymk3+F(a0fWh_2u8jyDYpA-;_0oL22~+-tu~qHdIwd z9`R$kbsO~)=m6>S*1#`=W_DQlfgC9yimEe%+sbThRkR@F^>{ev-T$C!@itcap7E@t zZ+Vr~IXo*NU=2Za$LMiFX3`5f8@j9IYAh_Xx5ok26Oj-xAn{O<);}@X40WywI+!qg z|17yT-E|e@f>J{N0HHQDF03-0pQDha$RSpR z{@p!A*G%w2!H(ct3L>!3WKdj+y^Fxcs4-^*A$#^dj2Y5ZUEMv808Q1 zsJthNdcK`O+6w2}U=uOLP`T`_oH-)V$rrWHQd|*<-dv1PMORs{-;_9*db>tX9T9~E zyBmFH3B#Q?%$y7-Vbu!D-3CJQBplP9KX>}@oU8>Pn&%x8elR}g$SSO1R8yEvMhfEG zB~1pCTPW-P1^1g>S0gUm&m@4H@A;WbOlaM-{}dP^pm6?!?$(Dv>hZJL8ZvT%_T6EQ zWr|=TY1MG)v~w}&&-_IY883$0>+hE-I*c|*aqJ%9`#ooxo}c?slho_C3YxyeQb~{m7^>UbR{x z@}0q7=l*x>)#L|&Iho6CW@zOfceRWw9MP9<%YNNj1T{HUxH*O%onOjsCiC`->~_WT zrhCnruc++bzjhs0P@9~D&2S{A3g=GX1xUk_+pY~Q;~dg*w~L6ULE(?4dDwdTCWxe_ z*rZ+3KQR$qmRp8GD3>iv>0Cg*g3L=352=J4mmNr^b0T~~!cCvEhJ@XMZn;*^5$X4R38YWY827K2j^UKn zbNt%hGbvflR%wr_rmw~A*I|Dqo;G;+__~aqK6gp9BkZSqVp=h4KJU7ps_q~tiDWnH zfkSRnV#ecYBkEM{sJdnWUOyleoP5e?e{E-gkiJgWTJwA6mT0pyEVvL>nE0wOlTGPm z%&KLu&j4!bI~#N%?v$P6B8Fg;yEn(WGO1-5I^~VoOHR1n>XlP=I2@2p3vNz&wW^eg zAXDESPeTz#`XdqWVgtNsYqZpSRo3M;I8j$>ihRNK0VCyHc7Eag=IS9yU*IF3cWkfS zKSVB@Ro_x1^`b{`#XO)8tymoK2j)<3@f1|_s_yyS^@LbSs|L+f}#!$P0L%8eK7 zFX1rP7s!<(gfer?Wm?WmrA@Q>I3+SPUg1?-R08*gZ;5jNM1(k-oqiVB6(=nPyV;Tu zIXbpOQgs<`WTcZ#$o0^p>xHel`J1!NXJPCtjv)&W zBvmPbYkltni#>s@2+D)Xc$gggje?tt-n;Ls56t(`kq?O(i9Eo}M5Z`*?+DO$k1u3F zmj6^z4F4E&7Dm9`;mOk8-rd$@2tn<})OgSMbi`v~3WJfW%-IP0#6gUxO6KuWfRjL7 zb_9Q9HQX-Pe`BpLWiM)2q(zcIUUqsLl~y8Y$~bJtTta0=(Fzf1-LF|dHKJ?1Ae{o* zI+?Wz9mDO)vBvak+yz3wn<1@nI~39Zt5qLt!-&iP(*Bs!rf-p`lur?Yu)niSAR`_b z6MWS81x@OHkf`@95R`?7jC2Xo%Qk6rNQzdgV)?HERbY$)o|kr;qS$=vJ?x6otB6z0VieBS>(voCs!9 zN0g_Twcy|_#m`X!^$ZRX(rWah=)!P7>-$$>yu~ErgJ}jUYeO_+eHFL{d<$piQ`9l+f=BtuuA1oD4;7VnYQC{cDdgf(7*yd9(v-#_&wNCksAaLg4RLU> zk|!(M>|7oz4Mg1U;%@g43XHsMHam)@6H^TT1U2m?9FM$rxr&scaPpQ$d>V;(TMYle zjl|ji1zZXXmjaj6Fg7^xB_hiNQ0N1xkgK23$(%8VJcy&MIcIsPg~B&`Rfp9-N*R5T zkJ9Skr1KY4)sKM>OQK;rFppxOi&hY*@k}cw@`(OZew?=JW?s*Rj0)&QY0`uWdg$~= z?egeb@==2@v7daFgl{7e0bS?OE*X=5511-&vV#O>R*iMIcE+dEFsMvSc|PPCtX1_@~QhhsEE1KsTopU5DfD*&gwaq%6CLetTr ze-#1;;HN(yECRrX~qW!CNPZDMaGwY2#C*CS(|n=1+lW2j_Zt z`}cY~%h<=cJ6{;~H$S}MuhlM1^lmro0AB0+!^T>ZI>~oV{tG79vZ~}k8xR>j^V#L2ZxE>e=x9s6Dx_ce(zIGt1A6!r3$-Io^7GP|t!xs4xT z$$4&&k>3Ds%!IwK;}H(=IB3aK%8n`c-s9wMztegBZqrsP_LRYB0(BczLjAK8guPU* zTk#l~3q+K?7HLwVxT;6eRYBU#%k85i@WJ9R%3kP3jNAAGmo>^;ZY%{kIBY6NfSu3+ zNAu5&N}ysC!aQa0;o{N27QGNYU9@0E)^;V-EEeAIUx;EQCl?tM!thRi+YuqldCS>6 za548g!D+kT%2D<=1F?tW)E7oI=!{2o?)!(wmZG4IJHBL&Eg466S^lR-%73r}aU zUOY6A2XK3)W?cw3%gbkn1_Mkkdla@RxIAw^PN0<)JxdRgV9-X z`^Ul|NHe!39_aluQRtC{XsedGQC_bIv;(F?d-Xk)`&wmG>wl#U&AnyF+zAUaUx}(h z{U~_nP}XPP=g3>Z5USlkE>Zs^9WI2;>P*23C`a1J7sw`3a>~4V<4rO!N_F&~#{Xl( zp$rn&Q=+D6;5;lHR)24%c04|9vAf1>%1BgoDI_J~j>WkEZvRANzT2jd)aK`f(+eHF znw|>5?=FMshVV!`k*0}Vqtp*vt~3|Rnuu>VmQOr5L6?-eIxmnG>5OmmHph@Kp(hks z2?sJcZ{9=B(;gpP7NTS{TGn2W2e(2OH}Y7!v68qWVr^3$9INQ~eu91ifPugO#Y$MB zHIEmi`q_IB1#87Vv`Sc*zsHXbD=hNMv-2sNGL2nf9RTm1s>+tO3TsaveF?*o;f;9> zQ^&0Pu#rxi()Z43{~<(3`UKjX!+<`EJW5N2_7SY|+Um!XoX{$C+@x`VNvRjQ0ucvM zR>7yjDL#yK$3@>U|q5SF`wT*aA z6PTcYsE;)txup2e9UH8IdhCdYCZEoa$Ve-HIMMn#$A`f95%I466nvQoen+8?**j{Li{{!QN471;8 z)>6@nUtL_nrMCqkdhVV|UBh<_E$A7*1ztWM1-*^bb_`MJ-fXN@O01A%o75m4R?-7s zfvaO3e=TWGCpQ@y?-nS+u6OR7-E6tPUYO>Ia>o|L^2Yy&yC0YkzG2xYG!EbO*_zkD z6JFMn?KT_TMS|L4b~R~ShZl$kzJu7?ITtv&f+4kUILYF1(u;5oDt=gD<+OLI6Q%X_!w#mrTO4vkwZ|O0Yr|Z2Rmw z1tu~cXxbxbMQ5~P2x%YOy0<>T{E$9t=1_420zDi^5$C1wVcJo)NoUUE)!rp3+qQRb z{xa+A(Tvk-wfX$b%gasCUdw)YR6u|zsh+Jkt?u=-x$5daNa(;Dek$ft9(lzJB98iK zckJ>*iBLC@M_v`h^~1!rRz{Y{<6a1~j#&MfgAHzJ-h%<$aGlEe36Clo8)HBT{4hOf z{V9B-G+JX!LIR@Jx6dtily{ysco1V`;ymk1H85Sc_sM4EOWGJt;;Cnai?RZkqeA7^ zC{M$d0WX~u_%V>;?;t)6xxj25bj<8BVaA8Y=Qh!{R7P*>u61ow7c>b87s!M5_A`0c z0Axl*qa|&JHq)la*>ge`L_ctq=}0o8bA|@oFUvL8-b93(g_NnVH|^S;R7I3PP}-kW zzBK-+FjnxRFi$U&BcS$Y!>e+K9)|X<87tQ#E@3P@1N* z6hr7qpO7f)0(No2OHB!#ZOr`FlTn8fZ#WY=-&HF|L#=bM&*5|pz>dJ({zj%B?%Ed} z&#`(&KTT01L!->H0Pff$^QBCoO7m_|3qT2L+Q9iVeq$I0yb^B@Gz>d^lykX%XjRxi zSRv{%UEvS&uX0s6FdR9$$N?L*ngh$l@pc2guhMHuiHnxV z)!DG`)8XK*y?y4IPW*gJ9LsnWzi!_FZ(u%J-vk%y{}c9p63GZIvOQpTrLl^!35TA& z*2)BwIEDKW=_2O_R%0{2F|Op=9&iVTFPxUe`-Ma)-glKCr>J#s=b84GBI;L!#45YD z+j6dM)fDRw&cDK!(>nj~tsbkn^{A8>XI!1&B{mAcBqEAQIPGH&Ci85?<#oUikE;5u z9}N+ACP8dGQv1LbX)OS}D10dHR|qBP?k{o+jX(y(imch~s@*40qjNB^`zMa|Y|Pxj zAP^1EOCfg5o;)J&FVmsyqR@6%+Mc2p%r@u)kI$&1s~Zqc7%cbMEAZpC?G!+_mcwOr zA}T6Y|4cbizkUL5v>l5FKI2{MaZ5i-g}`PyoL_Uf4q>fw@riDW9bztG^&3d znIK#-NHyKa*=^rU2i+`B31+qSXl>SMfv=FRxIhr~cn3=b$yB;GPzsqzhT9fWoia6O&gNpPx7$ z2|(VcZD!ruyYXRjUpt(yRa3yswQ_CZYR4=%6V7Hg6<+q!rn!8DC z15)?m^fMnFOa?433%CD$7s`29Z9f=#OcDLgup*su%uo4bUELgpS9 zHvN%`B}e?RFit2IBDD6`xSxQh-UA$Ng zgUO1xfRZWkTC5X{SoiMn?YYaRv5%Qp*+y%#?Fr6tqxLLLcsRt_e}5gVbgl zYm6ZYRbR(eviXRTvJkdu3Ziz6x6)REfyfywpbqS4gGMnY5OZ)qzEBjypVEUGGb#p; z$`4A2#Hiiw9@LU1dT)E`cHZJY_T5gPA@7%vkDodquaQQ<(G}8T<+6|`DX^c5Ganr_ zPL>qG#r^>y%PN?R@8-xLJvGhh2Zck{J>?_x$i^+rQXKb{O$CwbIFYmetHLAWS-uQIy+{FUXEV0WZ_wW+Y-p{fk8A$2j^z-5yOk=PG@P zfQR2YcU@oQ3pxC}Qwuyt_l>>4t^j zh&S4|kLaf>!Ra7+WgdBiiYKjq-qSGr*RQqY(z@ADN~bu@z3c-$pC`SrWl`G;K`C5F z|J2H!0?i#`*Z!GCRn#AEP9C3geWjWYy)5;iw~G#MRymmY!zz>S#xefD@n?a0)^R;sO#0QVh}q zatR6vN(@R5Dg-JI>Hr!E+6MX#h7I-;%nd9SY#QtnoETghTo2p{JQTbQ0v|#I!WW_n zVi^(~@&}{|WHw|QiS>?s^3oDf_p+$h{RJTAN>ya9YE{9pK21V#iSgh+%zgd;>`#2<)S zh|!20h<}j~k?@g}k-U(yk>-&RktLA>k&}_HQBYAVPzq6cP^M8uP!&-fP-9VBP#@92 z(PYug(7e#H(OS@!(QeTx(XG&j(O)qrF_bX^F-9?=F{LphF&D9*vG}lDu)45zu)(qE zu}!d3v3GFLaU^m4aVBxmaT#%Ka7%Ib@JR6-@CxzP@Hz0^@LTX-36u#+2|fu`2{Q?& zi9m^XhysZUi3W&{h_Q*4i3^FxiEl{=N%TlEN%}}$Noh&7NMlLo$)L&j$b!kT$wtY} z$r;HV$a^S2DI_VJC^9LkC}t@hDZwd`Dd{OCDUB!-DF-O8slcgNsDi0dsmiHZs2-`o zsU@lX|K~KsHb5Bw^*?L*-)`|;@&0`m0xt227*>^Ad?53 zBf})B4n~TTi^Rta7Tp;W)Y{ZeUGgZEzkv4y1P0dT@662!hdhJ#__I2j+uGohTf{d% zcibC^vAd&-FX1~q0`tO+jSls35BEfVnXn4JMHE;UpUIyy&KF!(C>r0 z%Gy=4d7FXn9Wnh%*+rs$vxoN^{Qb3bO{H_&%lls9PxpybRTOgutvCd2oJ}emOm-iy z^s689^18FY0uGN_sY50To~9R^BokY?B`)39?sw1chE%W9S@rUHu#FOdK9%7N2m8|t z{{#_nhG9gD97VJR_t8!eoCr5b1sXq;tKnq%HaAr=U&wa`b9PF?6I`WK%V14k8U>t( zJtp>4+seQl634J*UEZ=LYvx~KmGSVmybW++i474c?uGAU`)D^?V$O--{F|IJJ31wL zR!N$^XF4Tz9j^vTp7LMugY)wjT@jviF4X?=&2ORcgb zc;|GyjwaNIXL_bKAMDK6QjBvDE0o9DI39BICCNsb#;eu>#vliEo1>BqReYd0uwLlf z7=Mlnx#*thW%bO|q(psrE7YtOkD9>l7d(~;9+Km~jz5aMv}atEQ!b72FTwmtosP`L zHzHrPrJmB##VZ~n) zW2z0>e<*V=XzOdL>7km`F=5Bw1Hsv#O44=WC$CAELE|IGw2Shb-rhC{Zs<{Nm|6eq z&Hnnx0ajfZZguzFTK$U#uS$OR-Z-N_v;9>SsI9|kiBX4Zn(}x;alls0BOWoG(B;xx zu??B4f~rIX4dn2pw1fN86mxQU3Bii?r)j}6n>Uy1 zA#lO-R+zJFb65V!v#-c_Z|dsM`vc~-lV~jSS$_r^93l_`4uw{>4LZSTj3KV;cC6Mv z5SFGYyfBicCOA==raHP|oTfG~lD48M^7rqGn$S$Eit5;o(+Vc(ChU6L@C8M(n4vE( z%ikGCS{4;4%c$g5Mb+dNO)J6@IWEiM>YFYrq6*#j%M$t@_ndt~LGT=dihtla2RPsu zoW{NE8Cuq0@h<8%o#Ghk7?Dw-o5vw#avs=_&609@UQRo!-8#<;`G4Y?#>~~=?kCdO zbsTlzZArO}FtlEz>_s(ScAn*`5&;_~H7tj5m~=y@DATDI$dgPnjDA~gW!Z(=uugGI zFl$e;kMQ03+^;$!@jVR)ymjA?!_;=)%%a8NJIta;+bOhALD2z#{{y33 BX_Ei| literal 0 HcmV?d00001 diff --git a/fontland/fontland/helper.rkt b/fontland/fontland/helper.rkt index a51dab30..ee52d6e1 100644 --- a/fontland/fontland/helper.rkt +++ b/fontland/fontland/helper.rkt @@ -8,6 +8,7 @@ (define index? (λ (x) (and (number? x) (integer? x) (not (negative? x))))) (define-runtime-path charter-path "assets/charter.ttf") +(define-runtime-path charter-woff-path "assets/charter.woff") (define-runtime-path charter-italic-path "assets/charter-italic.ttf") (define-runtime-path fira-path "assets/fira.ttf") (define-runtime-path fira-otf-path "assets/fira.otf") diff --git a/fontland/fontland/woff-directory.rkt b/fontland/fontland/woff-directory.rkt new file mode 100644 index 00000000..5d48e4f2 --- /dev/null +++ b/fontland/fontland/woff-directory.rkt @@ -0,0 +1,60 @@ +#lang racket/base +(require xenomorph + "tables.rkt" + sugar/unstable/dict) +(provide woff-directory) + +#| +approximates +https://github.com/mbutterick/fontkit/blob/master/src/tables/WOFFDirectory.js +|# + +(define woff-directory-entry + (x:dict + (dictify + 'tag (x:symbol #:length 4) + 'offset (x:pointer #:type uint32be + #:dest-type 'void + #:relative-to 'global) + 'compLength uint32be + 'length uint32be + 'origChecksum uint32be))) + +(define (woff-directory-process dir) + (define tables (make-hasheq)) + (for ([table (in-list (hash-ref dir 'tables))]) + (hash-set! tables (hash-ref table 'tag) table)) + (hash-set! dir 'tables tables) + dir) + +(define woff-directory + (x:dict + #:post-decode woff-directory-process + (dictify + 'tag (x:symbol #:length 4) ;should be 'wOFF + 'flavor uint32be + 'length uint32be + 'numTables uint16be + 'reserved (x:reserved #:type uint16be) + 'totalSfntSize uint32be + 'majorVersion uint16be + 'minorVersion uint16be + 'metaOffset uint32be + 'metaLength uint32be + 'metaOrigLength uint32be + 'privOffset uint32be + 'privLength uint32be + 'tables (x:list #:type woff-directory-entry + #:length (λ (p) (hash-ref p 'numTables)))))) + +(module+ test + (require rackunit "helper.rkt" racket/serialize racket/file racket/pretty) + (define ip (open-input-file charter-woff-path)) + (define dir (decode woff-directory ip)) + (check-equal? (hash-ref dir 'tag) 'wOFF) + (define offset (hash-ref (hash-ref (hash-ref dir 'tables) 'head) 'offset)) + (file-position ip offset) + (define name-table (decode head ip)) + (check-equal? (hash-ref name-table 'magicNumber) #x5F0F3CF5) + (check-equal? (hash-ref name-table 'unitsPerEm) 1000) + (check-equal? (hash-ref name-table 'created) (date* 52 12 5 10 7 2013 3 190 #t -25200 0 "PDT"))) \ No newline at end of file