X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fhud_labl.cxx;h=d19fed05696da5f33f462dcbf281898f00577699;hb=5f134cdec82692e4a414af302a8f30c3825ebe64;hp=d92f55ceb3d543c731b0a5563a8df7c42a503fab;hpb=af80c2080b0049560cd250bef4f093abc200db94;p=flightgear.git diff --git a/src/Cockpit/hud_labl.cxx b/src/Cockpit/hud_labl.cxx index d92f55ceb..d19fed056 100644 --- a/src/Cockpit/hud_labl.cxx +++ b/src/Cockpit/hud_labl.cxx @@ -1,168 +1,145 @@ -#include "hud.hxx" +#ifdef HAVE_CONFIG_H +# include +#endif +#include "hud.hxx" #ifdef USE_HUD_TextList -#define textString( x , y, text, font ) TextString( text, x , y ) +#define textString(x, y, text, digit) TextString(text, x , y ,digit) #else -#define textString( x , y, text, font ) puDrawString ( guiFnt, text, x, y ); +#define textString(x, y, text, digit) puDrawString(guiFnt, text, x, y) #endif -//======================= Top of instr_label class ========================= -instr_label :: - instr_label( int x, - int y, - UINT width, - UINT height, - FLTFNPTR data_source, - const char *label_format, - const char *pre_label_string, - const char *post_label_string, - float scale_data, - UINT options, - fgLabelJust justification, - int font_size, - int blinking, - bool latitude, - bool longitude, - bool working): - instr_item( x, y, width, height, - data_source,scale_data,options, working ), - pformat ( label_format ), - pre_str ( pre_label_string ), - post_str ( post_label_string ), - justify ( justification ), - fontSize ( font_size ), - blink ( blinking ), - lat ( latitude ), - lon ( longitude ) - -{ - if( pre_str != NULL) { - if( post_str != NULL ) { - sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str ); - } - else { - sprintf( format_buffer, "%s%s", pre_str, pformat ); - } - } - else { - if( post_str != NULL ) { - sprintf( format_buffer, "%s%s", pformat, post_str ); - } - } // else do nothing if both pre and post strings are nulls. Interesting. - -} - -// I put this in to make it easy to construct a class member using the current -// C code. - - -instr_label :: ~instr_label() +FLTFNPTR get_func(const char *name); // FIXME + +instr_label::instr_label(const SGPropertyNode *node) : + instr_item( + node->getIntValue("x"), + node->getIntValue("y"), + node->getIntValue("width"), + node->getIntValue("height"), + NULL /* node->getStringValue("data_source") */, // FIXME + node->getFloatValue("scale_data"), + node->getIntValue("options"), + node->getBoolValue("working", true), + node->getIntValue("digits")), + pformat(node->getStringValue("label_format")), + fontSize(fgGetInt("/sim/startup/xsize") > 1000 ? HUD_FONT_LARGE : HUD_FONT_SMALL), // FIXME + blink(node->getIntValue("blinking")), + lat(node->getBoolValue("latitude", false)), + lon(node->getBoolValue("longitude", false)), + lbox(node->getBoolValue("label_box", false)), + lon_node(fgGetNode("/position/longitude-string", true)), + lat_node(fgGetNode("/position/latitude-string", true)) { + SG_LOG(SG_INPUT, SG_INFO, "Done reading instr_label instrument " + << node->getStringValue("name", "[unnamed]")); + + set_data_source(get_func(node->getStringValue("data_source"))); + + int just = node->getIntValue("justification"); + if (just == 0) + justify = LEFT_JUST; + else if (just == 1) + justify = CENTER_JUST; + else if (just == 2) + justify = RIGHT_JUST; + + string pre_str(node->getStringValue("pre_label_string")); + if (pre_str== "NULL") + pre_str.clear(); + else if (pre_str == "blank") + pre_str = " "; + + const char *units = strcmp(fgGetString("/sim/startup/units"), "feet") ? " m" : " ft"; // FIXME + + string post_str(node->getStringValue("post_label_string")); + if (post_str== "NULL") + post_str.clear(); + else if (post_str == "blank") + post_str = " "; + else if (post_str == "units") + post_str = units; + + format_buffer = pre_str + pformat; + format_buffer += post_str; } -// Copy constructor -instr_label :: instr_label( const instr_label & image) : - instr_item((const instr_item &)image), - pformat ( image.pformat ), - pre_str ( image.pre_str ), - post_str ( image.post_str ), - blink ( image.blink ), - lat ( image.lat ), - lon ( image.lon ) +void instr_label::draw(void) { - if( pre_str != NULL) { - if( post_str != NULL ) { - sprintf( format_buffer, "%s%s%s", pre_str, pformat, post_str ); - } - else { - sprintf( format_buffer, "%s%s", pre_str, pformat ); - } + char label_buffer[80]; + int posincr; + int lenstr; + RECT scrn_rect = get_location(); + + memset( label_buffer, 0, sizeof( label_buffer)); + if (data_available()) { + if (lat) + snprintf(label_buffer, sizeof( label_buffer)-1, format_buffer.c_str(), lat_node->getStringValue()); + else if (lon) + snprintf(label_buffer, sizeof( label_buffer)-1, format_buffer.c_str(), lon_node->getStringValue()); + else { + if (lbox) {// Box for label + float x = scrn_rect.left; + float y = scrn_rect.top; + float w = scrn_rect.right; + float h = HUD_TextSize; + + glPushMatrix(); + glLoadIdentity(); + + glBegin(GL_LINES); + glVertex2f(x - 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); + glEnd(); + + glEnable(GL_LINE_STIPPLE); + glLineStipple(1, 0xAAAA); + + glBegin(GL_LINES); + glVertex2f(x + w + 2.0, y - 2.0); + glVertex2f(x + w + 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y + h + 2.0); + glVertex2f(x - 2.0, y - 2.0); + glEnd(); + + glDisable(GL_LINE_STIPPLE); + glPopMatrix(); + } + snprintf(label_buffer, sizeof(label_buffer)-1, format_buffer.c_str(), get_value() * data_scaling()); + } + + } else { + snprintf(label_buffer, sizeof( label_buffer) -1, format_buffer.c_str()); } - else { - if( post_str != NULL ) { - sprintf( format_buffer, "%s%s", pformat, post_str ); - } - } // else do nothing if both pre and post strings are nulls. Interesting. - -} -instr_label & instr_label ::operator = (const instr_label & rhs ) -{ - if( !(this == &rhs)) { - instr_item::operator = (rhs); - pformat = rhs.pformat; - fontSize = rhs.fontSize; - blink = rhs.blink; - justify = rhs.justify; - pre_str = rhs.pre_str; - post_str = rhs.post_str; - lat = rhs.lat; - lon = rhs.lon; - - - strcpy(format_buffer,rhs.format_buffer); - } - return *this; -} + lenstr = getStringWidth(label_buffer); -// -// draw Draws a label anywhere in the HUD -// -// -void instr_label :: -draw( void ) // Required method in base class -{ -// char format_buffer[80]; - char label_buffer[80]; - int posincr; - int lenstr; - RECT scrn_rect = get_location(); - - if( data_available() ) { - if(lat) - sprintf( label_buffer, format_buffer, coord_format_lat(get_value()) ); - else - if(lon) - sprintf( label_buffer, format_buffer, coord_format_lon(get_value()) ); - else - sprintf( label_buffer, format_buffer, get_value() ); - } - else { - sprintf( label_buffer, format_buffer ); - } - - lenstr = getStringWidth( label_buffer ); - - #ifdef DEBUGHUD - fgPrintf( FG_COCKPIT, FG_DEBUG, format_buffer ); - fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" ); - fgPrintf( FG_COCKPIT, FG_DEBUG, label_buffer ); - fgPrintf( FG_COCKPIT, FG_DEBUG, "\n" ); + fgPrintf( SG_COCKPIT, SG_DEBUG, format_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); + fgPrintf( SG_COCKPIT, SG_DEBUG, label_buffer); + fgPrintf( SG_COCKPIT, SG_DEBUG, "\n"); #endif -// lenstr = strlen( label_buffer ); - - if( justify == RIGHT_JUST ) { - posincr = scrn_rect.right - lenstr; - }else if( justify == CENTER_JUST ) { - posincr = get_span() - (lenstr/2); // -lenstr*4; - } else { - // justify == LEFT_JUST - posincr = 0; // 0; - } - - if( fontSize == SMALL ) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, GLUT_BITMAP_8_BY_13); - } - else { - if( fontSize == LARGE ) { - textString( scrn_rect.left + posincr, scrn_rect.top, - label_buffer, GLUT_BITMAP_9_BY_15); - } + lenstr = strlen(label_buffer); + + if (justify == RIGHT_JUST) + posincr = scrn_rect.right - lenstr; + else if (justify == CENTER_JUST) + posincr = get_span() - (lenstr / 2); // -lenstr*4; + else // justify == LEFT_JUST + posincr = 0; + + if (fontSize == HUD_FONT_SMALL) { + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); + + } else if (fontSize == HUD_FONT_LARGE) { + textString(scrn_rect.left + posincr, scrn_rect.top, + label_buffer, get_digits()); } } -