/usr/include/klfbackend/klfbackend.h is in libklatexformula3-dev 3.2.4-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 | /***************************************************************************
* file klfbackend.h
* This file is part of the KLatexFormula Project.
* Copyright (C) 2011 by Philippe Faist
* philippe.faist@bluewin.ch
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/* $Id: klfbackend.h 603 2011-02-26 23:14:55Z phfaist $ */
#ifndef KLFBACKEND_H
#define KLFBACKEND_H
#include <klfdefs.h>
#include <qstring.h>
#include <qstringlist.h>
#ifdef KLFBACKEND_QT4
#include <QByteArray>
#else
#include <qmemarray.h>
#endif
#include <qimage.h>
#include <qmutex.h>
//! Definition of class \ref KLFBackend
/** \file
* This file defines the \ref KLFBackend class, which is the base engine providing
* our core functionality of transforming LaTeX code into graphics.
*/
//! No Error.
#define KLFERR_NOERROR 0
//! No LaTeX formula is specified (empty string)
#define KLFERR_MISSINGLATEXFORMULA -1
//! The \c "..." is missing in math mode string
#define KLFERR_MISSINGMATHMODETHREEDOTS -2
//! Error while opening .tex file for writing
#define KLFERR_TEXWRITEFAIL -3
//! Error while launching the given \c latex program
#define KLFERR_NOLATEXPROG -4
//! \c latex program did not exit properly (program killed) (see also \ref KLFERR_PROGERR_LATEX)
#define KLFERR_LATEXNONORMALEXIT -5
//! No .dvi file appeared after runnig \c latex program
#define KLFERR_NODVIFILE -6
//! Error while launching the given \c dvips program
#define KLFERR_NODVIPSPROG -7
//! \c dvips program did not exit properly (program killed) (see also \ref KLFERR_PROGERR_DVIPS)
#define KLFERR_DVIPSNONORMALEXIT -8
//! no .eps file appeared after running \c dvips program
#define KLFERR_NOEPSFILE -9
//! Error while opening .eps file for reading
#define KLFERR_EPSREADFAIL -10
//! Error while searching file for <tt>%%BoundingBox</tt> instruction in EPS
#define KLFERR_NOEPSBBOX -11
//! Error while parsing value for <tt>%%BoundingBox</tt> instruction in EPS
#define KLFERR_BADEPSBBOX -12
//! Error while opening <tt>...-good.eps</tt> file for writing
#define KLFERR_EPSWRITEFAIL -13
//! No -outlfonts.eps file appeared after calling gs for outlining fonts
#define KLFERR_NOEPSFILE_OF -22
//! Error while opening -outlfonts.eps after outlining fonts with gs
#define KLFERR_EPSREADFAIL_OF -23
//! Error while launching the given \c gs program
#define KLFERR_NOGSPROG -14
//! \c gs program did not exit properly (program killed) (see also \ref KLFERR_PROGERR_GS)
#define KLFERR_GSNONORMALEXIT -15
//! No .png file appeared after running \c gs program
#define KLFERR_NOPNGFILE -16
//! Error while opening .png file for reading
#define KLFERR_PNGREADFAIL -17
//! Error while launching the given \c epstopdf program (if given)
#define KLFERR_NOEPSTOPDFPROG -18
//! \c epstopdf program did not exit properly (program killed) (see also \ref KLFERR_PROGERR_EPSTOPDF)
#define KLFERR_EPSTOPDFNONORMALEXIT -19
//! No .pdf file appeared after running \c epstopdf program
#define KLFERR_NOPDFFILE -20
//! Error while opening .pdf file for reading
#define KLFERR_PDFREADFAIL -21
// last error defined: -23
//! \c latex exited with a non-zero status
#define KLFERR_PROGERR_LATEX 1
//! \c dvips exited with a non-zero status
#define KLFERR_PROGERR_DVIPS 2
//! \c gs exited with a non-zero status
#define KLFERR_PROGERR_GS 3
//! \c gs (while outlining fonts) exited with non-zero status
#define KLFERR_PROGERR_GS_OF 5
//! \c epstopdf exited with non-zero status (if \c epstopdf is to be used)
#define KLFERR_PROGERR_EPSTOPDF 4
// last error defined: 5
//! The main engine for KLatexFormula
/** The main engine for KLatexFormula, providing core functionality
* of transforming LaTeX code into graphics.
*
* Don't instanciate this class, use the static function
* \ref KLFBackend::getLatexFormula() to do all the processing.
*
* \author Philippe Faist <philippe.faist@bluewin.ch>
*/
class KLF_EXPORT KLFBackend
{
public:
//! General settings for KLFBackend::getLatexFormula()
/** Some global settings to pass on when calling getLatexFormula(). In this struct you specify
* some system settings, like a temp directory and some paths
*
* \note the \c klfclspath field was removed, because we no longer use klatexformula.cls.
* */
struct klfSettings {
/** A default constructor assigning default (empty) values to all fields */
klfSettings() : tborderoffset(0), rborderoffset(0), bborderoffset(0), lborderoffset(0),
outlineFonts(true), execenv() { }
/** A temporary directory in which we have write access, e.g. <tt>/tmp/</tt> */
QString tempdir;
/** the latex executable, path incl. if not in $PATH */
QString latexexec;
/** the dvips executable, path incl. if not in $PATH */
QString dvipsexec;
/** the gs executable, path incl. if not in $PATH */
QString gsexec;
/** the epstopdf executable, path incl. if not in $PATH. This isn't mandatory to get PNG so
* you may leave this to Null or Empty string to instruct getLatexFormula() to NOT attempt to
* generate PDF. If, though, you do specify an epstopdf executable here, epstopdf errors will
* be reported as real errors. */
QString epstopdfexec;
/** The number of postscript points to add to top side of the resulting EPS boundingbox.
* \note Currently this value is rounded off to the nearest integer. The type \c double is
* just an anticipation of hi-resolution bounding box adjustment. */
double tborderoffset;
/** The number of postscript points to add to right side of the resulting EPS boundingbox
* \note Currently this value is rounded off to the nearest integer. The type \c double is
* just an anticipation of hi-resolution bounding box adjustment. */
double rborderoffset;
/** The number of postscript points to add to bottom side of the resulting EPS boundingbox
* \note Currently this value is rounded off to the nearest integer. The type \c double is
* just an anticipation of hi-resolution bounding box adjustment. */
double bborderoffset;
/** The number of postscript points to add to left side of the resulting EPS boundingbox
* \note Currently this value is rounded off to the nearest integer. The type \c double is
* just an anticipation of hi-resolution bounding box adjustment. */
double lborderoffset;
/** Strip away fonts in favor of vectorially outlining them with gs.
*
* Use this option to produce output that doens't embed fonts, eg. for Adobe Illustrator.
*/
bool outlineFonts;
/** Extra environment variables to set (list of <tt>"NAME=value"</tt>) when executing latex,
* dvips, gs and epstopdf. */
QStringList execenv;
};
//! Specific input to KLFBackend::getLatexFormula()
/** This struct descibes the input of getLatexFormula(), ie. the LaTeX code, the mathmode to use,
* the dpi for rendering png, colors etc. */
struct klfInput {
/** A default constructor assigning default values to all fields. */
klfInput() : fg_color(0x00), bg_color(0xffffffff), dpi(600), bypassTemplate(false) { }
/** The latex code to render */
QString latex;
/** The mathmode to use. You may pass an arbitrary string containing '...' . '...' will be replaced
* by the latex code. Examples are:
* \li <tt>\\[ ... \\]</tt>
* \li <tt>\$ ... \$</tt>
*/
QString mathmode;
/** The LaTeX preample, ie the code that appears after '\\documentclass{...}' and
* before '\\begin{document}' */
QString preamble;
/** The foreground color to use, in format given by <tt>qRgb(r, g, b)</tt>.
* You may not specify an alpha value here, it will be ignored. */
unsigned long fg_color;
/** The background color to use, in format given by <tt>qRgba(r, g, b, alpha)</tt>.
* \warning background alpha value can only be 0 or 255, not any arbitrary value. Any non-zero
* value will be considered as 255.
* \warning (E)PS and PDF formats can't handle transparency.
*/
unsigned long bg_color;
/** The dots per inch resolution of the resulting image. This is directly passed to the
* <tt>-r</tt> option of the \c gs program. */
int dpi;
/** If TRUE, indicates that \c latex contains the whole of the latex code, it should not be included into
* a default document template.
*
* In particular, if TRUE, then \c mathmode and \c preamble are have no effect.
*
* This property is FALSE by default. */
bool bypassTemplate;
};
//! KLFBackend::getLatexFormula() result
/** This struct contains data that is returned from getLatexFormula(). This includes error handling
* information, the resulting image (as a QImage) as well as data for PNG, (E)PS and PDF files */
struct klfOutput {
/** \brief A code describing the status of the request.
*
* A zero value means success for everything. A positive value means that a program (latex, dvips,
* ...) returned a non-zero exit code. A negative status indicates another error.
*
* \c status will be exactly one of the KLFERR_* constants, defined in \ref klfbackend.h .
*
* In every case where status is non-zero, a suitable human-readable error string will be provided in
* the \ref errorstr field. If status is zero, \ref errorstr will be empty. */
int status;
/** \brief An explicit error string.
*
* If \ref status is positive (ie. latex/dvips/gs/epstopdf error) then this text is HTML-formatted
* suitable for a QTextBrowser. Otherwise, the message is a simple plain text sentence. It contains
* an empty (actually null) string if status is zero.
*
* This string is Qt-Translated with QObject::tr() using \c "KLFBackend" as comment. */
QString errorstr;
/** The actual resulting image. */
QImage result;
/** The input parameters used to generate this output */
klfInput input;
/** The settings that this output was generated with */
klfSettings settings;
/** the data for a png file (exact \c gs output content)
*
* This image does NOT contain any meta-data. See also \ref pngdata.
*/
QByteArray pngdata_raw;
/** the data for a png file (re-processed, with meta information on Qt4)
*
* The following metadata tags are set in the image:
* - \c "AppVersion" set to <tt>"KLatexFormula <i><version></i>"</tt>
* - \c "Application" set to translated string <tt>"Created with KLatexFormula version
* <i><version></i>"</tt>
* - \c "Software", set to <tt>"KLatexFormula <i><version></i>"</tt>
* - \c "InputLatex", \c "InputMathMode", \c "InputPreamble" are set respectively to the latex code
* text, the math mode and the preamble as given in the \ref klfInput object.
* - \c "InputFgColor" set to <tt>"rgb(<i><0-255></i>, <i><0-255></i>, <i><0-255></i>)"</tt>
* - \c "InputBgColor" set to <tt>"rgba(<i><0-255></i>, <i><0-255></i>, <i><0-255></i>,
* <i><0-255></i>)"</tt>
* - \c "InputDPI" set to the Dots Per Inch resolution of the image
* - \c "SettingsTBorderOffset", \c "SettingsRBorderOffset", \c "SettingsBBorderOffset",
* \c "SettingsLBorderOffset", are set to the border offsets in postscript points of the image
* (respectively top, right, bottom and left)
* - \c "SettingsOutlineFonts" set to \c "true" or \c "false" as given in \ref klfSettings::outlineFonts.
*/
QByteArray pngdata;
/** data for an (eps-)postscript file */
QByteArray epsdata;
/** data for a pdf file, if \ref klfSettings::epstopdfexec is non-empty. */
QByteArray pdfdata;
};
/** \brief The function that processes everything.
*
* Pass on a valid \ref klfInput input object, as well as a \ref klfSettings
* object filled with your input and settings, and you will get output in \ref klfOutput.
*
* If an error occurs, klfOutput::status is non-zero and klfOutput::errorstr contains an explicit
* error in human-readable form. The latter is Qt-Translated with QObject::tr() with "KLFBackend"
* comment.
*
* Usage example:
* \code
* ...
* // this could have been declared at some more global scope
* KLFBackend::klfSettings settings;
* bool ok = KLFBackend::detectSettings(&settings);
* if (!ok) {
* // vital program not found
* raise_error("error in your system: are latex,dvips and gs installed?");
* return;
* }
*
* KLFBackend::klfInput input;
* input.latex = "\\int_{\\Sigma}\\!(\\vec{\\nabla}\\times\\vec u)\\,d\\vec S ="
* " \\oint_C \\vec{u}\\cdot d\\vec r";
* input.mathmode = "\\[ ... \\]";
* input.preamble = "\\usepackage{somerequiredpackage}\n";
* input.fg_color = qRgb(255, 168, 88); // beige
* input.bg_color = qRgba(0, 64, 64, 255); // dark turquoise
* input.dpi = 300;
*
* KLFBackend::klfOutput out = KLFBackend::getLatexFormula(input, settings);
*
* if (out.status != 0) {
* // an error occurred. an appropriate error string is in out.errorstr
* display_error_to_user(out.errorstr);
* return;
* }
*
* myLabel->setPixmap(QPixmap(out.result));
*
* // write contents of 'out.pdfdata' to a file to get a PDF file (for example)
* {
* QFile fpdf(fname);
* fpdf.open(IO_WriteOnly | IO_Raw);
* fpdf.writeBlock(out.pdfdata);
* }
* ...
* \endcode
*
* \note This function is safe for threads; it locks a mutex at the beginning and unlocks
* it at the end; so if a call to this function is issued while a first call is already
* being processed in another thread, the second waits for the first call to finish.
*/
static klfOutput getLatexFormula(const klfInput& in, const klfSettings& settings);
/** \brief Save the output to image file
*
* This function can be used to write output obtained with the \ref getLatexFormula() function,
* to a file named \c fileName with format \c format.
*
* \param output the data to save (e.g. as returned by \ref getLatexFormula() )
* \param fileName the file name to save to. If empty or equal to \c "-" then standard output is used.
* \param format the format to use to save to fileName
* \param errorString if a valid pointer, then when an error occurs this string is set to a
* text describing the error.
*
* If \c format is an empty string, then format is guessed from filename extension; if no extension is
* found then format defaults to PNG.
*
* \c fileName 's extension is NOT adjusted if it does not match an explicitely given format, for
* example
* \code saveOutputToFile(output, "myfile.jpg", "PDF"); \endcode
* will output PDF data to the file \c "myfile.jpg".
*
* If \c errorString is non-NULL, then it is set to a human-readable description of the error that
* occurred if this function returns FALSE. It is left untouched if success.
*
* \return TRUE if success or FALSE if failure.
*
* qWarning()s are emitted in case of failure.
*/
static bool saveOutputToFile(const klfOutput& output, const QString& fileName,
const QString& format = QString(), QString* errorString = NULL);
/** \brief Saves the given output into the given device.
*
* Overloaded function, provided for convenience. Behaves very much like \ref saveOutputToFile(),
* except that the format cannot be guessed.
*/
static bool saveOutputToDevice(const klfOutput& output, QIODevice *device,
const QString& format = QString("PNG"), QString* errorString = NULL);
/** \brief Detects the system settings and stores the guessed values in \c settings.
*
* This function tries to find the latex, dvips, gs, and epstopdf in standard locations on the
* current platform.
*
* The temporary directory is set to the system temporary directory.
*/
static bool detectSettings(klfSettings *settings, const QString& extraPath = QString());
private:
KLFBackend();
friend struct cleanup_caller;
static void cleanup(QString tempfname);
static QMutex __mutex;
};
/** Compare two inputs for equality */
bool KLF_EXPORT operator==(const KLFBackend::klfInput& a, const KLFBackend::klfInput& b);
bool KLF_EXPORT klf_detect_execenv(KLFBackend::klfSettings *settings);
#endif
|