3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author Alejandro Aguilar Sierra
7 * \author John Levon, moz@compsoc.man.ac.uk
13 #include XPM_H_LOCATION
16 #pragma implementation
19 #include "support/LAssert.h"
20 #include "support/lstrings.h"
22 #include "MathsSymbols.h"
23 #include "GUIRunTime.h"
29 #ifndef CXX_GLOBAL_CSTD
33 /* Latex code for those bitmaps */
43 #include "ams_misc.xbm"
44 #include "ams_arrows.xbm"
45 #include "ams_rel.xbm"
46 #include "ams_nrel.xbm"
47 #include "ams_ops.xbm"
49 #include "mathed/math_parser.h"
61 #include "equation.xpm"
63 char const * function_names[] = {
64 "arccos", "arcsin", "arctan", "arg", "bmod",
65 "cos", "cosh", "cot", "coth", "csc", "deg",
66 "det", "dim", "exp", "gcd", "hom", "inf", "ker",
67 "lg", "lim", "liminf", "limsup", "ln", "log",
68 "max", "min", "sec", "sin", "sinh", "sup",
72 int const nr_function_names = sizeof(function_names) / sizeof(char const *);
74 char const * latex_arrow[] = {
75 "downarrow", "leftarrow", "Downarrow", "Leftarrow",
76 "hookleftarrow", "rightarrow", "uparrow", "Rightarrow", "Uparrow",
77 "hookrightarrow", "updownarrow", "Leftrightarrow", "leftharpoonup",
78 "rightharpoonup", "rightleftharpoons", "leftrightarrow", "Updownarrow",
79 "leftharpoondown", "rightharpoondown", "mapsto",
80 "Longleftarrow", "Longrightarrow", "Longleftrightarrow",
81 "longleftrightarrow", "longleftarrow", "longrightarrow", "longmapsto",
82 "nwarrow", "nearrow", "swarrow", "searrow", "",
85 int const nr_latex_arrow = sizeof(latex_arrow) / sizeof(char const *);
87 char const * latex_bop[] = {
88 "pm", "cap", "diamond", "oplus",
89 "mp", "cup", "bigtriangleup", "ominus",
90 "times", "uplus", "bigtriangledown", "otimes",
91 "div", "sqcap", "triangleright", "oslash",
92 "cdot", "sqcup", "triangleleft", "odot",
93 "star", "vee", "amalg", "bigcirc",
94 "setminus", "wedge", "dagger", "circ",
95 "bullet", "wr", "ddagger", ""
98 int const nr_latex_bop = sizeof(latex_bop) / sizeof(char const *);
100 char const * latex_brel[] = {
101 "leq", "geq", "equiv", "models",
102 "prec", "succ", "sim", "perp",
103 "preceq", "succeq", "simeq", "mid",
104 "ll", "gg", "asymp", "parallel",
105 "subset", "supset", "approx", "smile",
106 "subseteq", "supseteq", "cong", "frown",
107 "sqsubseteq", "sqsupseteq", "doteq", "neq",
108 "in", "ni", "propto", "notin",
109 "vdash", "dashv", "bowtie", ""
112 int const nr_latex_brel = sizeof(latex_brel) / sizeof(char const *);
114 char const * latex_dots[] = {
115 "ldots", "cdots", "vdots", "ddots"
118 int const nr_latex_dots = sizeof(latex_dots) / sizeof(char const *);
120 char const * latex_greek[] = {
121 "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
122 "Sigma", "Upsilon", "Phi", "Psi", "Omega",
123 "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
124 "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
125 "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
126 "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
129 int const nr_latex_greek = sizeof(latex_greek) / sizeof(char const *);
131 char const * latex_misc[] = {
132 "nabla", "partial", "infty", "prime", "ell",
133 "emptyset", "exists", "forall", "imath", "jmath",
134 "Re", "Im", "aleph", "wp", "hbar",
135 "angle", "top", "bot", "Vert", "neg",
136 "flat", "natural", "sharp", "surd", "triangle",
137 "diamondsuit", "heartsuit", "clubsuit", "spadesuit",
138 "textrm Å", "textrm Ø", "mathcircumflex", "_",
140 "mathbb N", "mathbb Z", "mathbb Q",
141 "mathbb R", "mathbb C", "mathbb H",
142 "mathcal F", "mathcal L",
143 "mathcal H", "mathcal O", ""
146 int const nr_latex_misc = sizeof(latex_misc) / sizeof(char const *);
148 char const * latex_varsz[] = {
149 "sum", "int", "oint",
150 "prod", "coprod", "bigsqcup",
151 "bigotimes", "bigodot", "bigoplus",
152 "bigcap", "bigcup", "biguplus",
153 "bigvee", "bigwedge", ""
156 int const nr_latex_varsz = sizeof(latex_varsz) / sizeof(char const *);
158 char const * latex_ams_misc[] = {
159 "digamma", "varkappa", "beth", "daleth", "gimel",
160 "ulcorner", "urcorner", "llcorner", "lrcorner",
161 "hbar", "hslash", "vartriangle",
162 "triangledown", "square", "lozenge",
163 "circledS", "angle", "measuredangle",
164 "nexists", "mho", "Finv",
165 "Game", "Bbbk", "backprime",
166 "varnothing", "blacktriangle", "blacktriangledown",
167 "blacksquare", "blacklozenge", "bigstar",
168 "sphericalangle", "complement", "eth",
169 "diagup", "diagdown", ""
172 int const nr_latex_ams_misc = sizeof(latex_ams_misc) / sizeof(char const *);
174 char const * latex_ams_arrows[] = {
175 "dashrightarrow", "dashleftarrow", "leftleftarrows",
176 "leftrightarrows", "Lleftarrow", "twoheadleftarrow",
177 "leftarrowtail", "looparrowleft", "leftrightharpoons",
178 "curvearrowleft", "circlearrowleft", "Lsh",
179 "upuparrows", "upharpoonleft", "downharpoonleft",
180 "multimap", "leftrightsquigarrow", "rightrightarrows",
181 "rightleftarrows", "rightrightarrows", "rightleftarrows",
182 "twoheadrightarrow", "rightarrowtail", "looparrowright",
183 "rightleftharpoons", "curvearrowright", "circlearrowright",
184 "Rsh", "downdownarrows", "upharpoonright",
185 "downharpoonright", "rightsquigarrow",
186 "nleftarrow", "nrightarrow", "nLeftarrow",
187 "nRightarrow", "nleftrightarrow", "nLeftrightarrow"
190 int const nr_latex_ams_arrows = sizeof(latex_ams_arrows) / sizeof(char const *);
192 char const * latex_ams_rel[] = {
193 "leqq", "leqslant", "eqslantless", "eqslantgtr", "gtrsim", "gtrapprox",
194 "lesssim", "lessapprox", "approxeq", "gtrdot", "ggg", "gtrless",
195 "lessdot", "lll", "lessgtr", "gtreqless", "gtreqqless", "eqcirc",
196 "lesseqgtr", "lesseqqgtr", "doteqdot", "circeq", "triangleq", "thicksim",
197 "risingdotseq", "fallingdotseq", "backsim", "thickapprox", "supseteqq", "Supset",
198 "backsimeq", "subseteqq", "Subset","sqsupset", "succcurlyeq", "curlyeqsucc",
199 "sqsubset", "preccurlyeq", "curlyeqprec", "succsim", "succapprox", "vartriangleright",
200 "precsim", "precapprox", "vartriangleleft", "trianglerighteq", "Vdash", "shortmid",
201 "trianglelefteq", "vDash", "Vvdash", "shortparallel", "between", "pitchfork",
202 "smallsmile", "smallfrown", "bumpeq", "varpropto", "blacktriangleleft", "therefore",
203 "Bumpeq", "geqq", "geqslant", "backepsilon", "blacktriangleright", "because"
206 int const nr_latex_ams_rel = sizeof(latex_ams_rel) / sizeof(char const *);
208 char const * latex_ams_nrel[] = {
209 "nless", "nleq", "nleqslant", "ngeqslant", "ngeqq", "gneq",
210 "nleqq", "lneq", "lneqq","gneqq", "gvertneqq", "gnsim",
211 "lvertneqq", "lnsim", "lnapprox", "gnapprox", "nsucc", "nsucceq",
212 "nprec", "npreceq", "precnsim","succnsim", "succnapprox", "ncong",
213 "precnapprox", "nsim", "nshortmid", "nshortparallel", "nparallel", "nvDash",
215 "nmid", "nvdash", "nvDash","nVDash", "ntriangleright", "ntrianglerighteq",
216 "ntriangleleft", "ntrianglelefteq", "nsubseteq", "nsupseteq", "nsupseteqq", "supsetneq",
217 "subsetneq", "varsubsetneq", "subsetneqq", "varsupsetneq", "supsetneqq", "varsupsetneqq",
218 "varsubsetneqq", "ngtr", "ngeq","", "", ""
221 int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
224 char const * latex_ams_ops[] = {
225 "dotplus", "smallsetminus", "Cap",
226 "Cup", "barwedge", "veebar",
227 "doublebarwedge", "boxminus", "boxtimes",
228 "boxdot", "boxplus", "divideontimes",
229 "ltimes", "rtimes", "leftthreetimes",
230 "rightthreetimes", "curlywedge", "curlyvee",
231 "circleddash", "circledast", "circledcirc",
232 "centerdot", "intercal", ""
235 int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
237 static char const ** mathed_get_pixmap_from_icon(int d)
240 case MM_FRAC: return frac;
241 case MM_SQRT: return sqrt_xpm;
242 case MM_SUPER: return super_xpm;
243 case MM_SUB: return sub_xpm;
244 case MM_STYLE: return style_xpm;
245 case MM_DELIM: return delim;
246 case MM_MATRIX: return matrix;
247 case MM_EQU: return equation;
248 case MM_DECO: return deco;
249 case MM_SPACE: return space_xpm;
254 static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
256 char const ** data = 0;
261 for (; i < 11; ++i) {
262 char const ** latex_str = 0;
264 case 0: latex_str = latex_greek; break;
265 case 1: latex_str = latex_bop; break;
266 case 2: latex_str = latex_brel; break;
267 case 3: latex_str = latex_arrow; break;
268 case 4: latex_str = latex_varsz; break;
269 case 5: latex_str = latex_misc; break;
270 case 6: latex_str = latex_ams_misc; break;
271 case 7: latex_str = latex_ams_arrows; break;
272 case 8: latex_str = latex_ams_rel; break;
273 case 9: latex_str = latex_ams_nrel; break;
274 case 10: latex_str = latex_ams_ops; break;
275 // Add AMS stuff here -- MV
278 for (int k = 0; latex_str[k][0] > ' '; ++k) {
279 if (compare(latex_str[k], s) == 0) {
286 if (i < 11 && id >= 0) {
287 unsigned char const * bdata = 0;
293 lyxerr [Debug::MATHED] << "Imando " << i << ", " << id << endl;
332 } else if (id > 28) {
362 } else if (id > 36) {
387 XImage * xima = XCreateImage(GUIRunTime::x11Display(), 0, 1, XYBitmap, 0,
388 const_cast<char*>(reinterpret_cast<char const *>(bdata)), w, h, 8, 0);
389 xima->byte_order = LSBFirst;
390 xima->bitmap_bit_order = LSBFirst;
391 int x = (id % dw) * ww;
392 int y = (id/dw) * hh;
393 if (ww > wx) ww = wx;
394 if (hh > hx) hh = hx;
395 XImage * sbima = XSubImage(xima, x, y, ww, hh);
396 XpmCreateDataFromImage(GUIRunTime::x11Display(), const_cast<char***>(&data), sbima, sbima, 0);
398 // Dirty hack to get blue symbols quickly
399 char * sx = const_cast<char*>(strstr(data[2], "FFFFFFFF"));
401 for (int k = 0; k < 8; ++k) sx[k] = '0';
404 // XDestroyImage(xima);
411 char const ** get_pixmap_from_symbol(char const * arg, int wx, int hx)
415 char const ** data = 0;
416 latexkeys const * l = in_word_set(arg);
422 data = mathed_get_pixmap_from_icon(MM_FRAC);
425 data = mathed_get_pixmap_from_icon(MM_SQRT);
434 // I have to use directly the bitmap data since the
435 // bitmap tables are not yet created when this
436 // function is called.
437 data = pixmapFromBitmapData(arg, wx, hx);