%%% @mffile{ %%% filename="mftools.mf", %%% version="", %%% date="", %%% filetype="mf inputfile", %%% package="m-capbas.arj" %%% author="Phons Bloemen (PhB)", %%% address="Eindhoven U. of Technology, %%% Fac. of Electrical Engineering, %%% P. O. Box 513, NL-5600 MB Eindhoven %%% email="Internet: phons@ei.ele.tue.nl", %%% codetable="ISO/ASCII", %%% checksumtype="none", %%% checksum="0", %%% keywords="", %%% abstract="Metafont file containing a collection of %%% macros to do various funny things to characters. %%% Usage: copy a standard font file ('cmtt10.mf') and %%% paste a copy of the 'endchar' function from 'plain.mf' %%% into it. Edit the 'endchar' function to your wishes %%% using these macros. The macros work on the already %%% rendered characters before they are stored into the %%% font. Let METAFONT run and watch the results! %%% Examples of changed 'endchars' in cmbugs.mf and cmgray.mf %%% Part of Capital Baseball package" %%% copyright="Copyleft (L) Phons Bloemen (PhB), %%% according to GNU public licence version 2 or later. %%% (1) Do not change this file (even its name) %%% (2) if you do make changes, first rename it to some %%% other name, and mark your changes clearly.", %%% } %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To 'outline' a picture. Only the 'edge' of a picture remains. % Thickness of edge controlled by 'th'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def ooutline (expr th) = save v,n; cull currentpicture keeping (1,infinity); picture v; v:= currentpicture; clearit; for n = 0 step 45 until 359: addto currentpicture also (v shifted ((0,th) rotated n)); addto currentpicture also -v; cull currentpicture keeping (-infinity,-1) withweight -1; endfor; cull currentpicture keeping (-infinity,-1); enddef; def outline (expr th) = begingroup; save v,n; cull currentpicture keeping (1,infinity); picture v; v:= currentpicture; clearit; for n = 0 step 24 until 359: addto currentpicture also (v shifted ((0,th) rotated n)); endfor; cull currentpicture keeping (1,infinity); addto currentpicture also -v; endgroup; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To 'double outline' a picture, with a surrounding line. % Parameter tha controls the thickness of the surrounding line, % parameter thb-tha controls the distance between line and picture %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def douboutline (expr thb,tha) = begingroup; save va,vb; picture va,vb; va:=currentpicture; outline(tha); vb := currentpicture; currentpicture := va; outline(thb); addto currentpicture also va - vb; cull currentpicture keeping (1,infinity); endgroup; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % gentile: generate a tiling pattern % A pattern of tiles is generated, large enough to cover any % character in the font. One tile is k*l 'units' long. The units % are numbered 0 -- (k*l)-1. On the units listed in 't', a dot is % put down with the pencil typed by 'potlood'. The parameters % 'ww,hh,dd' outline the largest character in the font. % Use the gentile macro before doing anything with the font, and % save the resulting tiling pattern in a separate 'picture' % variable. This picture variable can then be used by 'tilepic'. % Parameters: % ww: base width of the font (width of letter 'M') % hh: base height of font (height of capitals) % dd: base depth of font (depth of descenders) % k, l: the tile consists of k x l 'pixels' % gr: granularity factor. The 'currentpicture' is divided into % 1/gr x 1/gr pixels, the pixels are grouped together to tiles. % A pixels will be of size (w*gr * (h+d)*gr). Low values % mean finer patterns, but they consume a lot of Metafonts % resources, and may be subject to 'discretization' % problems. A big metafont can handle about gr=0.001. % potlood: A pencil type. Usually a circular tip. % t: a list of numbers, indicating 0,1,2 % the dots in a tile. A 3 x 3 3,4,5 % tile is numbered like this: 6,7,8 % Other tile sizes have similar numberings. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def gentile(expr gr,k,l,ww,hh,dd,potlood,pict)(text t) = begingroup mode_setup; charcode:=0; charwd:=ww; w:=hround(charwd*hppp); charht:=hh; h:=vround(charht*hppp); chardp:=dd; d:=vround(chardp*hppp); charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar; pickup potlood xscaled (gr*w/1) yscaled(gr*(h+d)/1); for c = t : drawdot((c mod k)*gr*w,floor(c/k)*gr*(h+d)-d); cull currentpicture keeping (1,infinity) withweight 1; endfor; for a=1,2,4,8,16,32,64,128,256,512,1024,2048: exitif ((a * gr * l) > 1); b := (a*gr*l*(h+d)); addto currentpicture also currentpicture shifted (0,b); cull currentpicture keeping (1,infinity) withweight 1; endfor; for a=1,2,4,8,16,32,64,128,256,512,1024,2048: exitif ((a * gr * k) > 1); b := (a*gr*k*w); addto currentpicture also currentpicture shifted (b,0); cull currentpicture keeping (1,infinity) withweight 1; endfor; groundpattern := currentpicture; scantokens extra_endchar; chardx:=w; % desired width of the character in pixels pixels_per_inch:=pixels_per_inch/mag; %%% otherwise magnification is squared endgroup; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The current picture is overlaid by a tiling pattern 'til'. The % pattern may be generated with 'gentile' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def tilepic (expr til) = cull currentpicture keeping (1,infinity) withweight 1; addto currentpicture also til shifted (0,-d); cull currentpicture keeping (2,infinity) withweight 1; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % As tilepic, but the current picture is first 'outlined': it % will become patterned with tile pattern 'til', and with black % edges. The parameter 'th' controls edge thickness %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def otilepic (expr til,th)= save v,n; cull currentpicture keeping (1,infinity); picture v; v:= currentpicture; clearit; for n = 0 step 24 until 359: addto currentpicture also (v shifted ((0,th) rotated n)); endfor; cull currentpicture keeping (1,infinity); cull v keeping (1,infinity) withweight -1; addto v also currentpicture; addto currentpicture also til shifted (0,-d); cull currentpicture keeping (2,2); addto currentpicture also v; cull currentpicture keeping (1,infinity); enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % xmirror and ymirror % Mirrors a picture. This is done around the central vertical % (horizontal) axis of the character: the line x=.5w (y=.5h) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def xmirror = save v,n,t; t := tracingequations; tracingequations := 1; cull currentpicture keeping (1,infinity); picture v; v:= currentpicture; clearit; currentpicture := v reflectedabout ((0,0), (0,h)) shifted (w,0); enddef; def ymirror = save v,n,t; t := tracingequations; tracingequations := 1; cull currentpicture keeping (1,infinity); picture v; v:= currentpicture; clearit; currentpicture := v reflectedabout ((0,0), (w,0)) shifted (0,h); enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % reversevideo % Inverts a picture. The outer boundary is assumed to be % rectangular. A box of width w (character width) and % height h + d. Here w,h,d are defined by 'beginchar' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def reversevideo = begingroup; save vv,v; picture v,vv; cull currentpicture keeping (1,infinity); v:= currentpicture; clearit; fill (0,h)--(w,h)--(w,-d)--(0,-d)--cycle; cull currentpicture keeping (1,infinity); vv:=currentpicture-v; currentpicture:=vv; endgroup; enddef;