]> git.lyx.org Git - lyx.git/blobdiff - src/FontLoader.C
work around for bug reported by Mario Morandini
[lyx.git] / src / FontLoader.C
index a46495f16bf9f503b39681b79462165bc2457dee..7567dde5be7fbfe7552db3874b367e1c5b642c30 100644 (file)
@@ -1,30 +1,37 @@
-// -*- C++ -*-
 /* This file is part of
  * ======================================================
- * 
+ *
  *           LyX, The Document Processor
- *      
- *         Copyright (C) 1997 Asger Alstrup
+ *
+ *         Copyright 1997 Asger Alstrup
  *           and the LyX Team.
  *
- *======================================================*/
+ * ====================================================== */
 
 #include <config.h>
-#include <math.h>      // fabs()
-#include <stdlib.h>    // atoi()
+#include <cmath>       // fabs()
 
 #ifdef __GNUG__
 #pragma implementation "FontLoader.h"
 #endif
 
-#include "gettext.h"
 #include "FontLoader.h"
 #include "FontInfo.h"
-#include "error.h"
+#include "gettext.h"
+#include "debug.h"
 #include "lyxrc.h"     // lyxrc.font_*
-extern LyXRC * lyxrc;
-#include "minibuffer.h"
-extern MiniBuffer *minibuffer;
+#include "BufferView.h"
+#include "LyXView.h"
+#include "frontends/GUIRunTime.h"
+
+using std::endl;
+
+extern BufferView * current_view;
+
+
+// The global fontloader
+FontLoader fontloader;
+
 
 // Initialize font loader
 FontLoader::FontLoader()
@@ -32,12 +39,14 @@ FontLoader::FontLoader()
        reset();
 }
 
+
 // Destroy font loader
 FontLoader::~FontLoader()
 {
        unload();
 }
 
+
 // Update fonts after zoom, dpi, font names, or norm change
 // For now, we just ditch all fonts we have. Later, we should
 // reuse the ones that are already loaded.
@@ -46,87 +55,132 @@ void FontLoader::update()
        unload();
 }
 
+
 // Reset font loader
 void FontLoader::reset()
 {
        // Clear font infos, font structs and font metrics
-       for (int i1=0; i1<4; i1++)
-               for (int i2=0; i2<2; i2++)
-                       for (int i3=0; i3<4; i3++) {
+       for (int i1 = 0; i1 < LyXFont::NUM_FAMILIES; ++i1)
+               for (int i2 = 0; i2 < 2; ++i2)
+                       for (int i3 = 0; i3 < 4; ++i3) {
                                fontinfo[i1][i2][i3] = 0;
-                               for (int i4=0; i4<10; i4++) {
+                               for (int i4 = 0; i4<10; ++i4) {
                                        fontstruct[i1][i2][i3][i4] = 0;
                                }
                        }
 }
 
+
 // Unload all fonts
-void FontLoader::unload() 
+void FontLoader::unload()
 {
        // Unload all fonts
-       for (int i1=0; i1<4; i1++)
-               for (int i2=0; i2<2; i2++)
-                       for (int i3=0; i3<4; i3++) {
+       for (int i1 = 0; i1 < LyXFont::NUM_FAMILIES; ++i1)
+               for (int i2 = 0; i2 < 2; ++i2)
+                       for (int i3 = 0; i3 < 4; ++i3) {
                                if (fontinfo[i1][i2][i3]) {
                                        delete fontinfo[i1][i2][i3];
                                        fontinfo[i1][i2][i3] = 0;
                                }
-                               for (int i4=0; i4<10; i4++) {
+                               for (int i4 = 0; i4 < 10; ++i4) {
                                        if (fontstruct[i1][i2][i3][i4]) {
-                                               XFreeFont(fl_display, fontstruct[i1][i2][i3][i4]);
+                                               XFreeFont(GUIRunTime::x11Display(), fontstruct[i1][i2][i3][i4]);
                                                fontstruct[i1][i2][i3][i4] = 0;
                                        }
                                }
                        }
 }
 
+
 // Get font info
 /* Takes care of finding which font that can match the given request. Tries
 different alternatives. */
-void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family, 
-                            LyXFont::FONT_SERIES series, 
+void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
+                            LyXFont::FONT_SERIES series,
                             LyXFont::FONT_SHAPE shape)
 {
        // Do we have the font info already?
        if (fontinfo[family][series][shape] != 0)
                return;
 
-       // Special code for the symbol family
-       if (family == LyXFont::SYMBOL_FAMILY){
-               fontinfo[family][series][shape] = new FontInfo("-*-symbol-*");
-               return;
+       // Special fonts
+       switch (family)
+       {
+               case LyXFont::SYMBOL_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-symbol-*-*-*-*-*-*-*-*-*-*-adobe-fontspecific");
+                       return;
+
+               case LyXFont::CMR_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmr10-medium-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMSY_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmsy10-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMM_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmmi10-medium-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::CMEX_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-cmex10-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::MSA_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-msam10-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::MSB_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-msbm10-*-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               case LyXFont::EUFRAK_FAMILY:
+                       fontinfo[family][series][shape] =
+                               new FontInfo("-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*");
+                       return;
+
+               default:
+                       break;
        }
 
+
        // Normal font. Let's search for an existing name that matches.
-       LString ffamily;
-       LString fseries;
-       LString fshape;
-       LString norm = lyxrc->font_norm;
-       LString fontname;
+       string ffamily;
+       string fseries;
+       string fshape;
+       string norm = lyxrc.font_norm;
+       string fontname;
 
        FontInfo * fi = new FontInfo();
        fontinfo[family][series][shape] = fi;
 
-       for (int cfam=0; cfam < 2; cfam++) {
+       for (int cfam = 0; cfam < 2; ++cfam) {
                // Determine family name
                switch (family) {
                case LyXFont::ROMAN_FAMILY:
                        switch (cfam) {
-                       case 0: ffamily = lyxrc->roman_font_name; break;
+                       case 0: ffamily = lyxrc.roman_font_name; break;
                        case 1: ffamily = "-*-times";
                        default: cfam = 100;
                        }
                        break;
                case LyXFont::SANS_FAMILY:
                        switch (cfam) {
-                       case 0: ffamily = lyxrc->sans_font_name; break;
+                       case 0: ffamily = lyxrc.sans_font_name; break;
                        case 1: ffamily = "-*-helvetica";
                        default: cfam = 100;
                        }
                        break;
                case LyXFont::TYPEWRITER_FAMILY:
                        switch (cfam) {
-                       case 0: ffamily = lyxrc->typewriter_font_name; break;
+                       case 0: ffamily = lyxrc.typewriter_font_name; break;
                        case 1: ffamily = "-*-courier";
                        default: cfam = 100;
                        }
@@ -134,7 +188,7 @@ void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
                default: ;
                }
 
-               for (int cser=0; cser < 4; cser++) {
+               for (int cser = 0; cser < 4; ++cser) {
                        // Determine series name
                        switch (series) {
                        case LyXFont::MEDIUM_SERIES:
@@ -157,7 +211,7 @@ void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
                        default: ;
                        }
 
-                       for (int csha=0; csha < 2; csha++) {
+                       for (int csha = 0; csha < 2; ++csha) {
                                // Determine shape name
                                switch (shape) {
                                case LyXFont::UP_SHAPE:
@@ -195,56 +249,90 @@ void FontLoader::getFontinfo(LyXFont::FONT_FAMILY family,
        }
 }
 
+
+// A dummy fontstruct used when there is no gui.
+namespace {
+
+XFontStruct dummyXFontStruct;
+bool dummyXFontStructisGood = false;
+
+} // namespace anon
+
 /// Do load font
-XFontStruct* FontLoader::doLoad(LyXFont::FONT_FAMILY family, 
-                               LyXFont::FONT_SERIES series, 
-                               LyXFont::FONT_SHAPE shape, 
+XFontStruct * FontLoader::doLoad(LyXFont::FONT_FAMILY family,
+                               LyXFont::FONT_SERIES series,
+                               LyXFont::FONT_SHAPE shape,
                                LyXFont::FONT_SIZE size)
 {
-       getFontinfo(family,series,shape);
-       int fsize = (int) ( (lyxrc->font_sizes[size] * lyxrc->dpi * 
-                               (lyxrc->zoom/100.0) ) / 72.27 + 0.5 );
+       if (!lyxrc.use_gui) {
+               if (!dummyXFontStructisGood) {
+                       // no character specific info
+                       dummyXFontStruct.per_char = 0;
+                       // unit ascent on character displays
+                       dummyXFontStruct.ascent = 1;
+                       // no descent on character displays
+                       dummyXFontStruct.descent = 0;
+                       dummyXFontStructisGood = true;
+               }
+
+               return &dummyXFontStruct;
+       }
+
+       getFontinfo(family, series, shape);
+       int fsize = int((lyxrc.font_sizes[size] * lyxrc.dpi *
+                         (lyxrc.zoom/100.0)) / 72.27 + 0.5);
 
-       LString font = fontinfo[family][series][shape]->getFontname(fsize);
+       string font = fontinfo[family][series][shape]->getFontname(fsize);
 
        if (font.empty()) {
-               lyxerr.print("No font matches request. Using 'fixed'.");
-               lyxerr.print("Start LyX as 'lyx -dbg 515' to get more information.");
+               lyxerr << "No font matches request. Using 'fixed'." << endl;
+               lyxerr << "Start LyX as 'lyx -dbg 515' to get more information." << endl;
                font = "fixed";
        }
 
-       minibuffer->Store();
-       minibuffer->Set(_("Loading font into X-Server..."));
+       XFontStruct * fs = 0;
+
+       current_view->owner()->messagePush(_("Loading font into X-Server..."));
 
-       XFontStruct* fs = XLoadQueryFont(fl_display, font.c_str());
+       fs = XLoadQueryFont(GUIRunTime::x11Display(), font.c_str());
 
        if (fs == 0) {
-               if (font=="fixed") {
-                       lyxerr.print("We're doomed. Can't get 'fixed' font.");
+               if (font == "fixed") {
+                       lyxerr << "We're doomed. Can't get 'fixed' font." << endl;
                } else {
-                       lyxerr.print("Could not get font. Using 'fixed'.");
-                       fs = XLoadQueryFont(fl_display, "fixed");
-               }
-       } else {
-               if (lyxerr.debugging(Error::FONT)) {
-                       // Tell user the font matching
-                       LyXFont f;
-                       f.setFamily(family);
-                       f.setSeries(series);
-                       f.setShape(shape);
-                       f.setSize(size);
-                       // The rest of the attributes are not interesting
-                       f.setEmph(LyXFont::INHERIT);
-                       f.setUnderbar(LyXFont::INHERIT);
-                       f.setNoun(LyXFont::INHERIT);
-                       f.setLatex(LyXFont::INHERIT);
-                       f.setColor(LyXFont::INHERIT_COLOR);
-                       lyxerr.print(LString("Font '") + f.stateText() 
-                                     + "' matched by\n" + font + '\n');
+                       lyxerr << "Could not get font. Using 'fixed'." << endl;
+                       fs = XLoadQueryFont(GUIRunTime::x11Display(), "fixed");
                }
+       } else if (lyxerr.debugging(Debug::FONT)) {
+               // Tell user the font matching
+               LyXFont f;
+               f.setFamily(family);
+               f.setSeries(series);
+               f.setShape(shape);
+               f.setSize(size);
+               // The rest of the attributes are not interesting
+               f.setEmph(LyXFont::INHERIT);
+               f.setUnderbar(LyXFont::INHERIT);
+               f.setNoun(LyXFont::INHERIT);
+               f.setColor(LColor::inherit);
+               lyxerr << "Font '" << f.stateText(0)
+                      << "' matched by\n" << font << endl;
        }
-       minibuffer->Reset();
+
+       current_view->owner()->messagePop();
 
        fontstruct[family][series][shape][size] = fs;
        return fs;
 }
+
+
+bool FontLoader::available(LyXFont const & f)
+{
+       if (!lyxrc.use_gui)
+               return false;
+
+       if (!fontinfo[f.family()][f.series()][f.realShape()])
+               getFontinfo(f.family(), f.series(), f.realShape());
+       return fontinfo[f.family()][f.series()][f.realShape()]
+               ->getFontname(f.size()).size();
+}