%%%%%%%%%%%%%%%%% Endehandlung nach Zeichenbestimmung %%%%%%%%%%%%%%%%%%%%%%
%
% Copyright 1995, 2010 Norbert Schwarz
% You may freely use, modify, and/or distribute this file, without limitation.
%
%  Dies wird am Ende jeden Zeichens  v o r  "endchar ausgefuehrt.
%
%  Dort koennen globale Design-Entscheidungen durch evtl.
%  Mehrfachausgaben realisiert wdrden.
%
mode_setup;

pen  penxy;
picture bild; picture bildb;
path negpath;

def dofinishing =
    prule;                  % Rule in xheight-- Hoehe
    for j:=1 step 1 until subchar:
      firstpath:= firstpathcount[j];
      lastpath := lastpathcount[j];
%     message "path "&decimal j ;
%     message "   from "&decimal firstpath;
%     message "   to "&decimal lastpath ;
      if j > 1 :
         penxy := defaultpen;
         if known penrand : defaultpen := defaultpen scaled penrand; fi
         cullit;   undrawallpath;
         if sharpedges>0: cullit; shutedges -1; fi
         defaultpen :=penxy;
         cullit;
      fi
      drawallpath;
%     if globalslant>0 : "with slant"; fi
      if sharpedges>0  :
%          "with sharp edges";
          shutedges 1;
      fi
      if hohl>0   l:
%         "'hohl'";
          cullit;
          pickup pencircle scaled hohl;
          undrawallpath;
          cullit;
          if sharpedges>0  : shutedges -1 ; fi
          cullit;
      fi
      if extraline>0 :
%       " with extraline";
        pickup pencircle scaled extraline;
        drawallpath;
        if sharpedges>0   : shutedges 1; fi
    fi
    endfor
    if negativ > 0:
       cullit; bild:=currentpicture;
       clearit;
    negpath:=  (-0.5*SYMBWIDTH/scalefak ,-0.35maxy)--
               ( 0.5*SYMBWIDTH/scalefak ,-0.35maxy)--
               ( 0.5*SYMBWIDTH/scalefak , 1.2maxy)--
               (-0.5*SYMBWIDTH/scalefak , 1.2maxy)--cycle;
%              (-0.5*SYMBWIDTH/scalefak ,-0.35maxy)..cycle;
        fill  (negpath shifted (shiftfak,0) scaled scalefak);
       cullit;
       bildb := currentpicture;
       clearit;
       currentpicture := bildb-bild;
       cullit;
%      showit;
     fi
    clearallpath;
    enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%def comment text x=
%      for k:=0 step 29 until (length x)+ 28 :
%       special " 9"&substring(k,k+29) of(x&"                              ") ;
%       numspecial 0;numspecial 0; endfor  enddef;

def corrwidth expr x=  charwd:=x/pt;
                        w:=x;
                        h:=w;
                        enddef;
def prule =
       proofrule((0,0.5capheight),(capheight,0.5capheight));
       proofrule((0,0.25capheight),(capheight,0.25capheight));
       proofrule((0,0.75capheight),(capheight,0.75capheight));
       proofrule((0.25capheight,0),(0.25capheight,capheight));
       proofrule((0.75capheight,0),(0.75capheight,capheight));
       proofrule((  0.5capheight,0),(0.5capheight,capheight));enddef;



sheight := 0.75 xheight;

vardef make@#=
   if (length str@#) = 1: charcode:=ASCII str @#; else: charcode:=0; fi
   "Generierung: "&str@#;
   beginchar(charcode,10,10,0);
     char@#;
   endchar;
   enddef;



path allpath[];

def clearallpath =
    subchar := 1;
    firstpathcount[subchar]:=0;
    lastpathcount[subchar]:=-1;
    pathcount:=-1;  enddef;

def nextsubchar =
    subchar := subchar+1;
    firstpathcount[subchar]:=pathcount+1;
    lastpathcount[subchar]:=pathcount;
    enddef;


clearallpath;
pen shutpen;
path unitpath;



def shutedges expr www  =
    unitpath := (-0.5,-0.5)--(0.5,-0.5)--(0.5,0.5)--(-0.5,0.5)..cycle;
    shutwidth := abs pen_lft + pen_rt;
    for i:=firstpath step 1 until lastpath:
        if cycle allpath[i]:
           else:
             shutpen:= makepen (unitpath scaled shutwidth
                       rotated (angle(direction 0 of allpath[i])))
                       slanted  globalslant ;
             pickup shutpen;
                     drawdot ((point 0 of allpath[i])
                             slanted globalslant)
                             withweight www;
             shutpen:= makepen (unitpath scaled shutwidth
                       rotated (angle (direction infinity of allpath[i])))
                       slanted  globalslant ;
             pickup shutpen; drawdot ((point infinity of allpath[i])
                       slanted globalslant)
                      withweight www;
           fi
     endfor
     pickup defaultpen;
     enddef;

def savepath text p =   pathcount:=pathcount+1;
                        lastpathcount[subchar]:=pathcount;
                        allpath[pathcount]:=p;  enddef;

def drawallpath =
    if globalslant=0:
      for i:=firstpath step 1 until lastpath: draw allpath[i]; endfor
      else:
      for i:=firstpath step 1 until lastpath:
              draw (allpath[i] slanted globalslant);
          endfor
      fi
  enddef;

def undrawallpath =
    if globalslant=0:
      for i:=firstpath step 1 until lastpath: undraw allpath[i]; endfor
      else:
      for i:=firstpath step 1 until lastpath:
              undraw (allpath[i] slanted globalslant);
          endfor
      fi
  enddef;


%=====================================================================


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$%%%%%
%%%%%%%%%%%%%% Makros und Konstanten zum Font  O C R B  %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% ==========
designfaktor := designsize*0.1;

capheight := 12.275*mm*designfaktor;        % Hoehe von "E" unskaliert
xheight   := 0.5*capheight * designfaktor;  %
SYMBWIDTH := 2.54mm*designfaktor;           % 10 Zeichen je inch

scalefak  := mm*2.28/11.4*designfaktor; % ================================

path o.s[][];

ocrb.penwidth     := 1.75;        % Strichstaerke
ocrb.width        := 7 + ocrb.penwidth;

pen defaultpen;
defaultpen :=pencircle scaled (ocrb.penwidth*scalefak);
maxy := 12.6 + 0.5ocrb.penwidth;

%shiftfak := 0.5maxy;
shiftfak := (0.5SYMBWIDTH)/scalefak;
path xpath;

%------- font dimensionen
 ptscale := 1/pt;

 font_x_height       (8.5+0.5ocrb.penwidth)*scalefak / pt * designfaktor;
 font_slant          globalslant ;
 font_normal_space   1.0 * SYMBWIDTH    * ptscale;
 font_normal_stretch 0.0 * SYMBWIDTH    * ptscale;
 font_normal_shrink  0.0 * SYMBWIDTH    * ptscale;
 font_quad           2.0 * SYMBWIDTH    * ptscale;
 font_extra_space    1.0 * SYMBWIDTH    * ptscale;

%============= Ligaturtabelle  fuer Umlaute ====================

ligtable "a" : oct"042" =: oct"200";
ligtable "o" : oct"042" =: oct"201";
ligtable "u" : oct"042" =: oct"202";
ligtable "A" : oct"042" =: oct"203";
ligtable "O" : oct"042" =: oct"204";
ligtable "U" : oct"042" =: oct"205";

%===============================================================


def makechar expr charnumber =
 if known o.i[charnumber] :
 beginchar(charnumber,ocrb.width,ocrb.width,0);
 pickup defaultpen;
   kx := 0;
   for i:=1 step 1 until o.i[charnumber]:
     if known o.s[charnumber][i] :
          xpath :=(o.s[charnumber][i] shifted (shiftfak,0) ) scaled scalefak;
          savepath xpath;
          for k:=0 step 1 until (length xpath):
              kx:=kx+1;
              z[kx] = point k of xpath;
          endfor
     fi
  endfor
 if proofing>0 :
   labels(0,1,2,3,4,5,6,7,8,9);
   labels(10,11,12,13,14,15,16,17,18,19);
   labels(20,21,22,23,24,25,26,27,28,29);
   labels(30,31,32,33,34,35,36,37,38,39);
 fi
 dofinishing;
%corrwidth capheight;
 corrwidth SYMBWIDTH;
% Tiefe korrigieren
 if known o.m[charnumber]:
   if (o.m[charnumber]-(0.5*ocrb.penwidth))< 0:
     chardp := ((o.m[charnumber]-(0.5*ocrb.penwidth)) * scalefak ) / pt;
     d :=vround (chardp*pt);
   fi
 fi
 endchar;
 else:
   message "unknown character referenced in makechar";
 fi
enddef;

body_height#:=11.5*scalefak;
asc_height#:= 11.5*scalefak;
cap_height#:= 11.5*scalefak;
fig_height#:= 12.6*scalefak;
x_height#:=    8.5*scalefak;
math_axis#:=   8.5*scalefak;

hohl := lightfactor * ocrb.penwidth * scalefak;   %   0<= lightfactor < 1