3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Matthias Ettrich
7 * \author Lars Gullik Bjønnes
8 * \author Jean-Marc Lasgouttes
9 * \author Angus Leeming
13 * Full author contact details are available in file CREDITS.
18 #include "lyxlength.h"
19 #include "lengthcommon.h"
23 #include "support/std_sstream.h"
28 LyXLength::LyXLength()
29 : val_(0), unit_(LyXLength::UNIT_NONE)
33 LyXLength::LyXLength(double v, LyXLength::UNIT u)
38 LyXLength::LyXLength(string const & data)
39 : val_(0), unit_(LyXLength::PT)
43 if (!isValidLength(data, &tmp))
44 return; // should raise an exception
51 string const LyXLength::asString() const
54 buffer << val_ << unit_name[unit_]; // setw?
55 return STRCONV(buffer.str());
59 string const LyXLength::asLatexString() const
64 buffer << abs(static_cast<int>(val_/100)) << '.'
65 << abs(static_cast<int>(val_)%100) << "\\textwidth";
68 buffer << abs(static_cast<int>(val_/100)) << '.'
69 << abs(static_cast<int>(val_)%100) << "\\columnwidth";
72 buffer << abs(static_cast<int>(val_/100)) << '.'
73 << abs(static_cast<int>(val_)%100) << "\\paperwidth";
76 buffer << abs(static_cast<int>(val_/100)) << '.'
77 << abs(static_cast<int>(val_)%100) << "\\linewidth";
80 buffer << abs(static_cast<int>(val_/100)) << '.'
81 << abs(static_cast<int>(val_)%100) << "\\paperheight";
84 buffer << abs(static_cast<int>(val_/100)) << '.'
85 << abs(static_cast<int>(val_)%100) << "\\textheight";
88 buffer << val_ << unit_name[unit_]; // setw?
91 return STRCONV(buffer.str());
95 double LyXLength::value() const
101 LyXLength::UNIT LyXLength::unit() const
107 void LyXLength::value(double v)
113 void LyXLength::unit(LyXLength::UNIT u)
119 bool LyXLength::zero() const
125 bool LyXLength::empty() const
127 return unit_ == LyXLength::UNIT_NONE;
131 int LyXLength::inPixels(int text_width, int em_width_base) const
133 // Zoom factor specified by user in percent
134 double const zoom = lyxrc.zoom / 100.0; // [percent]
136 // DPI setting for monitor: pixels/inch
137 double const dpi = lyxrc.dpi; // screen resolution [pixels/inch]
139 double const em_width = (em_width_base > 0)
141 : 10*(dpi/72.27)*zoom;
142 // A different estimate for em_width is
143 // font_metrics::width('M', LyXFont(LyXFont::ALL_SANE))
144 // but this estimate might not be more accurate as the screen font
145 // is different then the latex font.
147 // Pixel values are scaled so that the ratio
148 // between lengths and font sizes on the screen
149 // is the same as on paper.
152 #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')
159 // Scaled point: sp = 1/65536 pt
160 result = zoom * dpi * val_
161 / (72.27 * 65536); // 4736286.7
164 // Point: 1 pt = 1/72.27 inch
165 result = zoom * dpi * val_
169 // Big point: 1 bp = 1/72 inch
170 result = zoom * dpi * val_
174 // Didot: 1157dd = 1238 pt?
175 result = zoom * dpi * val_
176 / (72.27 / (0.376 * 2.845)); // 67.559735
179 // Millimeter: 1 mm = 1/25.4 inch
180 result = zoom * dpi * val_
184 // Pica: 1 pc = 12 pt
185 result = zoom * dpi * val_
186 / (72.27 / 12); // 6.0225
189 // Cicero: 1 cc = 12 dd
190 result = zoom * dpi * val_
191 / (72.27 / (12 * 0.376 * 2.845)); // 5.6299779
194 // Centimeter: 1 cm = 1/2.54 inch
195 result = zoom * dpi * val_
200 result = zoom * dpi * val_;
203 // Ex: The height of an "x"
204 // 0.4305 is the ration between 1ex and 1em in cmr10
205 result = val_ * em_width * 0.4305;
208 // Em: The width of an "m"
209 result = val_ * em_width;
212 // math unit = 1/18em
213 result = val_ * em_width / 18;
215 case LyXLength::PCW: // Always % of workarea
218 result = val_ * text_width / 100;
221 // paperwidth/textwidth is 1.7 for A4 paper with default margins
222 result = val_ * text_width * 1.7 / 100;
225 result = val_ * text_width * 1.787 / 100;
228 result = val_ * text_width * 2.2 / 100;
230 case LyXLength::UNIT_NONE:
231 result = 0; // this cannot happen
234 return static_cast<int>(result + ((result >= 0) ? 0.5 : -0.5));
238 int LyXLength::inBP() const
240 // return any LyXLength value as a one with
241 // the PostScript point, called bp (big points)
246 result = val_ * 28.346;
250 result = val_ * 2.8346;
254 result = val_ * 72.0;
257 // no other than bp possible
261 return static_cast<int>(result + 0.5);
265 bool operator==(LyXLength const & l1, LyXLength const & l2)
267 return l1.value() == l2.value() && l1.unit() == l2.unit();
271 bool operator!=(LyXLength const & l1, LyXLength const & l2)