void W_LABEL::display(int xOffset, int yOffset) { iV_SetTextColour(fontColour); QByteArray text = aText.toUtf8(); int fx; if (style & WLAB_ALIGNCENTRE) { int fw = iV_GetTextWidth(text.constData(), FontID); fx = xOffset + x() + (width() - fw) / 2; } else if (style & WLAB_ALIGNRIGHT) { int fw = iV_GetTextWidth(text.constData(), FontID); fx = xOffset + x() + width() - fw; } else { fx = xOffset + x(); } int fy; if ((style & WLAB_ALIGNTOPLEFT) != 0) // Align top { fy = yOffset + y() - iV_GetTextAboveBase(FontID); } else if ((style & WLAB_ALIGNBOTTOMLEFT) != 0) // Align bottom { fy = yOffset + y() - iV_GetTextAboveBase(FontID) + (height() - iV_GetTextLineSize(FontID)); } else { fy = yOffset + y() - iV_GetTextAboveBase(FontID) + (height() - iV_GetTextLineSize(FontID)) / 2; } iV_DrawText(text.constData(), fx, fy, FontID); }
/** * Draws the text for the intelligence display window. */ static BOOL intDisplaySeqTextViewPage(VIEW_REPLAY *psViewReplay, UDWORD x0, UDWORD y0, UDWORD width, UDWORD height, BOOL render, size_t *cur_seq, size_t *cur_seqpage) { UDWORD i, cur_y; UDWORD sequence; if (!psViewReplay) { return true; /* nothing to do */ } iV_SetFont(font_regular); iV_SetTextColour(WZCOL_TEXT_BRIGHT); cur_y = y0 + iV_GetTextLineSize()/2 + 2*TEXT_YINDENT; /* add each message */ for (sequence = *cur_seq, i = *cur_seqpage; sequence < psViewReplay->numSeq; sequence++) { SEQ_DISPLAY *psSeqDisplay = &psViewReplay->pSeqList[sequence]; for (; i < psSeqDisplay->numText; i++) { if (render) { cur_y = iV_DrawFormattedText(psSeqDisplay->ppTextMsg[i], x0 + TEXT_XINDENT, cur_y, width, false); } else { cur_y += iV_GetTextLineSize(); } if (cur_y > y0 + height) { /* run out of room - need to make new tab */ *cur_seq = sequence; *cur_seqpage = i; return false; } } i = 0; } return true; /* done */ }
/* label display function */ void labelDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { SDWORD fx,fy, fw; W_LABEL *psLabel; enum iV_fonts FontID; psLabel = (W_LABEL *)psWidget; FontID = psLabel->FontID; iV_SetFont(FontID); iV_SetTextColour(pColours[WCOL_TEXT]); if (psLabel->style & WLAB_ALIGNCENTRE) { fw = iV_GetTextWidth(psLabel->aText); fx = xOffset + psLabel->x + (psLabel->width - fw) / 2; } else if (psLabel->style & WLAB_ALIGNRIGHT) { fw = iV_GetTextWidth(psLabel->aText); fx = xOffset + psLabel->x + psLabel->width - fw; } else { fx = xOffset + psLabel->x; } fy = yOffset + psLabel->y + (psLabel->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_DrawText(psLabel->aText,fx,fy); }
/* label display function */ void labelDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, UDWORD *pColours) { SDWORD fx,fy, fw; W_LABEL *psLabel; // PROP_FONT *psFont; int FontID; psLabel = (W_LABEL *)psWidget; // psFont = psLabel->psFont; FontID = psLabel->FontID; iV_SetFont(FontID); // fontSetCacheColour(*(pColours + WCOL_TEXT)); iV_SetTextColour((UWORD)*(pColours + WCOL_TEXT)); if (psLabel->style & WLAB_ALIGNCENTRE) { fw = iV_GetTextWidth(psLabel->aText); fx = xOffset + psLabel->x + (psLabel->width - fw) / 2; } else if (psLabel->style & WLAB_ALIGNRIGHT) { fw = iV_GetTextWidth(psLabel->aText); fx = xOffset + psLabel->x + psLabel->width - fw; } else { fx = xOffset + psLabel->x; } fy = yOffset + psLabel->y + (psLabel->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); // fy = yOffset + psLabel->y + (psLabel->height - // psFont->height + psFont->baseLine) / 2; iV_DrawText(psLabel->aText,fx,fy); // fontPrint(fx,fy, psLabel->aText); }
bool intDisplayMultiJoiningStatus(UBYTE joinCount) { UDWORD x,y,w,h; char sTmp[6]; w = RET_FORMWIDTH; h = RET_FORMHEIGHT; x = RET_X; y = RET_Y; // cameraToHome(selectedPlayer); // home the camera to the player. RenderWindowFrame(FRAME_NORMAL, x, y ,w, h); // draw a wee blu box. // display how far done.. iV_SetFont(font_regular); iV_DrawText(_("Players Still Joining"), x+(w/2)-(iV_GetTextWidth(_("Players Still Joining"))/2), y+(h/2)-8 ); unsigned playerCount = 0; // Calculate what NetPlay.playercount should be, which is apparently only non-zero for the host. for (unsigned player = 0; player < game.maxPlayers; ++player) { if (isHumanPlayer(player)) { ++playerCount; } } if (!playerCount) { return true; } iV_SetFont(font_large); sprintf(sTmp, "%d%%", PERCENT(playerCount - joinCount, playerCount)); iV_DrawText(sTmp ,x + (w / 2) - 10, y + (h / 2) + 10); iV_SetFont(font_small); int yStep = iV_GetTextLineSize(); int yPos = RET_Y - yStep*game.maxPlayers; static const std::string statusStrings[3] = {"☐ ", "☑ ", "☒ "}; for (unsigned player = 0; player < game.maxPlayers; ++player) { int status = -1; if (isHumanPlayer(player)) { status = ingame.JoiningInProgress[player]? 0 : 1; // Human player, still joining or joined. } else if (NetPlay.players[player].ai >= 0) { status = 2; // AI player (automatically joined). } if (status >= 0) { iV_DrawText((statusStrings[status] + getPlayerName(player)).c_str(), x + 5, yPos + yStep*NetPlay.players[player].position); } } return true; }
/** Sets the system up */ void initConsoleMessages( void ) { int TextLineSize = iV_GetTextLineSize(); messageIndex = 0; /* Console can extend to half screen height */ if (TextLineSize) { maxDrop = ((pie_GetVideoBufferHeight() / TextLineSize)/2); } else { debug(LOG_FATAL, "Something is wrong with the fonts? Aborting."); abort(); } if(maxDrop>32) maxDrop = 32; consoleDrop = maxDrop;//MAX_DROP; dropState = DROP_CLOSED; /* No active messages to begin with */ numActiveMessages = 0; lastDropChange = 0; bConsoleDropped = false; /* Linked list is empty */ consoleMessages = NULL; /* Setup how long messages are displayed for... */ setConsoleMessageDuration(DEFAULT_MESSAGE_DURATION); /* No box under the text */ setConsoleBackdropStatus(true); /* Turn on the console display */ enableConsoleDisplay(true); /* Set left justification as default */ setDefaultConsoleJust(LEFT_JUSTIFY); /* Set up the console size and postion x,y,width */ setConsoleSizePos(16, 16, pie_GetVideoBufferWidth()-32); setConsoleLineInfo(MAX_CONSOLE_MESSAGES/4 + 4); /* We're not initially having permanent messages */ setConsolePermanence(false,true); /* Allow new messages */ permitNewConsoleMessages(true); }
/** true or false as to whether the mouse is presently over the console window */ BOOL mouseOverConsoleBox( void ) { if ( ((UDWORD)mouseX() > mainConsole.topX) // condition 1 && ((UDWORD)mouseY() > mainConsole.topY) // condition 2 && ((UDWORD)mouseX() < mainConsole.topX + mainConsole.width) //condition 3 && ((UDWORD)mouseY() < (mainConsole.topY + iV_GetTextLineSize()*numActiveMessages)) //condition 4 ) { return(true); } else { return(false); } }
// //////////////////////////////////////////////////////////////////////////// // show a text option. void displayTextOption(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, WZ_DECL_UNUSED PIELIGHT *pColours) { SDWORD fx,fy, fw; W_BUTTON *psBut; bool hilight = false; bool greyOut = psWidget->UserData; // if option is unavailable. psBut = (W_BUTTON *)psWidget; iV_SetFont(psBut->FontID); if(widgGetMouseOver(psWScreen) == psBut->id) // if mouse is over text then hilight. { hilight = true; } fw = iV_GetTextWidth(psBut->pText); fy = yOffset + psWidget->y + (psWidget->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); if (psWidget->style & WBUT_TXTCENTRE) //check for centering, calculate offset. { fx = xOffset + psWidget->x + ((psWidget->width - fw) / 2); } else { fx = xOffset + psWidget->x; } if(greyOut) // unavailable { iV_SetTextColour(WZCOL_TEXT_DARK); } else // available { if(hilight) // hilight { iV_SetTextColour(WZCOL_TEXT_BRIGHT); } else // dont highlight { iV_SetTextColour(WZCOL_TEXT_MEDIUM); } } iV_DrawText( psBut->pText, fx, fy); return; }
/** Sets the system up */ void initConsoleMessages(void) { iV_SetFont(font_regular); linePitch = iV_GetTextLineSize(); // NOTE: if font changes, this must also be changed! bConsoleDropped = false; setConsoleMessageDuration(DEFAULT_MESSAGE_DURATION); // Setup how long messages are displayed for setConsoleBackdropStatus(true); // No box under the text enableConsoleDisplay(true); // Turn on the console display // Set up the main console size and position x,y,width setConsoleSizePos(16, 32, pie_GetVideoBufferWidth() - 32); historyConsole.topX = HISTORYBOX_X; historyConsole.topY = HISTORYBOX_Y; historyConsole.width = pie_GetVideoBufferWidth() - 32; setConsoleLineInfo(MAX_CONSOLE_MESSAGES / 4 + 4); setConsolePermanence(false, true); // We're not initially having permanent messages permitNewConsoleMessages(true); // Allow new messages }
/** * Displays the TEXT view for the current message. * If this function breaks, please merge it with intDisplaySeqTextViewPage * which presumably does almost the same. */ void intDisplayTEXTView(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, WZ_DECL_UNUSED PIELIGHT *pColours) { W_TABFORM *Form = (W_TABFORM*)psWidget; MESSAGE *psMessage = (MESSAGE *)Form->pUserData; UDWORD x0, y0, x1, y1, i, linePitch; UDWORD ty; x0 = xOffset+Form->x; y0 = yOffset+Form->y; x1 = x0 + Form->width; y1 = y0 + Form->height; ty = y0; RenderWindowFrame(FRAME_NORMAL, x0, y0, x1 - x0, y1 - y0); if (psMessage) { iV_SetFont(font_regular); /* Get the travel to the next line */ linePitch = iV_GetTextLineSize(); /* Fix for spacing.... */ linePitch+=3; ty+=3; /* Fix for spacing.... */ iV_SetTextColour(WZCOL_TEXT_BRIGHT); //add each message for (i = 0; i < ((VIEWDATA *)psMessage->pViewData)->numText; i++) { //check haven't run out of room first! if (i * linePitch > Form->height) { ASSERT( false, "intDisplayTEXTView: Run out of room!" ); return; } //need to check the string will fit! iV_DrawText(_(((VIEWDATA *)psMessage->pViewData)->ppTextMsg[i]), x0 + TEXT_XINDENT, (ty + TEXT_YINDENT*3) + (i * linePitch)); } } }
void W_EDITBOX::display(int xOffset, int yOffset) { int x0 = x() + xOffset; int y0 = y() + yOffset; int x1 = x0 + width(); int y1 = y0 + height(); if (pBoxDisplay != nullptr) { pBoxDisplay(this, xOffset, yOffset); } else { iV_ShadowBox(x0, y0, x1, y1, 0, boxColourFirst, boxColourSecond, boxColourBackground); } int fx = x0 + WEDB_XGAP;// + (psEdBox->width - fw) / 2; iV_SetTextColour(WZCOL_FORM_TEXT); int fy = y0 + (height() - iV_GetTextLineSize(FontID)) / 2 - iV_GetTextAboveBase(FontID); /* If there is more text than will fit into the box, display the bit with the cursor in it */ QString tmp = aText; tmp.remove(0, printStart); // Erase anything there isn't room to display. tmp.remove(printChars, tmp.length()); iV_DrawText(tmp.toUtf8().constData(), fx, fy, FontID); // Display the cursor if editing #if CURSOR_BLINK bool blink = !(((wzGetTicks() - blinkOffset) / WEDB_BLINKRATE) % 2); if ((state & WEDBS_MASK) == WEDBS_INSERT && blink) #else if ((state & WEDBS_MASK) == WEDBS_INSERT) #endif { // insert mode QString tmp = aText; tmp.remove(insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, printStart); int cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData(), FontID); cx += iV_GetTextWidth("-", FontID); int cy = fy; iV_Line(cx, cy + iV_GetTextAboveBase(FontID), cx, cy - iV_GetTextBelowBase(FontID), WZCOL_FORM_CURSOR); } #if CURSOR_BLINK else if ((state & WEDBS_MASK) == WEDBS_OVER && blink) #else else if ((state & WEDBS_MASK) == WEDBS_OVER) #endif { // overwrite mode QString tmp = aText; tmp.remove(insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, printStart); int cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData(), FontID); int cy = fy; iV_Line(cx, cy, cx + WEDB_CURSORSIZE, cy, WZCOL_FORM_CURSOR); } if (pBoxDisplay == nullptr) { if ((state & WEDBS_HILITE) != 0) { /* Display the button hilite */ iV_Box(x0 - 2, y0 - 2, x1 + 2, y1 + 2, WZCOL_FORM_HILITE); } } }
void W_BUTTON::display(int xOffset, int yOffset) { int x0 = x() + xOffset; int y0 = y() + yOffset; int x1 = x0 + width(); int y1 = y0 + height(); bool haveText = !pText.isEmpty(); bool isDown = (state & (WBUT_DOWN | WBUT_LOCK | WBUT_CLICKLOCK)) != 0; bool isDisabled = (state & WBUT_DISABLE) != 0; bool isHighlight = (state & WBUT_HIGHLIGHT) != 0; // Display the button. if (!images.normal.isNull()) { iV_DrawImage(images.normal, x0, y0); if (isDown && !images.down.isNull()) { iV_DrawImage(images.down, x0, y0); } if (isDisabled && !images.disabled.isNull()) { iV_DrawImage(images.disabled, x0, y0); } if (isHighlight && !images.highlighted.isNull()) { iV_DrawImage(images.highlighted, x0, y0); } } else { iV_ShadowBox(x0, y0, x1, y1, 0, WZCOL_FORM_LIGHT, isDisabled ? WZCOL_FORM_LIGHT : WZCOL_FORM_DARK, WZCOL_FORM_BACKGROUND); if (isHighlight) { iV_Box(x0 + 2, y0 + 2, x1 - 3, y1 - 3, WZCOL_FORM_HILITE); } } if (haveText) { int fw = iV_GetTextWidth(pText.toUtf8().c_str(), FontID); int fx = x0 + (width() - fw) / 2; int fy = y0 + (height() - iV_GetTextLineSize(FontID)) / 2 - iV_GetTextAboveBase(FontID); if (isDisabled) { iV_SetTextColour(WZCOL_FORM_LIGHT); iV_DrawText(pText.toUtf8().c_str(), fx + 1, fy + 1, FontID); iV_SetTextColour(WZCOL_FORM_DISABLE); } else { iV_SetTextColour(WZCOL_FORM_TEXT); } iV_DrawText(pText.toUtf8().c_str(), fx, fy, FontID); } if (isDisabled && !images.normal.isNull() && images.disabled.isNull()) { // disabled, render something over it! iV_TransBoxFill(x0, y0, x0 + width(), y0 + height()); } }
/* Display a button */ void buttonDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { W_BUTTON *psButton; SDWORD x0,y0,x1,y1, fx,fy,fw; int CurrFontID; ASSERT(psWidget != NULL && pColours != NULL, "Invalid pointers"); if (!psWidget || !pColours) { return; } psButton = (W_BUTTON *)psWidget; CurrFontID = psButton->FontID; x0=psButton->x + xOffset; y0=psButton->y + yOffset; x1=x0 + psButton->width; y1=y0 + psButton->height; if (psButton->state & (WBUTS_DOWN | WBUTS_LOCKED | WBUTS_CLICKLOCK)) { /* Display the button down */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_DARK]); iV_Line(x0,y0, x0,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y1, x1,y0, pColours[WCOL_LIGHT]); if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour(pColours[WCOL_TEXT]); fw = iV_GetTextWidth(psButton->pText); if(psButton->style & WBUT_NOCLICKMOVE) { fx = x0 + (psButton->width - fw) / 2 + 1; fy = y0 + 1 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } else { fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } iV_DrawText(psButton->pText,fx,fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+3,y0+3, x1-2,y0+3, pColours[WCOL_HILITE]); iV_Line(x0+3,y0+3, x0+3,y1-2, pColours[WCOL_HILITE]); iV_Line(x0+3,y1-2, x1-2,y1-2, pColours[WCOL_HILITE]); iV_Line(x1-2,y1-2, x1-2,y0+3, pColours[WCOL_HILITE]); } } else if (psButton->state & WBUTS_GREY) { /* Display the disabled button */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1, x1,y0, pColours[WCOL_DARK]); if (psButton->pText) { iV_SetFont(psButton->FontID); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_SetTextColour(pColours[WCOL_LIGHT]); iV_DrawText(psButton->pText, fx+1, fy+1); iV_SetTextColour(pColours[WCOL_DISABLE]); iV_DrawText(psButton->pText, fx, fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2, pColours[WCOL_HILITE]); iV_Line(x0+2,y0+2, x0+2,y1-3, pColours[WCOL_HILITE]); iV_Line(x0+2,y1-3, x1-3,y1-3, pColours[WCOL_HILITE]); iV_Line(x1-3,y1-3, x1-3,y0+2, pColours[WCOL_HILITE]); } } else { /* Display the button up */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1, x1,y0, pColours[WCOL_DARK]); if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour(pColours[WCOL_TEXT]); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_DrawText(psButton->pText, fx, fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2, pColours[WCOL_HILITE]); iV_Line(x0+2,y0+2, x0+2,y1-3, pColours[WCOL_HILITE]); iV_Line(x0+2,y1-3, x1-3,y1-3, pColours[WCOL_HILITE]); iV_Line(x1-3,y1-3, x1-3,y0+2, pColours[WCOL_HILITE]); } } }
/* Display a button */ void buttonDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, UDWORD *pColours) { W_BUTTON *psButton; SDWORD x0,y0,x1,y1, fx,fy,fw; // PROP_FONT *psCurrFont; int CurrFontID; ASSERT((PTRVALID(psWidget, sizeof(W_BUTTON)), "buttonDisplay: Invalid widget pointer")); psButton = (W_BUTTON *)psWidget; // psCurrFont = psButton->psFont; CurrFontID = psButton->FontID; x0=psButton->x + xOffset; y0=psButton->y + yOffset; x1=x0 + psButton->width; y1=y0 + psButton->height; if (psButton->state & (WBUTS_DOWN | WBUTS_LOCKED | WBUTS_CLICKLOCK)) { /* Display the button down */ pie_BoxFillIndex(x0,y0,x1,y1,WCOL_BKGRND); iV_Line(x0,y0, x1,y0,*(pColours + WCOL_DARK)); iV_Line(x0,y0, x0,y1,*(pColours + WCOL_DARK)); iV_Line(x0,y1, x1,y1,*(pColours + WCOL_LIGHT)); iV_Line(x1,y1, x1,y0,*(pColours + WCOL_LIGHT)); if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour((UWORD)*(pColours + WCOL_TEXT)); fw = iV_GetTextWidth(psButton->pText); if(psButton->style & WBUT_NOCLICKMOVE) { fx = x0 + (psButton->width - fw) / 2 + 1; fy = y0 + 1 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } else { fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } iV_DrawText(psButton->pText,fx,fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+3,y0+3, x1-2,y0+3,*(pColours + WCOL_HILITE)); iV_Line(x0+3,y0+3, x0+3,y1-2,*(pColours + WCOL_HILITE)); iV_Line(x0+3,y1-2, x1-2,y1-2,*(pColours + WCOL_HILITE)); iV_Line(x1-2,y1-2, x1-2,y0+3,*(pColours + WCOL_HILITE)); } } else if (psButton->state & WBUTS_GREY) { /* Display the disabled button */ pie_BoxFillIndex(x0,y0,x1,y1,WCOL_BKGRND); iV_Line(x0,y0, x1,y0,*(pColours + WCOL_LIGHT)); iV_Line(x0,y0, x0,y1,*(pColours + WCOL_LIGHT)); iV_Line(x0,y1, x1,y1,*(pColours + WCOL_DARK)); iV_Line(x1,y1, x1,y0,*(pColours + WCOL_DARK)); if (psButton->pText) { iV_SetFont(psButton->FontID); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_SetTextColour((UWORD)*(pColours + WCOL_LIGHT)); iV_DrawText(psButton->pText,fx+1,fy+1); iV_SetTextColour((UWORD)*(pColours + WCOL_DISABLE)); iV_DrawText(psButton->pText,fx,fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2,*(pColours + WCOL_HILITE)); iV_Line(x0+2,y0+2, x0+2,y1-3,*(pColours + WCOL_HILITE)); iV_Line(x0+2,y1-3, x1-3,y1-3,*(pColours + WCOL_HILITE)); iV_Line(x1-3,y1-3, x1-3,y0+2,*(pColours + WCOL_HILITE)); } } else { /* Display the button up */ pie_BoxFillIndex(x0,y0,x1,y1,WCOL_BKGRND); iV_Line(x0,y0, x1,y0,*(pColours + WCOL_LIGHT)); iV_Line(x0,y0, x0,y1,*(pColours + WCOL_LIGHT)); iV_Line(x0,y1, x1,y1,*(pColours + WCOL_DARK)); iV_Line(x1,y1, x1,y0,*(pColours + WCOL_DARK)); //if (0) if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour((UWORD)*(pColours + WCOL_TEXT)); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_DrawText(psButton->pText,fx,fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2,*(pColours + WCOL_HILITE)); iV_Line(x0+2,y0+2, x0+2,y1-3,*(pColours + WCOL_HILITE)); iV_Line(x0+2,y1-3, x1-3,y1-3,*(pColours + WCOL_HILITE)); iV_Line(x1-3,y1-3, x1-3,y0+2,*(pColours + WCOL_HILITE)); } } }
/** Display up to the last 8 messages. \return The number of messages actually shown */ static int displayOldMessages(void) { int i; BOOL bGotIt; BOOL bQuit; int marker = 0; int linePitch; int MesY; unsigned int count = 0; /* Check there actually are any messages */ int thisIndex = messageId; if(thisIndex) { bQuit = false; while(!bQuit) { for(i=0,bGotIt = false; i<MAX_CONSOLE_MESSAGES && !bGotIt; i++) { if (consoleStorage[i].id == thisIndex-1) { bGotIt = true; marker = i; } } /* We found an older one */ if(bGotIt) { history[count++] = marker; } else { bQuit = true; // count holds how many we got } if(thisIndex) { /* Look for an older one */ thisIndex--; } else { bQuit = true; // We've reached the big bang - there is nothing older... } /* History can only hold so many */ if(count>=consoleDrop) { bQuit = true; } } } if(!count) { /* there are messages - just no old ones yet */ return(0); } if(count) { /* Get the line pitch */ linePitch = iV_GetTextLineSize(); /* How big a box is necessary? */ /* GET RID OF THE MAGIC NUMBERS BELOW */ iV_TransBoxFill(mainConsole.topX - CON_BORDER_WIDTH,mainConsole.topY-mainConsole.textDepth-CON_BORDER_HEIGHT, mainConsole.topX+mainConsole.width ,mainConsole.topY+((count)*linePitch)+CON_BORDER_HEIGHT-linePitch); } /* if(count) { sprintf(buildData,"%s,%s",__TIME__,__DATE__); buildWidth = iV_GetTextWidth(buildData); iV_DrawText(buildData,((mainConsole.topX+mainConsole.width) - buildWidth - 16), mainConsole.topY); } */ MesY = mainConsole.topY; /* Render what we found */ for(i=count-1; i>0; i--) { /* Set text color depending on message type */ setConsoleTextColor(consoleStorage[history[i]].player); /* Draw the text string */ MesY = iV_DrawFormattedText(consoleStorage[history[i]].text, mainConsole.topX, MesY, mainConsole.width, consoleStorage[history[i]].JustifyType); } /* Set text color depending on message type */ setConsoleTextColor(consoleStorage[history[0]].player); /* Draw the top one */ iV_DrawFormattedText(consoleStorage[history[0]].text, mainConsole.topX, MesY, mainConsole.width, consoleStorage[history[0]].JustifyType); /* Return how much to drop the existing console by... Fix this for lines>screenWIDTH */ if(count) { return((count)*linePitch); } else { return(0); } }
/* The edit box display function */ void editBoxDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { W_EDITBOX *psEdBox; SDWORD x0,y0,x1,y1, fx,fy, cx,cy; enum iV_fonts CurrFontID; #if CURSOR_BLINK bool blink; #endif psEdBox = (W_EDITBOX *)psWidget; CurrFontID = psEdBox->FontID; x0=psEdBox->x + xOffset; y0=psEdBox->y + yOffset; x1=x0 + psEdBox->width; y1=y0 + psEdBox->height; if(psEdBox->pBoxDisplay) { psEdBox->pBoxDisplay((WIDGET *)psEdBox, xOffset, yOffset, pColours); } else { pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_DARK]); iV_Line(x0,y0, x0,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y1, x1,y0, pColours[WCOL_LIGHT]); } fx = x0 + WEDB_XGAP;// + (psEdBox->width - fw) / 2; iV_SetFont(CurrFontID); iV_SetTextColour(pColours[WCOL_TEXT]); fy = y0 + (psEdBox->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); /* If there is more text than will fit into the box, display the bit with the cursor in it */ QString tmp = psEdBox->aText; tmp.remove(0, psEdBox->printStart); // Erase anything there isn't room to display. tmp.remove(psEdBox->printChars, tmp.length()); // if(psEdBox->pFontDisplay) { // psEdBox->pFontDisplay(fx,fy, pPrint); // } else { iV_DrawText(tmp.toUtf8().constData(), fx, fy); // } // Display the cursor if editing #if CURSOR_BLINK blink = !(((wzGetTicks() - psEdBox->blinkOffset)/WEDB_BLINKRATE) % 2); if ((psEdBox->state & WEDBS_MASK) == WEDBS_INSERT && blink) #else if ((psEdBox->state & WEDBS_MASK) == WEDBS_INSERT) #endif { // insert mode QString tmp = psEdBox->aText; tmp.remove(psEdBox->insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, psEdBox->printStart); cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData()); cx += iV_GetTextWidth("-"); cy = fy; iV_Line(cx, cy + iV_GetTextAboveBase(), cx, cy - iV_GetTextBelowBase(), pColours[WCOL_CURSOR]); } #if CURSOR_BLINK else if ((psEdBox->state & WEDBS_MASK) == WEDBS_OVER && blink) #else else if ((psEdBox->state & WEDBS_MASK) == WEDBS_OVER) #endif { // overwrite mode QString tmp = psEdBox->aText; tmp.remove(psEdBox->insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, psEdBox->printStart); cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData()); cy = fy; iV_Line(cx, cy, cx + WEDB_CURSORSIZE, cy, pColours[WCOL_CURSOR]); } if(psEdBox->pBoxDisplay == NULL) { if (psEdBox->state & WEDBS_HILITE) { /* Display the button hilite */ iV_Line(x0-2,y0-2, x1+2,y0-2, pColours[WCOL_HILITE]); iV_Line(x0-2,y0-2, x0-2,y1+2, pColours[WCOL_HILITE]); iV_Line(x0-2,y1+2, x1+2,y1+2, pColours[WCOL_HILITE]); iV_Line(x1+2,y1+2, x1+2,y0-2, pColours[WCOL_HILITE]); } } }
// add a string at x,y or add string below last line if x and y are 0 bool seq_AddTextForVideo(const char *pText, SDWORD xOffset, SDWORD yOffset, double startTime, double endTime, SEQ_TEXT_POSITIONING textJustification) { SDWORD sourceLength, currentLength; char *currentText; static SDWORD lastX; // make sure we take xOffset into account, we don't always start at 0 const unsigned int buffer_width = pie_GetVideoBufferWidth() - xOffset; iV_SetFont(font_scaled); ASSERT(aSeqList[currentSeq].currentText < MAX_TEXT_OVERLAYS, "too many text lines"); sourceLength = strlen(pText); currentLength = sourceLength; currentText = &(aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].pText[0]); //if the string is bigger than the buffer get the last end of the last fullword in the buffer if (currentLength >= MAX_STR_LENGTH) { currentLength = MAX_STR_LENGTH - 1; //get end of the last word while ((pText[currentLength] != ' ') && (currentLength > 0)) { currentLength--; } currentLength--; } memcpy(currentText, pText, currentLength); currentText[currentLength] = 0;//terminate the string what ever //check the string is shortenough to print //if not take a word of the end and try again while (iV_GetTextWidth(currentText) > buffer_width) { currentLength--; while ((pText[currentLength] != ' ') && (currentLength > 0)) { currentLength--; } currentText[currentLength] = 0;//terminate the string what ever } currentText[currentLength] = 0;//terminate the string what ever //check if x and y are 0 and put text on next line if (((xOffset == 0) && (yOffset == 0)) && (currentLength > 0)) { aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].x = lastX; aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].y = aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText - 1].y + iV_GetTextLineSize(); } else { aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].x = xOffset + D_W2; aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].y = yOffset + D_H2; } lastX = aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].x; if (textJustification && currentLength == sourceLength) { static const int MIN_JUSTIFICATION = 40; static const int FOLLOW_ON_JUSTIFICATION = 160; //justify this text const int justification = buffer_width - iV_GetTextWidth(currentText); if (textJustification == SEQ_TEXT_JUSTIFY && justification > MIN_JUSTIFICATION) { aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].x += (justification / 2); } else if (textJustification == SEQ_TEXT_FOLLOW_ON && justification > FOLLOW_ON_JUSTIFICATION) { } } //set start and finish times for the objects aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].startTime = startTime; aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].endTime = endTime; aSeqList[currentSeq].aText[aSeqList[currentSeq].currentText].bSubtitle = textJustification; aSeqList[currentSeq].currentText++; if (aSeqList[currentSeq].currentText >= MAX_TEXT_OVERLAYS) { aSeqList[currentSeq].currentText = 0; } //check text is okay on the screen if (currentLength < sourceLength) { //RECURSE x= 0 y = 0 for nextLine if (textJustification == SEQ_TEXT_JUSTIFY) { textJustification = SEQ_TEXT_POSITION; } seq_AddTextForVideo(&pText[currentLength + 1], 0, 0, startTime, endTime, textJustification); } return true; }
/** Draws formatted text with word wrap, long word splitting, embedded newlines * (uses '@' rather than '\n') and colour toggle mode ('#') which enables or * disables font colouring. * * @param String the string to display. * @param x,y X and Y coordinates of top left of formatted text. * @param width the maximum width of the formatted text (beyond which line * wrapping is used). * @param justify The alignment style to use, which is one of the following: * FTEXT_LEFTJUSTIFY, FTEXT_CENTRE or FTEXT_RIGHTJUSTIFY. * @return the Y coordinate for the next text line. */ int iV_DrawFormattedText(const char *String, UDWORD x, UDWORD y, UDWORD Width, UDWORD Justify) { std::string FString; std::string FWord; int i; int jx = x; // Default to left justify. int jy = y; UDWORD WWidth; int TWidth; const char *curChar = String; while (*curChar != 0) { bool GotSpace = false; bool NewLine = false; // Reset text draw buffer FString.clear(); WWidth = 0; // Parse through the string, adding words until width is achieved. while (*curChar != 0 && WWidth < Width && !NewLine) { const char *startOfWord = curChar; const unsigned int FStringWidth = iV_GetTextWidth(FString.c_str()); // Get the next word. i = 0; FWord.clear(); for (; *curChar != 0 && *curChar != ASCII_SPACE && *curChar != ASCII_NEWLINE && *curChar != '\n'; ++i, ++curChar) { if (*curChar == ASCII_COLOURMODE) // If it's a colour mode toggle char then just add it to the word. { FWord.push_back(*curChar); // this character won't be drawn so don't deal with its width continue; } // Update this line's pixel width. //WWidth = FStringWidth + iV_GetCountedTextWidth(FWord.c_str(), i + 1); // This triggers tonnes of valgrind warnings, if the string contains unicode. Adding lots of trailing garbage didn't help... Using iV_GetTextWidth with a null-terminated string, instead. WWidth = FStringWidth + iV_GetTextWidth(FWord.c_str()); // If this word doesn't fit on the current line then break out if (WWidth > Width) { break; } // If width ok then add this character to the current word. FWord.push_back(*curChar); } // Don't forget the space. if (*curChar == ASCII_SPACE) { // Should be a space below, not '-', but need to work around bug in QuesoGLC // which was fixed in CVS snapshot as of 2007/10/26, same day as I reported it :) - Per WWidth += iV_GetCharWidth('-'); if (WWidth <= Width) { FWord.push_back(' '); ++i; ++curChar; GotSpace = true; } } // Check for new line character. else if (*curChar == ASCII_NEWLINE || *curChar == '\n') { if (!bMultiPlayer) { NewLine = true; } ++curChar; } // If we've passed a space on this line and the word goes past the // maximum width and this isn't caused by the appended space then // rewind to the start of this word and finish this line. if (GotSpace && i != 0 && WWidth > Width && FWord[i - 1] != ' ') { // Skip back to the beginning of this // word and draw it on the next line curChar = startOfWord; break; } // And add it to the output string. FString.append(FWord); } // Remove trailing spaces, useful when doing center alignment. while (!FString.empty() && FString[FString.size() - 1] == ' ') { FString.erase(FString.size() - 1); // std::string has no pop_back(). } TWidth = iV_GetTextWidth(FString.c_str()); // Do justify. switch (Justify) { case FTEXT_CENTRE: jx = x + (Width - TWidth) / 2; break; case FTEXT_RIGHTJUSTIFY: jx = x + Width - TWidth; break; case FTEXT_LEFTJUSTIFY: jx = x; break; } // draw the text. iV_DrawText(FString.c_str(), jx, jy); // and move down a line. jy += iV_GetTextLineSize(); } return jy; }
/* Update and possibly display the tip */ void tipDisplay() { SDWORD newMX, newMY; SDWORD currTime; SDWORD fw, topGap; switch (tipState) { case TIP_WAIT: /* See if the tip has to be shown */ newMX = mouseX(); newMY = mouseY(); currTime = wzGetTicks(); if (newMX == mx && newMY == my && (currTime - startTime > TIP_PAUSE)) { /* Activate the tip */ tipState = TIP_ACTIVE; /* Calculate the size of the tip box */ topGap = TIP_VGAP; iV_SetFont(FontID); lineHeight = iV_GetTextLineSize(); fw = 0; for (int n = 0; n < pTip.size(); ++n) { fw = std::max<int>(fw, iV_GetTextWidth(pTip[n].toUtf8().constData())); } tw = fw + TIP_HGAP * 2; th = topGap * 2 + lineHeight * pTip.size() + iV_GetTextBelowBase(); /* Position the tip box */ tx = clip(wx + ww / 2, 0, screenWidth - tw - 1); ty = std::max(wy + wh + TIP_VGAP, 0); if (ty + th >= (int)screenHeight) { /* Position the tip above the button */ ty = wy - th - TIP_VGAP; } /* Position the text */ fx = tx + TIP_HGAP; fy = ty + (th - lineHeight * pTip.size()) / 2 - iV_GetTextAboveBase(); /* Note the time */ startTime = wzGetTicks(); } else if (newMX != mx || newMY != my || mousePressed(MOUSE_LMB)) { mx = newMX; my = newMY; startTime = currTime; } break; case TIP_ACTIVE: /* Draw the tool tip */ pie_BoxFill(tx, ty, tx + tw, ty + th, WZCOL_FORM_TIP_BACKGROUND); iV_Line(tx + 1, ty + th - 2, tx + 1, ty + 1, WZCOL_FORM_DARK); iV_Line(tx + 2, ty + 1, tx + tw - 2, ty + 1, WZCOL_FORM_DARK); iV_Line(tx, ty + th, tx + tw, ty + th, WZCOL_FORM_DARK); iV_Line(tx + tw, ty + th - 1, tx + tw, ty, WZCOL_FORM_DARK); iV_Box(tx, ty, tx + tw - 1, ty + th - 1, WZCOL_FORM_LIGHT); iV_SetFont(FontID); iV_SetTextColour(TipColour); for (int n = 0; n < pTip.size(); ++n) { iV_DrawText(pTip[n].toUtf8().constData(), fx, fy + lineHeight * n); } break; default: break; } }
/** Displays all the console messages */ void displayConsoleMessages( void ) { CONSOLE_MESSAGE *psMessage; int linePitch; int boxDepth; int drop; int MesY; int clipDepth; unsigned int exceed, numProcessed; /* Are there any to display? */ if(consoleMessages == NULL && !bConsoleDropped) { /* No point - so get out */ return; } /* Return if it's disabled */ if(!bConsoleDisplayEnabled) { return; } /* Get the travel to the next line */ linePitch = iV_GetTextLineSize(); pie_SetDepthBufferStatus(DEPTH_CMP_ALWAYS_WRT_ON); pie_SetFogStatus(false); drop = 0; if(bConsoleDropped) { drop = displayOldMessages(); } if(consoleMessages==NULL) { return; } /* Do we want a box under it? */ if(bTextBoxActive) { for (psMessage = consoleMessages, exceed = 0; psMessage && consoleVisibleLines > 0 && exceed < 4; // ho ho ho!!! psMessage = psMessage->psNext) { if (iV_GetTextWidth(psMessage->text) > mainConsole.width) { ++exceed; } } /* How big a box is necessary? */ boxDepth = (numActiveMessages> consoleVisibleLines ? consoleVisibleLines-1 : numActiveMessages-1); /* Add on the extra - hope it doesn't exceed two lines! */ boxDepth += exceed; /* GET RID OF THE MAGIC NUMBERS BELOW */ clipDepth = (mainConsole.topY+(boxDepth*linePitch)+CON_BORDER_HEIGHT+drop); if(clipDepth > (pie_GetVideoBufferHeight() - linePitch)) { clipDepth = (pie_GetVideoBufferHeight() - linePitch); } iV_TransBoxFill(mainConsole.topX - CON_BORDER_WIDTH,mainConsole.topY-mainConsole.textDepth-CON_BORDER_HEIGHT+drop+1, mainConsole.topX+mainConsole.width ,clipDepth); } /* Stop when we've drawn enough or we're at the end */ MesY = mainConsole.topY + drop; for (psMessage = consoleMessages, numProcessed = 0; psMessage && numProcessed < consoleVisibleLines && MesY < (pie_GetVideoBufferHeight() - linePitch); psMessage = psMessage->psNext) { /* Set text color depending on message type */ setConsoleTextColor(psMessage->player); /* Draw the text string */ MesY = iV_DrawFormattedText(psMessage->text, mainConsole.topX, MesY, mainConsole.width, psMessage->JustifyType); /* Move on */ ++numProcessed; } }