-// -*- C++ -*-
/* This file is part of
- * ======================================================
- *
+ * ======================================================
+ *
* LyX, The Document Processor
- *
+ *
* Copyright 1997 Asger Alstrup
* and the LyX Team.
*
#include <config.h>
#include <cmath> // fabs()
-#include <cstdlib> // atoi()
#ifdef __GNUG__
#pragma implementation "FontLoader.h"
#endif
-#include "gettext.h"
#include "FontLoader.h"
#include "FontInfo.h"
+#include "gettext.h"
#include "debug.h"
#include "lyxrc.h" // lyxrc.font_*
#include "BufferView.h"
#include "LyXView.h"
-#include "minibuffer.h"
+#include "frontends/GUIRunTime.h"
using std::endl;
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.
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.
string ffamily;
string fseries;
}
-// A dummy fontstruct used when there is no gui.
-static XFontStruct dummyXFontStruct;
-static bool dummyXFontStructisGood = false;
+// 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)
{
if (!lyxrc.use_gui) {
if (!dummyXFontStructisGood) {
// no character specific info
- dummyXFontStruct.per_char = 0;
+ dummyXFontStruct.per_char = 0;
// unit ascent on character displays
- dummyXFontStruct.ascent = 1;
+ dummyXFontStruct.ascent = 1;
// no descent on character displays
- dummyXFontStruct.descent = 0;
+ dummyXFontStruct.descent = 0;
dummyXFontStructisGood = true;
}
}
getFontinfo(family, series, shape);
- int fsize = int( (lyxrc.font_sizes[size] * lyxrc.dpi *
- (lyxrc.zoom/100.0) ) / 72.27 + 0.5 );
+ int fsize = int((lyxrc.font_sizes[size] * lyxrc.dpi *
+ (lyxrc.zoom/100.0)) / 72.27 + 0.5);
string font = fontinfo[family][series][shape]->getFontname(fsize);
XFontStruct * fs = 0;
- current_view->owner()->getMiniBuffer()->Store();
- current_view->owner()->getMiniBuffer()->Set(_("Loading font into X-Server..."));
- fs = XLoadQueryFont(fl_display, font.c_str());
-
+ current_view->owner()->messagePush(_("Loading font into X-Server..."));
+
+ fs = XLoadQueryFont(GUIRunTime::x11Display(), font.c_str());
+
if (fs == 0) {
if (font == "fixed") {
lyxerr << "We're doomed. Can't get 'fixed' font." << endl;
} else {
lyxerr << "Could not get font. Using 'fixed'." << endl;
- fs = XLoadQueryFont(fl_display, "fixed");
+ fs = XLoadQueryFont(GUIRunTime::x11Display(), "fixed");
}
} else if (lyxerr.debugging(Debug::FONT)) {
// Tell user the font matching
f.setEmph(LyXFont::INHERIT);
f.setUnderbar(LyXFont::INHERIT);
f.setNoun(LyXFont::INHERIT);
- f.setLatex(LyXFont::INHERIT);
f.setColor(LColor::inherit);
- lyxerr << "Font '" << f.stateText(0)
+ lyxerr << "Font '" << f.stateText(0)
<< "' matched by\n" << font << endl;
}
- current_view->owner()->getMiniBuffer()->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();
+}