bool poor_rubber_font_rep::supports (string s) { if (starts (s, "<big-") && (ends (s, "-1>") || ends (s, "-2>"))) { string r= s (5, N(s) - 3); if (ends (r, "lim")) r= r (0, N(r) - 3); if (starts (r, "up")) r= r (2, N(r)); if (N(r) > 1) r= "<" * r * ">"; return base->supports (r); } if (starts (s, "<mid-")) s= "<left-" * s (5, N(s)); if (starts (s, "<right-")) s= "<left-" * s (7, N(s)); if (starts (s, "<large-")) s= "<left-" * s (7, N(s)); if (starts (s, "<left-")) { string r; int pos= search_backwards ("-", N(s), s); if (pos > 6) r= s (6, pos); else r= s (6, N(s)-1); //cout << "Check " << base->res_name << ", " << s // << ", " << r << LF; if (r == "(" || r == ")" || r == "[" || r == "]" || r == "{" || r == "}" || r == "/" || r == "\\" || r == "|") return base->supports (r); if (r == "||" || r == "interleave") { if (base->supports ("<" * r * ">")) return true; return base->supports ("|"); } if (r == "llbracket" || r == "rrbracket" || r == "lfloor" || r == "rfloor" || r == "lceil" || r == "rceil" || r == "dlfloor" || r == "drfloor" || r == "dlceil" || r == "drceil" || r == "tlbracket" || r == "trbracket" || r == "tlfloor" || r == "trfloor" || r == "tlceil" || r == "trceil") { if (base->supports ("<" * r * ">")) return true; return base->supports ("[") && base->supports ("]"); } if (r == "langle" || r == "rangle") { if (base->supports ("<" * r * ">")) return true; //return base->supports ("<less>") && base->supports ("<gtr>"); } } return false; }
bool poor_smallcaps_font_rep::supports (string c) { return base->supports (uni_upcase_all (c)); }
bool poor_stretched_font_rep::supports (string s) { return base->supports (s); }
bool poor_distorted_font_rep::supports (string s) { return base->supports (s); }
bool poor_bbb_font_rep::supports (string s) { return base->supports (s); }
int poor_rubber_font_rep::search_font (string s, string& r) { if (starts (s, "<big-") && (ends (s, "-1>") || ends (s, "-2>"))) { r= s; return 2*MAGNIFIED_NUMBER + 4; } if (starts (s, "<mid-")) s= "<left-" * s (5, N(s)); if (starts (s, "<right-")) s= "<left-" * s (7, N(s)); if (starts (s, "<large-")) s= "<left-" * s (7, N(s)); if (starts (s, "<left-")) { int pos= search_backwards ("-", N(s), s), num; if (pos > 6) { r= s (6, pos); num= as_int (s (pos+1, N(s)-1)); } else { r= s (6, N(s)-1); num= 0; } //cout << "Search " << base->res_name << ", " << s // << ", " << r << ", " << num << LF; int nr= max (num - 5, 0); int thin= (is_thin (r)? 1: 0); int code; if (num <= MAGNIFIED_NUMBER || r == "/" || r == "\\" || r == "langle" || r == "rangle") { num= min (num, MAGNIFIED_NUMBER); if (N(r) > 1) r= "<" * r * ">"; if (N(r)>1 && !base->supports (r)) { if (r == "<||>") r= "<emu-dbar>"; else if (r == "<interleave>") r= "<emu-tbar>"; else if (r == "<llbracket>") r= "<emu-dlbracket>"; else if (r == "<rrbracket>") r= "<emu-drbracket>"; else r= "<emu-" * r (1, N(r)-1) * ">"; } else if (r == "\\" && base->supports ("/")) { metric ex1, ex2; base -> get_extents ("/", ex1); base -> get_extents ("\\", ex2); double h1= ex1->y2 - ex1->y1; double h2= ex2->y2 - ex2->y1; if (fabs ((h2/h1) - 1.0) > 0.05) r= "<emu-backslash>"; } return 2*num + thin; } else if (r == "(") code= virt->dict ["<rubber-lparenthesis-#>"]; else if (r == ")") code= virt->dict ["<rubber-rparenthesis-#>"]; else if (r == "[") code= virt->dict ["<rubber-lbracket-#>"]; else if (r == "]") code= virt->dict ["<rubber-rbracket-#>"]; else if (r == "{") code= virt->dict ["<rubber-lcurly-#>"]; else if (r == "}") code= virt->dict ["<rubber-rcurly-#>"]; else if (r == "|") code= virt->dict ["<rubber-bar-#>"]; else if (r == "||") { if (base->supports ("<||>")) code= virt->dict ["<rubber-parallel-#>"]; else code= virt->dict ["<rubber-parallel*-#>"]; } else if (r == "interleave") { if (base->supports ("<interleave>")) code= virt->dict ["<rubber-interleave-#>"]; else code= virt->dict ["<rubber-interleave*-#>"]; } else if (r == "lfloor" || r == "rfloor" || r == "lceil" || r == "rceil" || r == "llbracket" || r == "rrbracket") { if (base->supports ("<" * r * ">")) code= virt->dict ["<rubber-" * r * "-#>"]; else code= virt->dict ["<rubber-" * r * "*-#>"]; } else if (r == "dlfloor" || r == "drfloor" || r == "dlceil" || r == "drceil" || r == "tlbracket" || r == "trbracket" || r == "tlfloor" || r == "trfloor" || r == "tlceil" || r == "trceil") code= virt->dict ["<rubber-" * r * "-#>"]; else code= virt->dict ["<rubber-lparenthesis-#>"]; r= string ((char) code) * as_string (nr + HUGE_ADJUST) * ">"; return 2*MAGNIFIED_NUMBER + 2 + thin; } r= s; return 0; }