void tui_message(const char *format,...) { int x, y, width, height; char *str; int str_length; va_list ap; tui_area_t backing_store = NULL; va_start(ap, format); str = lib_mvsprintf(format, ap); str_length = strlen(str); if (str_length > tui_num_cols() - 10) { str_length = tui_num_cols() - 10; str[str_length] = 0; } x = CENTER_X(str_length + 6); y = CENTER_Y(5); width = str_length + 6; height = 5; tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, NULL, &backing_store); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); tui_display(CENTER_X(str_length), y + 2, 0, str); getkey(); tui_area_put(backing_store, x, y); tui_area_free(backing_store); lib_free(str); }
void load_warning_scr() { copymem((void *)0x78000, (void*)font_pc, 8192); /* Clear out any leftover characters from previous BG. */ setmem((void*)BGMap(0), 0, 0x2000); WA[31].head = WRLD_ON; WA[31].gx = 0; WA[31].gp = 0; //No parallax for now. WA[31].gy = CENTER_Y(5)*8; WA[31].mx = 0; WA[31].mp = 0; WA[31].my = 0; WA[31].w = 384; WA[31].h = (5*8 - 1); WA[31].ovr = 0; WA[31].param = 0; WA[30].head = WRLD_END; print_message(msg_warn[0], 0, CENTER_X(27), 0, 0); print_message(msg_warn[1], 0, CENTER_X(23), 2, 0); print_message(msg_warn[2], 0, CENTER_X(16), 4, 0); }
static void IDrawTitle(void) { GlyphNormalScreen(G_glyphLCD); GlyphClearScreen(G_glyphLCD); GlyphSetFont(G_glyphLCD, GLYPH_FONT_5_BY_7); GlyphSetXY(G_glyphLCD, CENTER_X(20, 5u), DISPLAY_HEIGHT - 24); GlyphString(G_glyphLCD, "Future Designs, Inc.", 20); GlyphSetXY(G_glyphLCD, CENTER_X(12, 5u), DISPLAY_HEIGHT - 16); GlyphString(G_glyphLCD, "RX Solutions", 12); GlyphSetXY(G_glyphLCD, CENTER_X(15, 5u), DISPLAY_HEIGHT - 8); GlyphString(G_glyphLCD, "www.teamfdi.com", 15); }
int tui_input_string(const char *title, const char *prompt, char *buf, int buflen) { int field_width, x, y, width, height, retval; tui_area_t backing_store = NULL; if (buflen + 1 < tui_num_cols() - 12) field_width = buflen + 1; else field_width = tui_num_cols() - 12; width = field_width + 4; height = 4; x = CENTER_X(width); y = CENTER_Y(height); tui_display_window(x, y, width, height, REQUESTER_BORDER, REQUESTER_BACK, title, &backing_store); tui_set_attr(REQUESTER_FORE, REQUESTER_BACK, 0); tui_display(x + 2, y + 1, field_width, prompt); retval = _tui_input_string(x + 2, y + 2, buf, buflen, field_width, FIELD_FORE, FIELD_BACK); tui_area_put(backing_store, x, y); tui_area_free(backing_store); return retval; }
void DetectWithOF5::draw_motions() { /** 使用不同颜色表示,容易区分 */ for (size_t i = 0; i < motions_.size(); i++) { cv::rectangle(origin_, motions_[i].brc, motions_[i].color, 2); char buf[16]; snprintf(buf, sizeof(buf), "#%d", motions_[i].id); cv::putText(origin_, buf, motions_[i].brc.tl(), cv::FONT_HERSHEY_PLAIN, 1.5, motions_[i].color, 2); // 历史轮廓中心线 .. //std::vector<cv::Point> centers = motions_[i].get_contours_center(); //std::vector<cv::Point> centers = motions_[i].get_brcs_center(); //draw_lines(origin_, centers, motions_[i].color); // FIXME: 理论目标大小 ... cv::Size ts = est_target_size(CENTER_Y(motions_[i].brc)); cv::Rect estrc, brc = cv::boundingRect(motions_[i].last_contour); estrc.x = CENTER_X(motions_[i].brc) - ts.width / 2; estrc.y = CENTER_Y(motions_[i].brc) - ts.height / 2; estrc.width = ts.width; estrc.height = ts.height; cv::rectangle(origin_, estrc, cv::Scalar(255, 255, 255)); } }
void tui_view_text(int width, int height, const char *title, const char *text) { const char *p; int x, y, i; int need_update = 1; tui_area_t backing_store = NULL; x = CENTER_X(width); y = CENTER_Y(height); tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, title, &backing_store); tui_set_attr(MESSAGE_BORDER, MESSAGE_BACK, 0); tui_put_char(x + width - 1, y + 1, 0x1e); /* Up arrow */ tui_put_char(x + width - 1, y + height - 2, 0x1f); /* Down arrow */ for (i = y + 2; i < y + height - 2; i++) tui_put_char(x + width - 1, i, 0xb1); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); p = text; while (1) { int key; if (need_update) { tui_display_text(x + 2, y + 1, width - 4, height - 2, p); need_update = 0; } key = getkey(); switch (key) { case K_Escape: case K_Return: tui_area_put(backing_store, x, y); tui_area_free(backing_store); return; case K_Up: case K_Left: p = util_find_prev_line(text, p); need_update = 1; break; case K_Down: case K_Right: p = util_find_next_line(p); need_update = 1; break; case K_PageDown: for (i = 0; i < height - 3; i++) p = util_find_next_line(p); need_update = 1; break; case K_PageUp: for (i = 0; i < height - 3; i++) p = util_find_prev_line(text, p); need_update = 1; break; } } }
static TUI_MENU_CALLBACK(keyset_callback) { int direction, number; int value; char *rname; number = (int)param >> 8; direction = (int)param & 0xff; rname = lib_msprintf("KeySet%d%s", number, joystick_direction_to_string(direction)); if (been_activated) { kbd_code_t key; int width = 60, height = 5; int x = CENTER_X(width), y = CENTER_Y(height); tui_area_t backing_store = NULL; char *msg; msg = lib_msprintf("Press key for %s%s (Esc for none)...", direction == KEYSET_FIRE ? "" : "direction ", joystick_direction_to_string(direction)); tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, NULL, &backing_store); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); tui_display(CENTER_X(strlen(msg)), y + 2, 0, msg); lib_free(msg); /* Do not allow Alt as we need it for hotkeys. */ do { key = grab_key(); } while (key == K_LEFTALT || key == K_RIGHTALT); tui_area_put(backing_store, x, y); tui_area_free(backing_store); if (key == K_ESC) { key = K_NONE; } resources_set_int(rname, (int)key); } resources_get_int(rname, &value); lib_free(rname); return kbd_code_to_string((kbd_code_t)value); }
int tui_ask_confirmation(const char *format, ...) { int x, y, width, height; char *str; int str_length; va_list ap; tui_area_t backing_store = NULL; int c; va_start(ap, format); str = lib_mvsprintf(format, ap); str_length = strlen(str); if (str_length > tui_num_cols() - 10) { str_length = tui_num_cols() - 10; str[str_length] = 0; } x = CENTER_X(str_length + 6); y = CENTER_Y(5); width = str_length + 6; height = 5; tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, NULL, &backing_store); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); tui_display(CENTER_X(str_length), y + 2, 0, str); do { c = getkey(); } while (toupper(c) != 'Y' && toupper(c) != 'N'); tui_area_put(backing_store, x, y); tui_area_free(backing_store); lib_free(str); return toupper(c) == 'Y'; }
void serv_pex(t_on_screen *screen, char *msg) { int num_cli; t_cli *my_cli; num_cli = atoi(get_argument(msg, 2)); my_cli = screen->world->client; while (my_cli != NULL) { if (my_cli->num == num_cli) { screen->world->pos_expulse.x = CENTER_X(screen->coor_max.x) + (my_cli->pos.pos_player.x - screen->world->x_begin) * SQUARE; screen->world->pos_expulse.y = CENTER_Y(screen->coor_max.y) + ((my_cli->pos.pos_player.y - screen->world->y_begin) * SQUARE); screen->world->time_expulse = 4; } my_cli = my_cli->next; } }
static void PlayerListCustomDraw( const menu_t *menu, GraphicsDevice *g, const struct vec2i pos, const struct vec2i size, const void *data) { UNUSED(menu); UNUSED(g); // Draw players starting from the index // TODO: custom columns const PlayerList *pl = data; // First draw the headers const int xStart = pos.x + 80 + (size.x - 320) / 2; int x = xStart; int y = pos.y; FontStrMask("Player", svec2i(x, y), colorPurple); x += 100; FontStrMask("Score", svec2i(x, y), colorPurple); x += 32; FontStrMask("Kills", svec2i(x, y), colorPurple); y += FontH() * 2 + PLAYER_LIST_ROW_HEIGHT + 4; // Then draw the player list int maxScore = -1; for (int i = pl->scroll; i < MIN((int)pl->playerUIDs.size, pl->scroll + PlayerListMaxRows(pl)); i++) { const int *playerUID = CArrayGet(&pl->playerUIDs, i); PlayerData *p = PlayerDataGetByUID(*playerUID); if (p == NULL) { continue; } if (maxScore < GetModeScore(p)) { maxScore = GetModeScore(p); } x = xStart; // Highlight local players using different coloured text const color_t textColor = p->IsLocal ? colorPurple : colorWhite; // Draw the players offset on alternate rows DisplayCharacterAndName( svec2i(x + (i & 1) * 16, y + 4), &p->Char, DIRECTION_DOWN, p->name, textColor); // Draw score x += 100; char buf[256]; sprintf(buf, "%d", p->Totals.Score); FontStrMask(buf, svec2i(x, y), textColor); // Draw kills x += 32; sprintf(buf, "%d", p->Totals.Kills); FontStrMask(buf, svec2i(x, y), textColor); // Draw winner/award text x += 32; if (pl->showWinners && GetModeScore(p) == maxScore) { FontStrMask("Winner!", svec2i(x, y), colorGreen); } else if (pl->showLastMan && p->Lives > 0 && gCampaign.Entry.Mode == GAME_MODE_DEATHMATCH) { // Only show last man standing on deathmatch mode FontStrMask("Last man standing!", svec2i(x, y), colorGreen); } y += PLAYER_LIST_ROW_HEIGHT; } // Draw indicator arrows if there's enough to scroll if (pl->scroll > 0) { FontStr("^", svec2i( CENTER_X(pos, size, FontStrW("^")), pos.y + FontH())); } if (pl->scroll < PlayerListMaxScroll(pl)) { FontStr("v", svec2i( CENTER_X(pos, size, FontStrW("v")), pos.y + size.y - FontH())); } // Finally draw any custom stuff if (pl->drawFunc) { pl->drawFunc(pl->data); } }
/* FIXME: documentation. */ char *tui_file_selector(const char *title, const char *directory, const char *pattern, const char *default_item, read_contents_func_type contents_func, char **browse_file_return, unsigned int *browse_file_number_return) { static char *return_path = NULL; struct file_list *fl; int curr_item, first_item, need_update; int x, y, width, height, num_cols, num_lines, field_width; int num_files; char str[0x100]; int str_len = 0; tui_area_t backing_store = NULL; if (contents_func != NULL) { *browse_file_return = NULL; } if (browse_file_number_return != NULL) { *browse_file_number_return = 0; } if (directory != NULL) { return_path = lib_stralloc(directory); } else { return_path = ioutil_current_dir(); } slashize_path(&return_path); fl = file_list_read(return_path, pattern); if (fl == NULL) { return NULL; } first_item = curr_item = 0; num_cols = 4; field_width = 18; num_lines = 17; height = num_lines + 2; width = field_width * num_cols + 4; num_files = num_cols * num_lines; if (default_item != NULL && *default_item) { int i; for (i = 0; i < fl->num_items; i++) { if (!strcasecmp(default_item, fl->items[i].name)) { curr_item = i; while (curr_item - first_item >= num_files) { first_item += num_lines; } break; } } } x = CENTER_X(width); y = CENTER_Y(height); need_update = 1; tui_area_get(&backing_store, x, y, width + 2, height + 1); tui_display_window(x, y, width, height, MENU_BORDER, MENU_BACK, title, NULL); while (1) { int key; tui_set_attr(MENU_FORE, MENU_BACK, 0); if (need_update) { file_selector_display_path(return_path, x + 1, y + height - 1, width - 2); file_selector_update(fl, first_item, x + 2, y + 1, field_width, num_lines, num_cols); tui_set_attr(FIRST_LINE_FORE, FIRST_LINE_BACK, 0); tui_display(0, tui_num_lines() - 1, tui_num_cols(), "\030\031\033\032: Move <Enter>: Select %s<Alt>-<letter>: Change drive", contents_func != NULL ? "<Space>: Preview " : ""); need_update = 0; } tui_set_attr(MENU_FORE, MENU_HIGHLIGHT, 0); file_selector_display_item(fl, curr_item, first_item, x + 2, y + 1, field_width, num_lines, num_cols); key = getkey(); tui_set_attr(MENU_FORE, MENU_BACK, 0); file_selector_display_item(fl, curr_item, first_item, x + 2, y + 1, field_width, num_lines, num_cols); switch (key) { case K_Escape: tui_area_put(backing_store, x, y); tui_area_free(backing_store); return NULL; case K_Left: str_len = 0; if (curr_item - num_lines >= 0) { curr_item -= num_lines; if (curr_item < first_item) { if (first_item >= num_lines) { first_item -= num_lines; need_update = 1; } else { curr_item += num_lines; } } } break; case K_Up: str_len = 0; if (curr_item > 0) { curr_item--; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } } break; case K_Right: str_len = 0; if (curr_item + num_lines < fl->num_used_items) { curr_item += num_lines; if (curr_item - first_item >= num_files) { first_item += num_lines; need_update = 1; } } break; case K_Down: str_len = 0; if (curr_item < fl->num_used_items - 1) { curr_item++; if (curr_item == first_item + num_files) { first_item++; need_update = 1; } } break; case K_PageDown: str_len = 0; if (curr_item + num_files < fl->num_used_items) { curr_item += num_files; first_item += num_files; } need_update = 1; break; case K_PageUp: str_len = 0; if (curr_item - num_files >= 0) { curr_item -= num_files; first_item -= num_files; if (first_item < 0) { first_item = 0; } need_update = 1; } break; case K_Home: str_len = 0; curr_item = 0; if (first_item != 0) { first_item = 0; need_update = 1; } break; case K_End: str_len = 0; curr_item = fl->num_used_items - 1; first_item = curr_item - num_files + 1; if (first_item < 0) { first_item = 0; } need_update = 1; break; case K_Return: str_len = 0; if (fl->items[curr_item].type == FT_DIR) { struct file_list *new_fl; char *new_path; new_path = change_path(fl, return_path, curr_item); new_fl = file_list_read(new_path, pattern); if (new_fl != NULL) { file_list_free(fl); fl = new_fl; first_item = curr_item = 0; lib_free(return_path); return_path = new_path; need_update = 1; ioutil_chdir(return_path); } else { lib_free(new_path); } } else { char *p = util_concat(return_path, fl->items[curr_item].name, NULL); lib_free(return_path); return_path = p; tui_area_put(backing_store, x, y); tui_area_free(backing_store); return return_path; } break; case K_BackSpace: if (str_len > 1) { int n; str_len--; n = file_list_find(fl, str, str_len); if (n >= 0) { curr_item = n; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } else if (first_item + num_files <= curr_item) { first_item = curr_item - num_files + 1; need_update = 1; } } } else { str_len = 0; curr_item = 0; if (first_item != 0) { first_item = 0; need_update = 1; } } break; case ' ': if (contents_func != NULL && fl->items[curr_item].type != FT_DIR && browse_file_return != NULL) { tui_display(0, tui_num_lines() - 1, tui_num_cols(), ""); *browse_file_return = tui_image_browser(fl->items[curr_item].name, contents_func, browse_file_number_return); if (*browse_file_return != NULL) { char *p = util_concat(return_path, fl->items[curr_item].name, NULL); lib_free(return_path); return_path = p; tui_area_put(backing_store, x, y); tui_area_free(backing_store); return return_path; } need_update = 1; break; } else { tui_beep(); } default: { int drive_num; drive_num = alt_key_to_drive_num(key); if (drive_num > 0) { /* `A-a' ... `A-z' change the current drive. */ int num_available_drives; int current_drive; _dos_getdrive(¤t_drive); _dos_setdrive(current_drive, &num_available_drives); if (drive_num <= num_available_drives) { char *new_path; /* FIXME: This is a hack... Maybe there is a cleaner way to do it, but for now I just don't know. */ _dos_setdrive(drive_num, &num_available_drives); new_path = ioutil_current_dir(); if (new_path != NULL) { slashize_path(&new_path); _dos_setdrive(current_drive, &num_available_drives); if (new_path != NULL) { struct file_list *new_fl; new_fl = file_list_read(new_path, pattern); if (new_fl != NULL) { file_list_free(fl); fl = new_fl; first_item = curr_item = 0; lib_free(return_path); return_path = new_path; need_update = 1; ioutil_chdir(return_path); } else { lib_free(new_path); } } } else { _dos_setdrive(current_drive, &num_available_drives); tui_beep(); } } else { tui_beep(); } } else if (isprint(key) && str_len < 0x100) { int n; str[str_len] = key; n = file_list_find(fl, str, str_len + 1); if (n < 0) { tui_beep(); } else { str_len++; curr_item = n; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } else if (first_item + num_files <= curr_item) { first_item = curr_item - num_files + 1; need_update = 1; } } } } break; } } }