1signature ACCENT  =
2sig
3  val makeAccent: (BasicTypes.family * BasicTypes.charCode) option ->
4                  BasicTypes.style -> BasicTypes.family ->
5                  BasicTypes.charCode -> BoxTypes.box -> BoxTypes.box
6end  (* signature ACCENT *)
7(*----------*)
8
9structure Accent: ACCENT  =
10struct
11  open BasicTypes;  open BoxTypes
12  open Int
13  open MakeChar; open CharInfo; open CharFunctions
14  open StyleParams
15  open NodeListDim; open Distance
16  open MakeVBox; open BoxPack
17
18  fun getSkew st (SOME (fam,ch)) = charAccentSkew (fontNumber st fam, ch)
19    | getSkew _  NONE              = 0
20
21  fun widestAccent limit st fam ch =
22  let val font = fontNumber st fam
23  in case charLarger (font, ch) of
24       SOME ch' => if charWidth (font, ch') > limit then ch
25                   else widestAccent limit st fam ch'
26     | NONE     => ch
27  end
28
29  fun makeAccent singleChar st fam ch box =
30  let val ch'        = widestAccent (#width box) st fam ch
31      val accentBox  = boxList (makeChar st fam ch')
32      val skew       = getSkew st singleChar
33      val hzShift    = skew + half (#width box - #width accentBox)
34      val vtKern     = min (#height box, xHeight st)
35  in upVBox (#width box) box [Kern (~vtKern), Box (hzShift, accentBox)] end
36
37end  (* structure Accent *)
38