texfontdefinition.cpp.svn-base

来自「okular」· SVN-BASE 代码 · 共 250 行

SVN-BASE
250
字号
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; c-brace-offset: 0; -*-#include <config.h>#include "TeXFontDefinition.h"#include "dviRenderer.h"#include "kvs_debug.h"#ifdef HAVE_FREETYPE# include "TeXFont_PFB.h"#endif#include "TeXFont_PK.h"#include "TeXFont_TFM.h"#include "xdvi.h"#include <klocale.h>#include <QFile>extern const int MFResolutions[];#define        PK_PRE          247#define        PK_ID           89#define        PK_MAGIC        (PK_PRE << 8) + PK_ID#define        GF_PRE          247#define        GF_ID           131#define        GF_MAGIC        (GF_PRE << 8) + GF_ID#define        VF_PRE          247#define        VF_ID_BYTE      202#define        VF_MAGIC        (VF_PRE << 8) + VF_ID_BYTE// #define DEBUG_FONTTeXFontDefinition::TeXFontDefinition(QString nfontname, double _displayResolution_in_dpi, quint32 chk, qint32 _scaled_size_in_DVI_units,           class fontPool *pool, double _enlargement){#ifdef DEBUG_FONT  kDebug(kvs::dvi) << "TeXFontDefinition::TeXFontDefinition(...); fontname=" << nfontname << ", enlargement=" << _enlargement << endl;#endif  enlargement              = _enlargement;  font_pool                = pool;  fontname                 = nfontname;  font                     = 0;  displayResolution_in_dpi = _displayResolution_in_dpi;  checksum                 = chk;  flags                    = TeXFontDefinition::FONT_IN_USE;  file                     = 0;  filename                 = QString::null;  scaled_size_in_DVI_units = _scaled_size_in_DVI_units;  macrotable               = 0;  // By default, this font contains only empty characters. After the  // font has been loaded, this function pointer will be replaced by  // another one.  set_char_p  = &dviRenderer::set_empty_char;}TeXFontDefinition::~TeXFontDefinition(){#ifdef DEBUG_FONT  kDebug(kvs::dvi) << "discarding font " << fontname << " at " << (int)(enlargement * MFResolutions[font_pool->getMetafontMode()] + 0.5) << " dpi" << endl;#endif  if (font != 0) {    delete font;    font = 0;  }  if (macrotable != 0) {    delete [] macrotable;    macrotable = 0;  }  if (flags & FONT_LOADED) {    if (file != 0) {      fclose(file);      file = 0;    }    if (flags & FONT_VIRTUAL)      vf_table.clear();  }}void TeXFontDefinition::fontNameReceiver(const QString& fname){#ifdef DEBUG_FONT  kDebug(kvs::dvi) << "void TeXFontDefinition::fontNameReceiver( " << fname << " )" << endl;#endif  flags |= TeXFontDefinition::FONT_LOADED;  filename = fname;#ifdef HAVE_FREETYPE  fullFontName = QString::null;  fullEncodingName = QString::null;#endif  file = fopen(QFile::encodeName(filename), "r");  // Check if the file could be opened. If not, try to find the file  // in the DVI file's directory. If that works, modify the filename  // accordingly and go on.  if (file == 0) {    QString filename_test(font_pool->getExtraSearchPath() + "/" + filename);    file = fopen( QFile::encodeName(filename_test), "r");    if (file == 0) {      kError(kvs::dvi) << i18n("Cannot find font %1, file %2.", fontname, filename) << endl;      return;    } else      filename = filename_test;  }  set_char_p = &dviRenderer::set_char;  int magic      = two(file);  if (fname.endsWith("pk"))    if (magic == PK_MAGIC) {      fclose(file);      file = 0;      font = new TeXFont_PK(this);      set_char_p = &dviRenderer::set_char;      if ((checksum != 0) && (checksum != font->checksum))        kWarning(kvs::dvi) << i18n("Checksum mismatch for font file %1", filename) << endl;      fontTypeName = "TeX PK";      return;    }  if (fname.endsWith(".vf"))    if (magic == VF_MAGIC) {      read_VF_index();      set_char_p = &dviRenderer::set_vf_char;      fontTypeName = i18n("TeX virtual");      return;    }  if (fname.endsWith(".tfm")) {      fclose(file);      file = 0;      font = new TeXFont_TFM(this);      set_char_p = &dviRenderer::set_char;      fontTypeName = i18n("TeX Font Metric");      return;  }  // None of these known types? Then it should be one of the font  // formats that are handled by the FreeType library  fclose(file);  file = 0;#ifdef HAVE_FREETYPE  // Find the encoding for that font  const QString &enc = font_pool->fontsByTeXName.findEncoding(fontname);  if (enc.isEmpty() == false) {#ifdef DEBUG_FONT    kDebug(kvs::dvi) << "Font " << fontname << " uses encoding " << enc << endl;#endif    font = new TeXFont_PFB(this, font_pool->encodingPool.findByName(enc), font_pool->fontsByTeXName.findSlant(fontname) );  } else {#ifdef DEBUG_FONT    kDebug(kvs::dvi) << "Font " << fontname << " does not have an encoding." << endl;#endif    font = new TeXFont_PFB(this);  }  set_char_p = &dviRenderer::set_char;  fontTypeName = i18n("FreeType");  return;#else  // If we don't have the FreeType library, we should never have  // reached this point. Complain, and leave this font blank  kError(kvs::dvi) << i18n("Cannot recognize format for font file %1", filename) << endl;#endif}void TeXFontDefinition::reset(){  if (font != 0) {    delete font;    font = 0;  }  if (macrotable != 0) {    delete [] macrotable;    macrotable = 0;  }  if (flags & FONT_LOADED) {    if (file != 0) {      fclose(file);      file = 0;    }    if (flags & FONT_VIRTUAL)      vf_table.clear();  }  filename   = QString::null;  flags      = TeXFontDefinition::FONT_IN_USE;  set_char_p = &dviRenderer::set_empty_char;}void TeXFontDefinition::setDisplayResolution(double _displayResolution_in_dpi){  displayResolution_in_dpi = _displayResolution_in_dpi;  if (font != 0)    font->setDisplayResolution();}/** mark_as_used marks the font, and all the fonts it referrs to, as    used, i.e. their FONT_IN_USE-flag is set. */void TeXFontDefinition::mark_as_used(){#ifdef DEBUG_FONT  kDebug(kvs::dvi) << "TeXFontDefinition::mark_as_used()" << endl;#endif  if (flags & TeXFontDefinition::FONT_IN_USE)    return;  flags |= TeXFontDefinition::FONT_IN_USE;  // For virtual fonts, also go through the list of referred fonts  if (flags & TeXFontDefinition::FONT_VIRTUAL) {    Q3IntDictIterator<TeXFontDefinition> it(vf_table);    while( it.current() ) {      it.current()->flags |= TeXFontDefinition::FONT_IN_USE;      ++it;    }  }}macro::macro(){  pos     = 0;                /* address of first byte of macro */  end     = 0;                /* address of last+1 byte */  dvi_advance_in_units_of_design_size_by_2e20 = 0;        /* DVI units to move reference point */  free_me = false;}macro::~macro(){  if ((pos != 0L) && (free_me == true))    delete [] pos;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?