/**
 * This module contains metrics regarding fonts and individual symbols. The sigma
 * and xi variables, as well as the CHARACTER_METRICS_MAP map contain data extracted from
 * TeX, TeX font metrics, and the TTF files. These data are then exposed via the
 * `metrics` variable and the getCharacterMetrics function.
 */ import CHARACTER_METRICS_MAP from './font-metrics-data' ; interface CharacterMetrics { defaultMetrics : boolean ; depth : number ; height : number ; italic : number ; skew : number ; } export interface FontMetrics < T = number > { slant : T ; space : T ; stretch : T ; shrink : T ; xHeight : T ; quad : T ; extraSpace : T ; num1 : T ; num2 : T ; num3 : T ; denom1 : T ; denom2 : T ; sup1 : T ; sup2 : T ; sup3 : T ; sub1 : T ; sub2 : T ; supDrop : T ; subDrop : T ; delim1 : T ; delim2 : T ; axisHeight : T ; defaultRuleThickness : T ; bigOpSpacing1 : T ; bigOpSpacing2 : T ; bigOpSpacing3 : T ; bigOpSpacing4 : T ; bigOpSpacing5 : T ; sqrtRuleThickness : T ; } const CJK_REGEX = /[\u3040-\u309F]|[\u30A0-\u30FF]|[\u4E00-\u9FAF]|[\uAC00-\uD7AF]/ ; export const PT_PER_EM = 10.0 ; export const AXIS_HEIGHT = 0.25 ; export const BASELINE_SKIP = 1.2 ; export const X_HEIGHT = 0.431 ; export const FONT_METRICS = { slant : [ 0.25 , 0.25 , 0.25 ] , space : [ 0.0 , 0.0 , 0.0 ] , stretch : [ 0.0 , 0.0 , 0.0 ] , shrink : [ 0.0 , 0.0 , 0.0 ] , xHeight : [ X_HEIGHT , X_HEIGHT , X_HEIGHT ] , quad : [ 1.0 , 1.171 , 1.472 ] , extraSpace : [ 0.0 , 0.0 , 0.0 ] , num1 : [ 0.677 , 0.732 , 0.925 ] , num2 : [ 0.394 , 0.384 , 0.387 ] , num3 : [ 0.444 , 0.471 , 0.504 ] , denom1 : [ 0.686 , 0.752 , 1.025 ] , denom2 : [ 0.345 , 0.344 , 0.532 ] , sup1 : [ 0.413 , 0.503 , 0.504 ] , sup2 : [ 0.363 , 0.431 , 0.404 ] , sup3 : [ 0.289 , 0.286 , 0.294 ] , sub1 : [ 0.15 , 0.143 , 0.2 ] , sub2 : [ 0.247 , 0.286 , 0.4 ] , supDrop : [ 0.386 , 0.353 , 0.494 ] , subDrop : [ 0.05 , 0.071 , 0.1 ] , delim1 : [ 2.39 , 1.7 , 1.98 ] , delim2 : [ 1.01 , 1.157 , 1.42 ] , axisHeight : [ AXIS_HEIGHT , AXIS_HEIGHT , AXIS_HEIGHT ] , defaultRuleThickness : [ 0.04 , 0.049 , 0.049 ] , bigOpSpacing1 : [ 0.111 , 0.111 , 0.111 ] , bigOpSpacing2 : [ 0.166 , 0.166 , 0.166 ] , bigOpSpacing3 : [ 0.2 , 0.2 , 0.2 ] , bigOpSpacing4 : [ 0.6 , 0.611 , 0.611 ] , bigOpSpacing5 : [ 0.1 , 0.143 , 0.143 ] , sqrtRuleThickness : [ 0.04 , 0.04 , 0.04 ] , } ; export const FONT_SCALE = [ 0 , 0.5 , 0.7 , 0.8 , 0.9 , 1.0 , 1.2 , 1.44 , 1.728 , 2.074 , 2.488 , ] ; export const DEFAULT_FONT_SIZE = 5 ; const extraCharacterMap = { '\u00A0' : '\u0020' , '\u200B' : '\u0020' , 'Å' : 'A' , 'Ç' : 'C' , 'Ð' : 'D' , 'Þ' : 'o' , 'å' : 'a' , 'ç' : 'c' , 'ð' : 'd' , 'þ' : 'o' , 'А' : 'A' , 'Б' : 'B' , 'В' : 'B' , 'Г' : 'F' , 'Д' : 'A' , 'Е' : 'E' , 'Ж' : 'K' , 'З' : '3' , 'И' : 'N' , 'Й' : 'N' , 'К' : 'K' , 'Л' : 'N' , 'М' : 'M' , 'Н' : 'H' , 'О' : 'O' , 'П' : 'N' , 'Р' : 'P' , 'С' : 'C' , 'Т' : 'T' , 'У' : 'y' , 'Ф' : 'O' , 'Х' : 'X' , 'Ц' : 'U' , 'Ч' : 'h' , 'Ш' : 'W' , 'Щ' : 'W' , 'Ъ' : 'B' , 'Ы' : 'X' , 'Ь' : 'B' , 'Э' : '3' , 'Ю' : 'X' , 'Я' : 'R' , 'а' : 'a' , 'б' : 'b' , 'в' : 'a' , 'г' : 'r' , 'д' : 'y' , 'е' : 'e' , 'ж' : 'm' , 'з' : 'e' , 'и' : 'n' , 'й' : 'n' , 'к' : 'n' , 'л' : 'n' , 'м' : 'm' , 'н' : 'n' , 'о' : 'o' , 'п' : 'n' , 'р' : 'p' , 'с' : 'c' , 'т' : 'o' , 'у' : 'y' , 'ф' : 'b' , 'х' : 'x' , 'ц' : 'n' , 'ч' : 'n' , 'ш' : 'w' , 'щ' : 'w' , 'ъ' : 'a' , 'ы' : 'm' , 'ь' : 'a' , 'э' : 'e' , 'ю' : 'm' , 'я' : 'r' , } ; param fontName export function getCharacterMetrics ( codepoint , fontName ) { if ( codepoint === undefined ) codepoint = 77 ; const metrics = CHARACTER_METRICS_MAP [ fontName ] [ codepoint ] ; if ( metrics ) { return { defaultMetrics : false , depth : metrics [ 0 ] , height : metrics [ 1 ] , italic : metrics [ 2 ] , skew : metrics [ 3 ] , } ; } if ( codepoint === 11034 ) { return { defaultMetrics : true , depth : 0.2 , height : 0.8 , italic : 0 , skew : 0 , } ; } const char = String . fromCodePoint ( codepoint ) ; if ( char in extraCharacterMap ) { codepoint = extraCharacterMap [ char ] . codePointAt ( 0 ) ; } else if ( CJK_REGEX . test ( char ) ) { codepoint = 77 ; return { defaultMetrics : true , depth : 0.2 , height : 0.9 , italic : 0 , skew : 0 , } ; } return { defaultMetrics : true , depth : 0.2 , height : 0.7 , italic : 0 , skew : 0 , } ; }