products/Sources/formale Sprachen/C/Lyx/src image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: FontLoader.C   Sprache: C

Original von: Lyx©

// -*- C++ -*-
/* This file is part of
 * ======================================================
 * 
 *           LyX, The Document Processor
 *   
 *     Copyright (C) 1997 Asger Alstrup
 *           and the LyX Team.
 *
 *======================================================*/


#include <config.h>
#include <math.h> // fabs()
#include <stdlib.h> // atoi()

#ifdef __GNUG__
#pragma implementation "FontLoader.h"
#endif

#include "gettext.h"
#include "FontLoader.h"
#include "FontInfo.h"
#include "error.h"
#include "lyxrc.h" // lyxrc.font_*
extern LyXRC * lyxrc;
#include "minibuffer.h"
extern MiniBuffer *minibuffer;

// Initialize font loader
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.
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++) {
    fontinfo[i1][i2][i3] = 0;
    for (int i4=0; i4<10; i4++) {
     fontstruct[i1][i2][i3][i4] = 0;
    }
   }
}

// Unload all fonts
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++) {
    if (fontinfo[i1][i2][i3]) {
     delete fontinfo[i1][i2][i3];
     fontinfo[i1][i2][i3] = 0;
    }
    for (int i4=0; i4<10; i4++) {
     if (fontstruct[i1][i2][i3][i4]) {
      XFreeFont(fl_display, 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, 
        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;
 }

 // Normal font. Let's search for an existing name that matches.
 LString ffamily;
 LString fseries;
 LString fshape;
 LString norm = lyxrc->font_norm;
 LString fontname;

 FontInfo * fi = new FontInfo();
 fontinfo[family][series][shape] = fi;

 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 1: ffamily = "-*-times";
   default: cfam = 100;
   }
   break;
  case LyXFont::SANS_FAMILY:
   switch (cfam) {
   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 1: ffamily = "-*-courier";
   default: cfam = 100;
   }
   break;
  default: ;
  }

  for (int cser=0; cser < 4; cser++) {
   // Determine series name
   switch (series) {
   case LyXFont::MEDIUM_SERIES:
    switch (cser) {
    case 0: fseries = "-medium"break;
    case 1: fseries = "-book"break;
    case 2: fseries = "-light";
    default: cser = 100;
    }
    break;
   case LyXFont::BOLD_SERIES:
    switch (cser) {
    case 0: fseries = "-bold"break;
    case 1: fseries = "-black"break;
    case 2: fseries = "-demi"break;
    case 3: fseries = "-demibold";
    default: cser = 100;
    }
    break;
   default: ;
   }

   for (int csha=0; csha < 2; csha++) {
    // Determine shape name
    switch (shape) {
    case LyXFont::UP_SHAPE:
    case LyXFont::SMALLCAPS_SHAPE:
     switch (csha) {
     case 0: fshape = "-r";
     default: csha = 100;
     }
     break;
    case LyXFont::ITALIC_SHAPE:
     switch (csha) {
     case 0: fshape = "-i"break;
     case 1: fshape = "-o";
     default: csha = 100;
     }
     break;
    case LyXFont::SLANTED_SHAPE:
     switch (csha) {
     case 0: fshape = "-o"break;
     case 1: fshape = "-i";
     default: csha = 100;
     }
     break;
    default: ;
    }
    //
    fontname = ffamily + fseries + fshape +
        "-normal-*-*-*-*-*-*-*-" + norm;
    fi->setPattern(fontname);
    if (fi->exist()) {
     return;
    }
   }
  }
 }
}

/// Do load font
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 );

 LString 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.");
  font = "fixed";
 }

 minibuffer->Store();
 minibuffer->Set(_("Loading font into X-Server..."));

 XFontStruct* fs = XLoadQueryFont(fl_display, font.c_str());

 if (fs == 0) {
  if (font=="fixed") {
   lyxerr.print("We're doomed. Can't get 'fixed' font.");
  } 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');
  }
 }
 minibuffer->Reset();

 fontstruct[family][series][shape][size] = fs;
 return fs;
}

¤ Dauer der Verarbeitung: 0.4 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff