diff options
Diffstat (limited to 'fonts/utilities/fontinst/inputs/base/bbox.sty')
-rw-r--r-- | fonts/utilities/fontinst/inputs/base/bbox.sty | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/fonts/utilities/fontinst/inputs/base/bbox.sty b/fonts/utilities/fontinst/inputs/base/bbox.sty new file mode 100644 index 0000000000..d06bc8f47c --- /dev/null +++ b/fonts/utilities/fontinst/inputs/base/bbox.sty @@ -0,0 +1,163 @@ + +% bbox.sty -- bounding box extension for fontinst +% +% This file defines the following commands for setting, resetting, +% and unsetting the bounding boxes of glyphs: +% +% \setglyphbb{GLYPH}{LEFT}{BOTTOM}{RIGHT}{TOP} +% \resetglyphbb{GLYPH}{LEFT}{BOTTOM}{RIGHT}{TOP} +% \unsetglyphbb{GLYPH} +% +% It also defines the following four integer expressions for +% quering bounding box metrics: +% +% \bbleft{GLYPH} +% \bbbottom{GLYPH} +% \bbright{GLYPH} +% \bbtop{GLYPH} +% +% For glyphs that do not have a bounding box set, they default +% to using the "TeX box" of the glyph. +% +% Finally, the file changes AFM-to-MTX conversions so that bounding +% box information is converted to \setglyphbb commands and augments +% font transformation and reglyphing to preserve this information. + + +\needsfontinstversion{1.927} + +\fontinstcc + +\def\resetglyphbb#1#2#3#4#5{ + \eval_expr_to\a_count{#2} + \eval_expr_to\b_count{#3} + \eval_expr_to\c_count{#4} + \eval_expr_to\d_count{#5} + \x_cs\edef{gb-#1}{ + {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count} + } +} +\def\setglyphbb#1#2#3#4#5{ + \if_undefined{gb-\glyph_name_modifier{#1}}\then + \resetglyphbb{\glyph_name_modifier{#1}}{#2}{#3}{#4}{#5} + \fi +} +\def\unsetglyphbb#1{\x_cs\let{gb-#1}=\x_relax} + +\def\first_of_four#1#2#3#4{#1} +\def\second_of_four#1#2#3#4{#2} +\def\third_of_four#1#2#3#4{#3} +\def\fourth_of_four#1#2#3#4{#4} + +\def\bbleft#1{ + \if_defined{gb-#1}\then + \expandafter\expandafter \expandafter\first_of_four + \csname gb-#1\endcsname + \else + 0 + \fi +} +\def\bbbottom#1{ + \if_defined{gb-#1}\then + \expandafter\expandafter \expandafter\second_of_four + \csname gb-#1\endcsname + \else + \neg{\depth{#1}} + \fi +} +\def\bbright#1{ + \if_defined{gb-#1}\then + \expandafter\expandafter \expandafter\third_of_four + \csname gb-#1\endcsname + \else + \width{#1} + \fi +} +\def\bbtop#1{ + \if_defined{gb-#1}\then + \expandafter\expandafter \expandafter\fourth_of_four + \csname gb-#1\endcsname + \else + \height{#1} + \fi +} + + +% Make \afmtomtx generate \setglyphbb commands: +\def\afm_char{ + \a_count=-\bbox_lly + \eval_expr{ + \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury + } + \out_line{ + \ifnum -1<\char_slot + \string\setrawglyph + \else + \string\setnotglyph + \fi + {\char_name} + {\raw_font_name} + {10pt} + {\the\char_slot} + {\the\x_width} + {\the\bbox_ury} + {\the\a_count} + {\the\result} + } + \out_line{ + \string\setglyphbb{\char_name} + {\the\bbox_llx}{\the\bbox_lly}{\the\bbox_urx}{\the\bbox_ury} + } +} + + +% Make sure \setglyphbb is transformed OK. +% Slanting of course cannot be done exactly when only the bbox +% is known. +\def\mtxtomtx_setglyphbb#1#2#3#4#5{ + \eval_expr_to\a_count{\add{ + \scale{#2}{\int{x-scale}} + }{ + \scale{#3}{\int{slant-scale}} + }} + \eval_expr_to\b_count{\scale{#3}{\int{y-scale}}} + \eval_expr_to\c_count{\add{ + \scale{#4}{\int{x-scale}} + }{ + \scale{#5}{\int{slant-scale}} + }} + \eval_expr_to\d_count{\scale{#5}{\int{y-scale}}} + \out_line{ + \string\setglyphbb{#1} + {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count} + } +} + +\add_to\mtxtomtx_redefinitions{ + \let\setglyphbb=\mtxtomtx_setglyphbb +} + +% Finally, for completeness, the analogous thing for reglyphing. + +\def\reglyph_setglyphbb#1#2#3#4#5{ + \command_survivance=0 + \def\glyphname{#1} + \csname slots-#1\endcsname + \iftokeep\command_survivance\then + \out_line{ + \string\setglyphbb{\glyphname}{#2}{#3}{#4}{#5} + } + \fi +} + +\add_to\reglyph_redefinitions{ + \let\setglyphbb=\reglyph_setglyphbb +} + + +\normalcc + + +\endinput + + |