1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 1995 Matthias Ettrich
7 * Copyright 1995-2001 The LyX Team.
9 * ====================================================== */
13 #include "lyxlength.h"
14 #include "lengthcommon.h"
17 #include "support/lstrings.h"
25 LyXLength::LyXLength()
26 : val_(0), unit_(LyXLength::UNIT_NONE)
30 LyXLength::LyXLength(double v, LyXLength::UNIT u)
35 LyXLength::LyXLength(string const & data)
36 : val_(0), unit_(LyXLength::PT)
40 if (!isValidLength(data, &tmp))
41 return; // should raise an exception
48 string const LyXLength::asString() const
51 buffer << val_ << unit_name[unit_]; // setw?
52 return STRCONV(buffer.str());
56 string const LyXLength::asLatexString() const
61 buffer << abs(static_cast<int>(val_/100)) << '.'
62 << abs(static_cast<int>(val_)%100) << "\\textwidth";
65 buffer << abs(static_cast<int>(val_/100)) << '.'
66 << abs(static_cast<int>(val_)%100) << "\\columnwidth";
69 buffer << abs(static_cast<int>(val_/100)) << '.'
70 << abs(static_cast<int>(val_)%100) << "\\paperwidth";
73 buffer << abs(static_cast<int>(val_/100)) << '.'
74 << abs(static_cast<int>(val_)%100) << "\\linewidth";
77 buffer << abs(static_cast<int>(val_/100)) << '.'
78 << abs(static_cast<int>(val_)%100) << "\\paperheight";
81 buffer << abs(static_cast<int>(val_/100)) << '.'
82 << abs(static_cast<int>(val_)%100) << "\\textheight";
85 buffer << val_ << unit_name[unit_]; // setw?
88 return STRCONV(buffer.str());
92 double LyXLength::value() const
98 LyXLength::UNIT LyXLength::unit() const
104 void LyXLength::value(double v)
110 void LyXLength::unit(LyXLength::UNIT u)
116 bool LyXLength::zero() const
122 bool LyXLength::empty() const
124 return unit_ == LyXLength::UNIT_NONE;
128 int LyXLength::inPixels(int text_width, int em_width_base) const
130 // Zoom factor specified by user in percent
131 double const zoom = lyxrc.zoom / 100.0; // [percent]
133 // DPI setting for monitor: pixels/inch
134 double const dpi = lyxrc.dpi; // screen resolution [pixels/inch]
136 double const em_width = (em_width_base > 0)
138 : 10*(dpi/72.27)*zoom;
139 // A different estimate for em_width is
140 // font_metrics::width('M', LyXFont(LyXFont::ALL_SANE))
141 // but this estimate might not be more accurate as the screen font
142 // is different then the latex font.
144 // Pixel values are scaled so that the ratio
145 // between lengths and font sizes on the screen
146 // is the same as on paper.
149 #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')
156 // Scaled point: sp = 1/65536 pt
157 result = zoom * dpi * val_
158 / (72.27 * 65536); // 4736286.7
161 // Point: 1 pt = 1/72.27 inch
162 result = zoom * dpi * val_
166 // Big point: 1 bp = 1/72 inch
167 result = zoom * dpi * val_
171 // Didot: 1157dd = 1238 pt?
172 result = zoom * dpi * val_
173 / (72.27 / (0.376 * 2.845)); // 67.559735
176 // Millimeter: 1 mm = 1/25.4 inch
177 result = zoom * dpi * val_
181 // Pica: 1 pc = 12 pt
182 result = zoom * dpi * val_
183 / (72.27 / 12); // 6.0225
186 // Cicero: 1 cc = 12 dd
187 result = zoom * dpi * val_
188 / (72.27 / (12 * 0.376 * 2.845)); // 5.6299779
191 // Centimeter: 1 cm = 1/2.54 inch
192 result = zoom * dpi * val_
197 result = zoom * dpi * val_;
200 // Ex: The height of an "x"
201 // 0.4305 is the ration between 1ex and 1em in cmr10
202 result = val_ * em_width * 0.4305;
205 // Em: The width of an "m"
206 result = val_ * em_width;
209 // math unit = 1/18em
210 result = val_ * em_width / 18;
212 case LyXLength::PCW: // Always % of workarea
215 result = val_ * text_width / 100;
218 // paperwidth/textwidth is 1.7 for A4 paper with default margins
219 result = val_ * text_width * 1.7 / 100;
222 result = val_ * text_width * 1.787 / 100;
225 result = val_ * text_width * 2.2 / 100;
227 case LyXLength::UNIT_NONE:
228 result = 0; // this cannot happen
231 return static_cast<int>(result + ((result >= 0) ? 0.5 : -0.5));
235 int LyXLength::inBP() const
237 // return any LyXLength value as a one with
238 // the PostScript point, called bp (big points)
243 result = val_ * 28.346;
247 result = val_ * 2.8346;
251 result = val_ * 72.0;
254 // no other than bp possible
258 return static_cast<int>(result + 0.5);
262 bool operator==(LyXLength const & l1, LyXLength const & l2)
264 return l1.value() == l2.value() && l1.unit() == l2.unit();
268 bool operator!=(LyXLength const & l1, LyXLength const & l2)