X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FFontLoader.C;h=7567dde5be7fbfe7552db3874b367e1c5b642c30;hb=28168bd4df9a568e79cdc57cb257743b7adb7c2a;hp=a46495f16bf9f503b39681b79462165bc2457dee;hpb=27de1486ca34aaad446adb798d71a77d6f6304da;p=lyx.git diff --git a/src/FontLoader.C b/src/FontLoader.C index a46495f16b..7567dde5be 100644 --- a/src/FontLoader.C +++ b/src/FontLoader.C @@ -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 -#include // fabs() -#include // atoi() +#include // 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(); +}