示例#1
0
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;
}
示例#2
0
bool
poor_smallcaps_font_rep::supports (string c) {
  return base->supports (uni_upcase_all (c));
}
示例#3
0
bool
poor_stretched_font_rep::supports (string s) {
  return base->supports (s);
}
示例#4
0
bool
poor_distorted_font_rep::supports (string s) {
  return base->supports (s);
}
示例#5
0
bool
poor_bbb_font_rep::supports (string s) {
  return base->supports (s);
}
示例#6
0
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;
}