X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlength.C;h=c38e7a33729300a0e59ae5ecafa17f3faedb16a1;hb=5d3718cad2a2ef6a4d6a495054ab0705ba27b6b5;hp=77218b3e7b4b862a8253fa1ed0807c2d90fb2b74;hpb=dde44404255ad78ad651db2b815211fc59dcec25;p=lyx.git diff --git a/src/lyxlength.C b/src/lyxlength.C index 77218b3e7b..c38e7a3372 100644 --- a/src/lyxlength.C +++ b/src/lyxlength.C @@ -10,10 +10,6 @@ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "lyxlength.h" #include "lengthcommon.h" #include "lyxrc.h" @@ -27,7 +23,7 @@ using std::abs; LyXLength::LyXLength() - : val_(0), unit_(LyXLength::PT) + : val_(0), unit_(LyXLength::UNIT_NONE) {} @@ -53,7 +49,7 @@ string const LyXLength::asString() const { ostringstream buffer; buffer << val_ << unit_name[unit_]; // setw? - return buffer.str().c_str(); + return STRCONV(buffer.str()); } @@ -62,34 +58,34 @@ string const LyXLength::asLatexString() const ostringstream buffer; switch (unit_) { case PTW: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\textwidth"; break; case PCW: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\columnwidth"; break; case PPW: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\paperwidth"; break; case PLW: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\linewidth"; break; case PPH: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\paperheight"; break; case PTH: - buffer << abs(static_cast(val_/100)) << "." + buffer << abs(static_cast(val_/100)) << '.' << abs(static_cast(val_)%100) << "\\textheight"; break; default: buffer << val_ << unit_name[unit_]; // setw? break; } - return buffer.str().c_str(); + return STRCONV(buffer.str()); } @@ -123,7 +119,13 @@ bool LyXLength::zero() const } -int LyXLength::inPixels(int default_width, int default_height) const +bool LyXLength::empty() const +{ + return unit_ == LyXLength::UNIT_NONE; +} + + +int LyXLength::inPixels(int text_width, int em_width_base) const { // Zoom factor specified by user in percent double const zoom = lyxrc.zoom / 100.0; // [percent] @@ -131,12 +133,18 @@ int LyXLength::inPixels(int default_width, int default_height) 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; + // A different estimate for em_width is + // font_metrics::width('M', LyXFont(LyXFont::ALL_SANE)) + // but this estimate might not be more accurate as the screen font + // is different then the latex font. + // Pixel values are scaled so that the ratio // between lengths and font sizes on the screen // is the same as on paper. - // we don't care about sign of value, we - // display negative space with text too #ifdef WITH_WARNINGS #warning if you don't care than either call this function differently or let it return negative values and call abs() explicitly when needed (Andre') #endif @@ -191,26 +199,30 @@ int LyXLength::inPixels(int default_width, int default_height) const case LyXLength::EX: // Ex: The height of an "x" // 0.4305 is the ration between 1ex and 1em in cmr10 - result = zoom * val_ * default_height * 0.4305; + result = val_ * em_width * 0.4305; break; case LyXLength::EM: // Em: The width of an "m" - // 1em is approx 10points in cmr10 - result = zoom * val_ * default_height; + result = val_ * em_width; break; case LyXLength::MU: // math unit = 1/18em - result = val_ * default_height / 18; + result = val_ * em_width / 18; break; case LyXLength::PCW: // Always % of workarea case LyXLength::PTW: - case LyXLength::PPW: case LyXLength::PLW: - result = val_ * default_width / 100; + result = val_ * text_width / 100; + break; + case LyXLength::PPW: + // paperwidth/textwidth is 1.7 for A4 paper with default margins + result = val_ * text_width * 1.7 / 100; break; case LyXLength::PTH: + result = val_ * text_width * 1.787 / 100; + break; case LyXLength::PPH: - result = val_ * default_height / 100; + result = val_ * text_width * 2.2 / 100; break; case LyXLength::UNIT_NONE: result = 0; // this cannot happen