1 // HUD_tape.cxx -- HUD Tape Instrument
3 // Written by Michele America, started September 1997.
5 // Copyright (C) 1997 Michele F. America [micheleamerica#geocities:com]
6 // Copyright (C) 2006 Melchior FRANZ [mfranz#aon:at]
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 HUD::Tape::Tape(HUD *hud, const SGPropertyNode *n, float x, float y) :
27 _draw_tick_bottom(n->getBoolValue("tick-bottom", false)),
28 _draw_tick_top(n->getBoolValue("tick-top", false)),
29 _draw_tick_right(n->getBoolValue("tick-right", false)),
30 _draw_tick_left(n->getBoolValue("tick-left", false)),
31 _draw_cap_bottom(n->getBoolValue("cap-bottom", false)),
32 _draw_cap_top(n->getBoolValue("cap-top", false)),
33 _draw_cap_right(n->getBoolValue("cap-right", false)),
34 _draw_cap_left(n->getBoolValue("cap-left", false)),
35 _marker_offset(n->getFloatValue("marker-offset", 0.0)),
36 _label_gap(n->getFloatValue("label-gap-width", 0.0) / 2.0),
37 _pointer(n->getBoolValue("enable-pointer", true)),
38 _zoom(n->getIntValue("zoom"))
40 _half_width_units = range_to_show() / 2.0;
43 s = n->getStringValue("pointer-type");
44 _pointer_type = strcmp(s, "moving") ? FIXED : MOVING; // "fixed", "moving"
46 s = n->getStringValue("tick-type");
47 _tick_type = strcmp(s, "circle") ? LINE : CIRCLE; // "circle", "line"
49 s = n->getStringValue("tick-length"); // "variable", "constant"
50 _tick_length = strcmp(s, "constant") ? VARIABLE : CONSTANT;
54 void HUD::Tape::draw(void) // (HUD_scale * pscale)
56 if (!_input.isValid())
59 float vmin = 0.0, vmax = 0.0;
65 const int BUFSIZE = 80;
68 // int k; //odd or even values for ticks // FIXME odd scale
70 float cur_value = _input.getFloatValue();
72 if (int(floorf(_input.max() + 0.5)) & 1)
73 oddtype = 1; //draw ticks at odd values
75 oddtype = 0; //draw ticks at even values
78 float right = _x + _w;
82 vmin = cur_value - _half_width_units; // width units == needle travel
83 vmax = cur_value + _half_width_units; // or picture unit span.
86 } else if (_pointer_type == MOVING) {
91 vmin = cur_value - _half_width_units; // width units == needle travel
92 vmax = cur_value + _half_width_units; // or picture unit span.
97 ///////////////////////////////////////////////////////////////////////////////
99 ///////////////////////////////////////////////////////////////////////////////
101 // Draw the basic markings for the scale...
103 if (option_vert()) { // Vertical scale
105 if (_draw_tick_bottom)
106 draw_line(_x, _y, right, _y);
110 draw_line(_x, top, right, top);
112 marker_xs = _x; // x start
113 marker_xe = right; // x extent
116 // We do not use else in the following so that combining the
117 // two options produces a "caged" display with double
118 // carrots. The same is done for horizontal card indicators.
120 // begin vertical/left
121 //First draw capping lines and pointers
122 if (option_left()) { // Calculate x marker offset
125 draw_line(marker_xe, _y, marker_xe, marker_ye);
127 marker_xs = marker_xe - _w / 3.0;
129 // draw_line(marker_xs, _center_y, marker_xe, _center_y + _w / 6);
130 // draw_line(marker_xs, _center_y, marker_xe, _center_y - _w / 6);
134 if (_pointer_type == MOVING) {
136 //Code for Moving Type Pointer
137 float ycentre, ypoint, xpoint;
140 if (_input.min() >= 0.0)
142 else if (_input.max() + _input.min() == 0.0)
145 ycentre = _y + (1.0 - _input.min()) * _h / (_input.max() - _input.min());
147 ycentre = _y + _input.min() * _h / (_input.max() - _input.min());
153 ypoint = ycentre + ((cur_value - 1.0) * range / _val_span);
155 ypoint = ycentre + (cur_value * range / _val_span);
157 xpoint = right + _marker_offset;
158 draw_line(xpoint, ycentre, xpoint, ypoint);
159 draw_line(xpoint, ypoint, xpoint - _marker_offset, ypoint);
160 draw_line(xpoint - _marker_offset, ypoint, xpoint - 5.0, ypoint + 5.0);
161 draw_line(xpoint - _marker_offset, ypoint, xpoint - 5.0, ypoint - 5.0);
166 draw_fixed_pointer(_marker_offset + marker_xe, text_y + _w / 6,
167 _marker_offset + marker_xs, text_y, _marker_offset + marker_xe,
169 } // end pointer type
171 } // end vertical/left
174 // begin vertical/right
175 // First draw capping lines and pointers
176 if (option_right()) {
179 draw_line(_x, _y, _x, marker_ye);
181 marker_xe = _x + _w / 3.0;
183 // draw_line(_x, _center_y + _w / 6, marker_xe, _center_y);
184 // draw_line(_x, _center_y - _w / 6, marker_xe, _center_y);
188 if (_pointer_type == MOVING) {
190 // type-fixed & _zoom=1, behaviour to be defined
191 // Code for Moving Type Pointer
192 float ycentre, ypoint, xpoint;
195 if (_input.min() >= 0.0)
197 else if (_input.max() + _input.min() == 0.0)
200 ycentre = _y + (1.0 - _input.min()) * _h / (_input.max() - _input.min());
202 ycentre = _y + _input.min() * _h / (_input.max() - _input.min());
207 ypoint = ycentre + ((cur_value - 1.0) * range / _val_span);
209 ypoint = ycentre + (cur_value * range / _val_span);
211 xpoint = _x - _marker_offset;
212 draw_line(xpoint, ycentre, xpoint, ypoint);
213 draw_line(xpoint, ypoint, xpoint + _marker_offset, ypoint);
214 draw_line(xpoint + _marker_offset, ypoint, xpoint + 5.0, ypoint + 5.0);
215 draw_line(xpoint + _marker_offset, ypoint, xpoint + 5.0, ypoint - 5.0);
220 draw_fixed_pointer(-_marker_offset + _x, text_y + _w / 6,
221 -_marker_offset + marker_xe, text_y, -_marker_offset + _x,
225 } // end vertical/right
228 // At this point marker x_start and x_end values are transposed.
229 // To keep this from confusing things they are now swapped.
231 marker_ye = marker_xs, marker_xs = marker_xe, marker_xe = marker_ye;
235 // Work through from bottom to top of scale. Calculating where to put
236 // minor and major ticks.
238 // draw scale or tape
240 zoomed_scale((int)vmin, (int)vmax);
244 if (_minor_divs != 0.0f)
245 div_ratio = int(_major_divs / _minor_divs + 0.5f);
247 div_ratio = 0, _minor_divs = _major_divs; // FIXME move that into Scale/Constructor ?
249 float vstart = floorf(vmin / _major_divs) * _major_divs;
250 float min_diff = _w / 6.0; // length difference between major & minor tick
252 // FIXME consider oddtype
253 for (int i = 0; ; i++) {
254 float v = vstart + i * _minor_divs;
257 if (v < _input.min())
259 else if (v > _input.max())
262 float y = _y + (v - vmin) * factor();
269 if (div_ratio && i % div_ratio) { // minor div
271 if (_tick_type == LINE) {
272 if (_tick_length == VARIABLE) {
273 draw_line(_x, y, marker_xs, y);
274 draw_line(marker_xe, y, right, y);
276 draw_line(_x, y, marker_xs, y);
277 draw_line(marker_xe, y, right, y);
280 } else { // _tick_type == CIRCLE
281 draw_bullet(_x, y, 3.0);
284 } else if (option_left()) {
285 if (_tick_type == LINE) {
286 if (_tick_length == VARIABLE) {
287 draw_line(marker_xs + min_diff, y, marker_xe, y);
289 draw_line(marker_xs, y, marker_xe, y);
291 } else { // _tick_type == CIRCLE
292 draw_bullet(marker_xs + 4, y, 3.0);
295 } else { // if (option_right())
296 if (_tick_type == LINE) {
297 if (_tick_length == VARIABLE) {
298 draw_line(marker_xs, y, marker_xe - min_diff, y);
300 draw_line(marker_xs, y, marker_xe, y);
303 } else { // _tick_type == CIRCLE
304 draw_bullet(marker_xe - 4, y, 3.0);
308 } else { // major div
309 int display_value = int(v);
311 display_value %= _modulo;
313 snprintf(buf, BUFSIZE, "%d", display_value);
319 if (_tick_type == LINE) {
320 draw_line(_x, y, marker_xs, y);
321 draw_line(marker_xs, y, right, y);
323 } else { // _tick_type == CIRCLE
324 draw_bullet(_x, y, 5.0);
327 x = marker_xs, align = CENTER;
330 if (_tick_type == LINE)
331 draw_line(marker_xs, y, marker_xe, y);
332 else // _tick_type == CIRCLE
333 draw_bullet(marker_xs + 4, y, 5.0);
336 x = marker_xs, align = RIGHT|VCENTER;
338 x = marker_xe, align = LEFT|VCENTER;
341 if (!option_notext()) {
343 _hud->_text_list.align(buf, align, &x, &y, &l, &r, &b, &t);
345 if (b < _y || t > top)
348 if (_label_gap == 0.0
349 || b < _center_y - _label_gap && t < _center_y - _label_gap
350 || b > _center_y + _label_gap && t > _center_y + _label_gap) {
351 draw_text(x, y, buf);
359 ///////////////////////////////////////////////////////////////////////////////
361 ///////////////////////////////////////////////////////////////////////////////
367 draw_line(_x, _y, _x, top);
370 if (_draw_tick_right)
371 draw_line(right, _y, right, top);
373 marker_ys = _y; // Starting point for
374 marker_ye = top; // tick y location calcs
376 marker_xs = _x + ((cur_value - vmin) * factor());
379 if (_draw_cap_bottom)
380 draw_line(_x, _y, right, _y);
383 marker_ye = _y + _h / 2;
385 // draw_line(_center_x, marker_ye, _center_x - _h / 4, _y);
386 // draw_line(_center_x, marker_ye, _center_x + _h / 4, _y);
389 if (_pointer_type == MOVING) {
391 //Code for Moving Type Pointer
393 float xcentre = _center_x;
395 float xpoint = xcentre + (cur_value * range / _val_span);
396 float ypoint = _y - _marker_offset;
397 draw_line(xcentre, ypoint, xpoint, ypoint);
398 draw_line(xpoint, ypoint, xpoint, ypoint + _marker_offset);
399 draw_line(xpoint, ypoint + _marker_offset, xpoint + 5.0, ypoint + 5.0);
400 draw_line(xpoint, ypoint + _marker_offset, xpoint - 5.0, ypoint + 5.0);
405 draw_fixed_pointer(marker_xs - _h / 4, _y, marker_xs,
406 marker_ye, marker_xs + _h / 4, _y);
409 } // End Horizontal scale/top
411 if (option_bottom()) {
413 draw_line(_x, top, right, top);
416 marker_ys = top - _h / 2;
418 // draw_line(_center_x + _h / 4, _y + _h, _center_x, marker_ys);
419 // draw_line(_center_x - _h / 4, _y + _h, _center_x , marker_ys);
423 if (_pointer_type == MOVING) {
425 //Code for Moving Type Pointer
427 float xcentre = _center_x;
430 float xpoint = xcentre + (cur_value * range / _val_span);
431 float ypoint = hgt + _marker_offset;
432 draw_line(xcentre, ypoint, xpoint, ypoint);
433 draw_line(xpoint, ypoint, xpoint, ypoint - _marker_offset);
434 draw_line(xpoint, ypoint - _marker_offset, xpoint + 5.0, ypoint - 5.0);
435 draw_line(xpoint, ypoint - _marker_offset, xpoint - 5.0, ypoint - 5.0);
438 draw_fixed_pointer(marker_xs + _h / 4, top, marker_xs, marker_ys,
439 marker_xs - _h / 4, top);
442 } //end horizontal scale bottom
446 zoomed_scale((int)vmin,(int)vmax);
448 int div_ratio; // FIXME abstract that out of hor/vert
449 if (_minor_divs != 0.0f)
450 div_ratio = int(_major_divs / _minor_divs + 0.5f);
452 div_ratio = 0, _minor_divs = _major_divs; // FIXME move that into Scale/Constructor ?
454 float vstart = floorf(vmin / _major_divs) * _major_divs;
455 float min_diff = _h / 6.0; // length difference between major & minor tick
457 // FIXME consider oddtype
458 for (int i = 0; ; i++) {
459 float v = vstart + i * _minor_divs;
462 if (v < _input.min())
464 else if (v > _input.max())
467 float x = _x + (v - vmin) * factor();
474 if (div_ratio && i % div_ratio) { // minor div
476 if (_tick_length == VARIABLE) {
477 draw_line(x, _y, x, marker_ys - 4);
478 draw_line(x, marker_ye + 4, x, top);
480 draw_line(x, _y, x, marker_ys);
481 draw_line(x, marker_ye, x, top);
487 if (_tick_length == VARIABLE)
488 draw_line(x, marker_ys, x, marker_ye - min_diff);
490 draw_line(x, marker_ys, x, marker_ye);
492 } else if (_tick_length == VARIABLE) {
493 draw_line(x, marker_ys + 4, x, marker_ye);
495 draw_line(x, marker_ys, x, marker_ye);
499 } else { // major divs
500 int display_value = int(v);
502 display_value %= _modulo;
504 snprintf(buf, BUFSIZE, "%d", display_value);
510 draw_line(x, _y, x, marker_ye);
511 draw_line(x, marker_ye, x, _y + _h);
512 y = marker_ys, align = CENTER;
515 draw_line(x, marker_ys, x, marker_ye);
518 y = top, align = TOP|HCENTER;
520 y = _y, align = BOTTOM|HCENTER;
523 if (!option_notext()) {
525 _hud->_text_list.align(buf, align, &x, &y, &l, &r, &b, &t);
527 if (l < _x || r > right)
530 if (_label_gap == 0.0
531 || l < _center_x - _label_gap && r < _center_x - _label_gap
532 || l > _center_x + _label_gap && r > _center_x + _label_gap) {
533 draw_text(x, y, buf);
539 } // end horizontal/vertical scale
543 void HUD::Tape::draw_fixed_pointer(float x1, float y1, float x2, float y2, float x3, float y3)
545 glBegin(GL_LINE_STRIP);
553 void HUD::Tape::zoomed_scale(int first, int last)
555 const int BUFSIZE = 80;
559 float x, y, w, h, bottom;
560 float cur_value = _input.getFloatValue();
563 while (first <= last) {
564 if ((first % (int)_major_divs) == 0) {
579 float xstart, yfirst, ycentre, ysecond;
581 float hgt = bottom * 20.0 / 100.0; // 60% of height should be zoomed
582 yfirst = _center_y - hgt;
584 ysecond = _center_y + hgt;
585 float range = hgt * 2;
588 float factor = range / 10.0;
590 float hgt1 = bottom * 30.0 / 100.0;
591 int incrs = int((_val_span - _major_divs * 2.0) / _major_divs);
592 int incr = incrs / 2;
593 float factors = hgt1 / incr;
595 // moving type pointer
596 float ypoint, xpoint;
597 float ycent = _center_y;
598 float right = _x + _w;
600 if (cur_value <= data[centre + 1])
601 if (cur_value > data[centre]) {
602 ypoint = ycent + ((cur_value - data[centre]) * hgt / _major_divs);
605 if (cur_value >= data[centre - 1])
606 if (cur_value <= data[centre]) {
607 ypoint = ycent - ((data[centre] - cur_value) * hgt / _major_divs);
610 if (cur_value < data[centre - 1])
611 if (cur_value >= _input.min()) {
612 float diff = _input.min() - data[centre - 1];
613 float diff1 = cur_value - data[centre - 1];
614 float val = (diff1 * hgt1) / diff;
616 ypoint = ycent - hgt - val;
619 if (cur_value > data[centre + 1])
620 if (cur_value <= _input.max()) {
621 float diff = _input.max() - data[centre + 1];
622 float diff1 = cur_value - data[centre + 1];
623 float val = (diff1 * hgt1) / diff;
625 ypoint = ycent + hgt + val;
631 draw_line(xstart, ycentre, xstart - 5.0, ycentre); //centre tick
633 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre] * _input.factor())); // was data_scaling() ... makes not sense at all
635 if (!option_notext())
636 draw_text(x, ycentre, buf, 0);
638 for (i = 1; i < 5; i++) {
641 draw_bullet(xstart - 2.5, yfirst, 3.0);
642 draw_bullet(xstart - 2.5, ycentre, 3.0);
645 yfirst = _center_y - hgt;
647 for (i = 0; i <= incr; i++) {
648 draw_line(xstart, yfirst, xstart - 5.0, yfirst);
649 draw_line(xstart, ysecond, xstart - 5.0, ysecond);
651 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre - i - 1] * _input.factor())); // was data_scaling() ... makes no sense at all
653 if (!option_notext())
654 draw_text(x, yfirst, buf, 0);
656 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre + i + 1] * _input.factor())); // was data_scaling() ... makes no sense at all
658 if (!option_notext())
659 draw_text(x, ysecond, buf, 0);
666 //to draw moving type pointer for left option
668 xpoint = right + 10.0;
670 if (_pointer_type == MOVING) {
671 draw_line(xpoint, ycent, xpoint, ypoint);
672 draw_line(xpoint, ypoint, xpoint - 10.0, ypoint);
673 draw_line(xpoint - 10.0, ypoint, xpoint - 5.0, ypoint + 5.0);
674 draw_line(xpoint - 10.0, ypoint, xpoint - 5.0, ypoint - 5.0);
680 xstart = (x + w) / 2;
682 draw_line(xstart, ycentre, xstart + 5.0, ycentre); //centre tick
684 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre] * _input.factor())); // was data_scaling() ... makes no sense at all
686 if (!option_notext())
687 draw_text(w, ycentre, buf, 0);
689 for (i = 1; i < 5; i++) {
692 draw_bullet(xstart + 2.5, yfirst, 3.0);
693 draw_bullet(xstart + 2.5, ycentre, 3.0);
696 yfirst = _center_y - hgt;
698 for (i = 0; i <= incr; i++) {
699 draw_line(xstart, yfirst, xstart + 5.0, yfirst);
700 draw_line(xstart, ysecond, xstart + 5.0, ysecond);
702 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre - i - 1] * _input.factor())); // was data_scaling() ... makes no sense at all
704 if (!option_notext())
705 draw_text(w, yfirst, buf, 0);
707 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre + i + 1] * _input.factor()));
709 if (!option_notext())
710 draw_text(w, ysecond, buf, 0);
717 // to draw moving type pointer for right option
721 if (_pointer_type == MOVING) {
722 draw_line(xpoint, ycent, xpoint, ypoint);
723 draw_line(xpoint, ypoint, xpoint + 10.0, ypoint);
724 draw_line(xpoint + 10.0, ypoint, xpoint + 5.0, ypoint + 5.0);
725 draw_line(xpoint + 10.0, ypoint, xpoint + 5.0, ypoint - 5.0);
728 }//end option_right /left
729 //end of vertical scale
739 float ystart, xfirst, xcentre, xsecond;
741 float hgt = bottom * 20.0 / 100.0; // 60% of height should be zoomed
742 xfirst = _center_x - hgt;
744 xsecond = _center_x + hgt;
745 float range = hgt * 2;
748 float factor = range / 10.0;
750 float hgt1 = bottom * 30.0 / 100.0;
751 int incrs = int((_val_span - _major_divs * 2.0) / _major_divs);
752 int incr = incrs / 2;
753 float factors = hgt1 / incr;
756 // Code for Moving Type Pointer
757 float xpoint, ypoint;
758 float xcent = _center_x;
760 if (cur_value <= data[centre + 1]) {
761 if (cur_value > data[centre]) {
762 xpoint = xcent + ((cur_value - data[centre]) * hgt / _major_divs);
766 if (cur_value >= data[centre - 1]) {
767 if (cur_value <= data[centre]) {
768 xpoint = xcent - ((data[centre] - cur_value) * hgt / _major_divs);
772 if (cur_value < data[centre - 1]) {
773 if (cur_value >= _input.min()) {
774 float diff = _input.min() - data[centre - 1];
775 float diff1 = cur_value - data[centre - 1];
776 float val = (diff1 * hgt1) / diff;
778 xpoint = xcent - hgt - val;
782 if (cur_value > data[centre + 1]) {
783 if (cur_value <= _input.max()) {
784 float diff = _input.max() - data[centre + 1];
785 float diff1 = cur_value - data[centre + 1];
786 float val = (diff1 * hgt1) / diff;
788 xpoint = xcent + hgt + val;
791 // end moving pointer
795 draw_line(xcentre, ystart, xcentre, ystart - 5.0); //centre tick
797 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre] * _input.factor())); // was data_scaling() ... makes no sense at all
799 if (!option_notext())
800 draw_text(xcentre - 10.0, y, buf, 0);
802 for (i = 1; i < 5; i++) {
805 draw_bullet(xfirst, ystart - 2.5, 3.0);
806 draw_bullet(xcentre, ystart - 2.5, 3.0);
809 xfirst = _center_x - hgt;
811 for (i = 0; i <= incr; i++) {
812 draw_line(xfirst, ystart, xfirst, ystart - 5.0);
813 draw_line(xsecond, ystart, xsecond, ystart - 5.0);
815 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre - i - 1] * _input.factor())); // was data_scaling() ... makes no sense at all
817 if (!option_notext())
818 draw_text(xfirst - 10.0, y, buf, 0);
820 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre + i + 1] * _input.factor())); // was data_scaling() ... makes no sense at all
822 if (!option_notext())
823 draw_text(xsecond - 10.0, y, buf, 0);
830 // moving pointer for top option
831 ypoint = _y + _h + 10.0;
833 if (_pointer_type == MOVING) {
834 draw_line(xcent, ypoint, xpoint, ypoint);
835 draw_line(xpoint, ypoint, xpoint, ypoint - 10.0);
836 draw_line(xpoint, ypoint - 10.0, xpoint + 5.0, ypoint - 5.0);
837 draw_line(xpoint, ypoint - 10.0, xpoint - 5.0, ypoint - 5.0);
843 ystart = (y + h) / 2;
845 //draw_line(xstart, yfirst, xstart - 5.0, yfirst);
846 draw_line(xcentre, ystart, xcentre, ystart + 5.0); //centre tick
848 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre] * _input.factor())); // was data_scaling() ... makes no sense at all
850 if (!option_notext())
851 draw_text(xcentre - 10.0, h, buf, 0);
853 for (i = 1; i < 5; i++) {
856 draw_bullet(xfirst, ystart + 2.5, 3.0);
857 draw_bullet(xcentre, ystart + 2.5, 3.0);
860 xfirst = _center_x - hgt;
862 for (i = 0; i <= incr; i++) {
863 draw_line(xfirst, ystart, xfirst, ystart + 5.0);
864 draw_line(xsecond, ystart, xsecond, ystart + 5.0);
866 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre - i - 1] * _input.factor())); // was data_scaling() ... makes no sense at all
868 if (!option_notext())
869 draw_text(xfirst - 10.0, h, buf, 0);
871 snprintf(buf, BUFSIZE, "%3.0f\n", float(data[centre + i + 1] * _input.factor())); // was data_scaling() ... makes no sense at all
873 if (!option_notext())
874 draw_text(xsecond - 10.0, h, buf, 0);
880 // movimg pointer for bottom option
882 if (_pointer_type == MOVING) {
883 draw_line(xcent, ypoint, xpoint, ypoint);
884 draw_line(xpoint, ypoint, xpoint, ypoint + 10.0);
885 draw_line(xpoint, ypoint + 10.0, xpoint + 5.0, ypoint + 5.0);
886 draw_line(xpoint, ypoint + 10.0, xpoint - 5.0, ypoint + 5.0);
888 }//end hud_top or hud_bottom
889 } //end of horizontal/vertical scales