]> git.lyx.org Git - lyx.git/blobdiff - src/Length.cpp
Account for old versions of Pygments
[lyx.git] / src / Length.cpp
index ec89e5b837ba2170fe861520f4e61f722093268f..42188d8929e444387efbaec46668283ee49fbad7 100644 (file)
 
 #include "frontends/FontMetrics.h"
 
+#include "support/debug.h"
 #include "support/docstream.h"
 #include "support/lstrings.h"
+#include "support/lyxlib.h"
 
 #include <sstream>
 #include <iomanip>
@@ -50,7 +52,7 @@ Length::Length(double v, Length::UNIT u)
 
 
 Length::Length(string const & data)
-       : val_(0), unit_(Length::PT)
+       : val_(0), unit_(Length::UNIT_NONE)
 {
        Length tmp;
 
@@ -75,7 +77,8 @@ docstring const Length::asDocstring() const
 {
        odocstringstream os;
        if (unit_ != UNIT_NONE)
-               os << formatFPNumber(val_) << unit_name[unit_]; // setw?
+               os << from_ascii(formatFPNumber(val_))
+                  << from_ascii(unit_name[unit_]); // setw?
        return os.str();
 }
 
@@ -104,6 +107,9 @@ string const Length::asLatexString() const
        case PPH:
                os << formatFPNumber(val_ / 100.0) << "\\paperheight";
                break;
+       case BLS:
+               os << formatFPNumber(val_ / 100.0) << "\\baselineskip";
+               break;
        case UNIT_NONE:
                break;
        default:
@@ -144,6 +150,7 @@ string const Length::asHTMLString() const
        case PCW:
        case PTH:
        case PPH:
+       case BLS:
                // what it's a percentage of probably won't make sense for HTML,
                // so we'll assume people have chosen these appropriately
                os << formatFPNumber(val_) << '%';
@@ -195,14 +202,14 @@ bool Length::empty() const
 int Length::inPixels(int text_width, int em_width_base) const
 {
        // Zoom factor specified by user in percent
-       double const zoom = lyxrc.zoom / 100.0; // [percent]
+       double const zoom = lyxrc.currentZoom / 100.0; // [percent]
 
        // DPI setting for monitor: pixels/inch
        double const dpi = lyxrc.dpi; // screen resolution [pixels/inch]
 
-       double const em_width = (em_width_base > 0)
-               ? em_width_base
-               : 10*(dpi/72.27)*zoom;
+       double const em_width_in = (em_width_base > 0)
+               ? em_width_base / (zoom * dpi)
+               : 10.0/72.27;
        // A different estimate for em_width is
        // theFontMetrics(FontInfo(sane_font)).em()
        // but this estimate might not be more accurate as the screen font
@@ -212,52 +219,53 @@ int Length::inPixels(int text_width, int em_width_base) const
        // between lengths and font sizes on the screen
        // is the same as on paper.
 
+       double const text_width_in = text_width / (zoom * dpi);
+       double const result = zoom * dpi * inInch(text_width_in, em_width_in);
+       return support::iround(result);
+}
+
+
+double Length::inInch(double text_width, double em_width) const
+{
        double result = 0.0;
 
        switch (unit_) {
        case Length::SP:
                // Scaled point: sp = 1/65536 pt
-               result = zoom * dpi * val_
-                       / (72.27 * 65536); // 4736286.7
+               result = val_ / (72.27 * 65536); // 4736286.7
                break;
        case Length::PT:
                // Point: 1 pt = 1/72.27 inch
-               result = zoom * dpi * val_
-                       / 72.27; // 72.27
+               result = val_ / 72.27; // 72.27
                break;
        case Length::BP:
                // Big point: 1 bp = 1/72 inch
-               result = zoom * dpi * val_
-                       / 72; // 72
+               result = val_ / 72; // 72
                break;
        case Length::DD:
                // Didot: 1157dd = 1238 pt?
-               result = zoom * dpi * val_
-                       / (72.27 / (0.376 * 2.845)); // 67.559735
+               result = val_ / (72.27 / (0.376 * 2.845)); // 67.559735
                break;
        case Length::MM:
                // Millimeter: 1 mm = 1/25.4 inch
-               result = zoom * dpi * val_
-                       / 25.4; // 25.4
+               result = val_ / 25.4; // 25.4
                break;
        case Length::PC:
                // Pica: 1 pc = 12 pt
-               result = zoom * dpi * val_
-                       / (72.27 / 12); // 6.0225
+               result = val_ / (72.27 / 12); // 6.0225
                break;
        case Length::CC:
                // Cicero: 1 cc = 12 dd
-               result = zoom * dpi * val_
+               result = val_
                        / (72.27 / (12 * 0.376 * 2.845)); // 5.6299779
                break;
        case Length::CM:
                // Centimeter: 1 cm = 1/2.54 inch
-               result = zoom * dpi * val_
-                       / 2.54; // 2.54
+               result = val_ / 2.54; // 2.54
                break;
        case Length::IN:
                // Inch
-               result = zoom * dpi * val_;
+               result = val_;
                break;
        case Length::EX:
                // Ex: The height of an "x"
@@ -287,17 +295,30 @@ int Length::inPixels(int text_width, int em_width_base) const
        case Length::PPH:
                result = val_ * text_width * 2.2 / 100;
                break;
+       case Length::BLS:
+               // baselineskip is approximately 1.2 times the font size for the cmr fonts
+               // The value actually depends on the current paragraph (see TextMetrics::setRowHeight),
+               // but we do not have this information here.
+               result = val_ * em_width * 1.2 / 100;
+               break;
        case Length::UNIT_NONE:
                result = 0;  // this cannot happen
                break;
        }
-       return static_cast<int>(result + ((result >= 0) ? 0.5 : -0.5));
+       return result;
 }
 
 
 int Length::inPixels(MetricsBase const & base) const
 {
-       return inPixels(base.textwidth, theFontMetrics(base.font).em());
+       FontInfo fi = base.font;
+       if (unit_ == Length::MU)
+               // mu is 1/18th of an em in the math symbol font
+               fi.setFamily(SYMBOL_FAMILY);
+       else
+               // Math style is only taken into account in the case of mu
+               fi.setStyle(LM_ST_TEXT);
+       return inPixels(base.textwidth, theFontMetrics(fi).em());
 }
 
 
@@ -305,26 +326,11 @@ int Length::inBP() const
 {
        // return any Length value as a one with
        // the PostScript point, called bp (big points)
-       double result = 0.0;
-       switch (unit_) {
-       case Length::CM:
-               // 1bp = 0.2835cm
-               result = val_ * 28.346;
-               break;
-       case Length::MM:
-               // 1bp = 0.02835mm
-               result = val_ * 2.8346;
-               break;
-       case Length::IN:
-               // 1pt = 1/72in
-               result = val_ * 72.0;
-               break;
-       default:
-               // no other than bp possible
-               result = val_;
-               break;
-       }
-       return static_cast<int>(result + 0.5);
+
+       double const text_width_in = 210.0 / 2.54; // assume A4
+       double const em_width_in = 10.0 / 72.27;
+       double result = 72.0 * inInch(text_width_in, em_width_in);
+       return support::iround(result);
 }
 
 
@@ -367,7 +373,8 @@ GlueLength::GlueLength(Length const & len, Length const & plus,
 
 GlueLength::GlueLength(string const & data)
 {
-       isValidGlueLength(data, this);
+       if (!isValidGlueLength(data, this))
+               LYXERR0("Invalid glue length " + data);
 }