% 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