%====================================================================== % This is % pawn.mf % % Copyright (C) 1989-93 by Elmar Bartel. % % 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. % This is the oldest part of all my the MF-sources. % I started Metafonting with this figure. % ElB. %====================================================================== %----------------------------------------------------------- % This macro depends on some global sizes: % thin, BottomSpace, BottomWidth, sidewith % The values are defined as basic sizes of the Chess Characters def PawnShape(expr wbf,hbf,wmf,hmf,wtf,htf,ibm,imt) = %begingroup %save wb,wm,wt,hb,hm,ht,interbm,intermt; numeric wb,wm,wt,hb,hm,ht,interbm,intermt; wb = BottomWidth*wbf; % width of bottom ellipse hb = hbf*wb; % hight of bottom ellipse wm = wmf*wb; hm = hmf*wm; % width and hight of middle ellipse wt = wtf*wb; ht = htf*wt; % width and hight of top ellipse interbm = ibm*thin; % amount of intersection of bottom % and middle intermt = imt*thin; % amount of intersection of middle %and top %save superb,superm,supert; numeric superb,superm,supert; superb=.73; superm=.75; supert=.73; %save topb,topm,topt; numeric topb,topm,topt; topb=BottomSpace+hb; topm=topb+hm-interbm; topt=topm+ht-intermt; %screenrule((0,BottomSpace),(qs,BottomSpace)); %screenrule(((qs-wb)/2,0),((qs-wb)/2,qs)); %screenrule(((qs+wb)/2,0),((qs+wb)/2,qs)); %screenrule((0,topb),(qs,topb)); %screenrule((0,topm),(qs,topm)); %screenrule((0,topt),(qs,topt)); %save bp,mp,tp; numeric bp,mp,tp; path bp,mp,tp,PawnPath; %save x,y,z; %pair z[]b,x[]b,y[]b; %pair z[]m,x[]m,y[]m; %pair z[]t,x[]t,y[]t; bot rt z1b = ((qs+wb)/2, BottomSpace); bot lft z3b = ((qs-wb)/2, BottomSpace); bot y4b + hb = top y2b - hb = BottomSpace; x2b = x4b = qs/2; bp=superellipse(z1b,z2b,z3b,z4b,superb); bp:= subpath(0,4) of bp; rt x1m - wm/2 = lft x3m + wm/2 = qs/2; top y2m = bot y4m + hm = topm; y1m = y3m = (y2m+y4m)/2; x2m = x4m = qs/2; mp=superellipse(z1m,z2m,z3m,z4m,superm); rt x1t - wt/2 = lft x3t + wt/2 = qs/2; top y2t = bot y4t + ht = topt; y1t = y3t = (y2t+y4t)/2; x2t = x4t = qs/2; tp=superellipse(z1t,z2t,z3t,z4t,supert); % compute the intersectiontimes on the right side of the pawn % The pathtimes of superellipses range from 0 to 8 %save scbr,scmbr,scmtr,sctr; numeric scbr,scmbr,scmtr,sctr; scbr = xpart (bp intersectiontimes (subpath(6,8)of mp)); scmbr = xpart (mp intersectiontimes (subpath(0,2)of bp)); scmtr = xpart (mp intersectiontimes (subpath(6,8)of tp)); sctr = xpart (tp intersectiontimes (subpath(0,2)of mp)); % here is a macro to mirror pathtimes of superellipses on y-axis def mr(expr v) = if v > 4: 12-v; else: 4-v; fi enddef; % Now the left intersectionpoints %save scbl,scmbl,scmtl,sctl; numeric scbl,scmbl,scmtl,sctl; scbl = mr(scbr); scmbl = mr(scmbr); scmtl = mr(scmtr); sctl = mr(sctr); PawnPath:=subpath(0,scbr)of bp .. subpath(scmbr,(8+scmtr)) of mp .. subpath(sctr,8+sctl) of tp .. subpath(scmtl,scmbl) of mp .. subpath(scbl,4) of bp; %endgroup enddef; %----------------------------------------------------------- def MakePawnPath = pickup chess_pen; if unknown PawnPath: % wb = qs - 2*sidespace; % width of bottom ellipse % hb = hbf*wb; % hight of bottom ellipse % wm = wmf*wb; hm = hmf*wm; % width and hight of middle % ellipse % wt = wtf*wb; ht = htf*wt; % width and hight of top % ellipse % % wbf, hbf, ,wmf, hmf, wtf, htf, ibm, imt %PawnShape( .80, .50, .55, .85, .3, 1.0, 2.0, 1.2); %PawnShape( .85, .55, .60, .90, .4, 1.0, 2.0, 1.2); PawnShape( .77, .61, .60, .84, .35, 0.95, 1.8, 1.4); fi enddef; %------------------------------------------------------------ def CorrectPawnEdges = pickup sqr; drawdot(z1b); drawdot(z3b); enddef; %----------------------------------------------------------- %we have to define six essential characters: % WoW NoW BoW WoB NoB BoB %Pawn 0 6 12 18 24 30 %Knight 1 7 13 19 25 31 %Bishop 2 8 14 20 26 32 %Rook 3 9 15 21 27 33 %Queen 4 10 16 22 28 34 %King 5 11 17 23 29 35 % All these cases are repeated three more times: % Left turned, Right turned and upside down %------------------------------------------ def MakeWhitePawn = pickup chess_pen; clearit; MakePawnPath; draw PawnPath -- cycle; cullit; WhiteMan:= currentpicture; enddef; def MakeBlackPawn = pickup chess_pen; clearit; MakePawnPath; filldraw PawnPath -- cycle; cullit; BlackMan:= currentpicture; enddef; def MakeOuterShape = pickup frame_pen; clearit; filldraw PawnPath -- cycle; cullit; OuterShape:= currentpicture; enddef; MakeWhitePawn; MakeBlackPawn; MakeNeutral(WhiteMan, BlackMan); MakeOuterShape; %=========================================================== % this one for testing %beginchar(Pawn+White+OnBlack, qs#, qs#, 0); % "White pawn on black field"; % MakeBlackField; % currentpicture:= currentpicture - OuterShape; % cullit; % currentpicture:= currentpicture + WhiteMan; %endchar; %endinput %=========================================================== beginchar(Pawn+White+OnWhite, qs#, qs#, 0); "White pawn on white field"; currentpicture:= WhiteMan; endchar; beginchar(Pawn+White+OnWhite+LeftTurned, qs#, qs#, 0); "White pawn on white field rotated to the left"; currentpicture:= TurnLeft(WhiteMan); endchar; beginchar(Pawn+White+OnWhite+RightTurned, qs#, qs#, 0); "White pawn on white field rotated to the right"; currentpicture:= TurnRight(WhiteMan); endchar; beginchar(Pawn+White+OnWhite+UpSideDown, qs#, qs#, 0); "White pawn on white field upside down"; currentpicture:= TurnUpSideDown(WhiteMan); endchar; beginchar(Pawn+Black+OnWhite, qs#, qs#, 0); "Black pawn on white field"; currentpicture:= BlackMan; endchar; beginchar(Pawn+Black+OnWhite+LeftTurned, qs#, qs#, 0); "Black pawn on white field rotated to the left"; currentpicture:= TurnLeft(BlackMan); endchar; beginchar(Pawn+Black+OnWhite+RightTurned, qs#, qs#, 0); "Black pawn on white field rotated to the right"; currentpicture:= TurnRight(BlackMan); endchar; beginchar(Pawn+Black+OnWhite+UpSideDown, qs#, qs#, 0); "Black pawn on white field upside down"; currentpicture:= TurnUpSideDown(BlackMan); endchar; beginchar(Pawn+Neutral+OnWhite, qs#, qs#, 0); "Neutral pawn on white field"; currentpicture:= NeutralMan; endchar; beginchar(Pawn+Neutral+OnWhite+LeftTurned, qs#, qs#, 0); "Neutral pawn on white field rotated to the left"; currentpicture:= TurnLeft(NeutralMan); endchar; beginchar(Pawn+Neutral+OnWhite+RightTurned, qs#, qs#, 0); "Neutral pawn on white field rotated to the right"; currentpicture:= TurnRight(NeutralMan); endchar; beginchar(Pawn+Neutral+OnWhite+UpSideDown, qs#, qs#, 0); "Neutral pawn on white field upside down"; currentpicture:= TurnUpSideDown(NeutralMan); endchar; beginchar(Pawn+White+OnBlack, qs#, qs#, 0); "White pawn on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + WhiteMan; endchar; beginchar(Pawn+White+OnBlack+LeftTurned, qs#, qs#, 0); "White pawn on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(WhiteMan); endchar; beginchar(Pawn+White+OnBlack+RightTurned, qs#, qs#, 0); "White pawn on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(WhiteMan); endchar; beginchar(Pawn+White+OnBlack+UpSideDown, qs#, qs#, 0); "White pawn on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(WhiteMan); endchar; beginchar(Pawn+Neutral+OnBlack, qs#, qs#, 0); "Neutral pawn on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + NeutralMan; endchar; beginchar(Pawn+Neutral+OnBlack+LeftTurned, qs#, qs#, 0); "Neutral pawn on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(NeutralMan); endchar; beginchar(Pawn+Neutral+OnBlack+RightTurned, qs#, qs#, 0); "Neutral pawn on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(NeutralMan); endchar; beginchar(Pawn+Neutral+OnBlack+UpSideDown, qs#, qs#, 0); "Neutral pawn on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(NeutralMan); endchar; beginchar(Pawn+Black+OnBlack, qs#, qs#, 0); "Black pawn on black field"; MakeBlackField; currentpicture:= currentpicture - OuterShape; cullit; currentpicture:= currentpicture + BlackMan; endchar; beginchar(Pawn+Black+OnBlack+LeftTurned, qs#, qs#, 0); "Black pawn on black field turned to the left"; MakeBlackField; currentpicture:= currentpicture - TurnLeft(OuterShape); cullit; currentpicture:= currentpicture + TurnLeft(BlackMan); endchar; beginchar(Pawn+Black+OnBlack+RightTurned, qs#, qs#, 0); "Black pawn on black field turned to the right"; MakeBlackField; currentpicture:= currentpicture - TurnRight(OuterShape); cullit; currentpicture:= currentpicture + TurnRight(BlackMan); endchar; beginchar(Pawn+Black+OnBlack+UpSideDown, qs#, qs#, 0); "Black pawn on black field upsidedown"; MakeBlackField; currentpicture:= currentpicture - TurnUpSideDown(OuterShape); cullit; currentpicture:= currentpicture + TurnUpSideDown(BlackMan); endchar;