X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLength.cpp;h=d862f40213d3a4bdea1e834bc0f3cf586d1b1616;hb=aef78c821f0efbece98490a765c57b021cef0d8b;hp=ec89e5b837ba2170fe861520f4e61f722093268f;hpb=8b86af72980779f64e8beb9353693169c2b95ef2;p=lyx.git diff --git a/src/Length.cpp b/src/Length.cpp index ec89e5b837..d862f40213 100644 --- a/src/Length.cpp +++ b/src/Length.cpp @@ -23,6 +23,7 @@ #include "support/docstream.h" #include "support/lstrings.h" +#include "support/lyxlib.h" #include #include @@ -75,7 +76,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(); } @@ -200,9 +202,9 @@ int Length::inPixels(int text_width, int em_width_base) const // 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 +214,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" @@ -291,7 +294,7 @@ int Length::inPixels(int text_width, int em_width_base) const result = 0; // this cannot happen break; } - return static_cast(result + ((result >= 0) ? 0.5 : -0.5)); + return result; } @@ -305,26 +308,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(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); }