void TXT_DrawString(const char *s) { int x, y; int x1; const char *p; TXT_GetXY(&x, &y); if (VALID_Y(y)) { x1 = x; for (p = s; *p != '\0'; ++p) { if (VALID_X(x1)) { TXT_GotoXY(x1, y); TXT_PutChar(*p); } x1 += 1; } } TXT_GotoXY(x + strlen(s), y); }
void TXT_DrawWindowFrame(const char *title, int x, int y, int w, int h) { int x1, y1; int bx, by; TXT_FGColor(TXT_COLOR_BRIGHT_CYAN); TXT_BGColor(TXT_WINDOW_BACKGROUND, 0); for (y1=y; y1<y+h; ++y1) { // Select the appropriate row and column in the borders // array to pick the appropriate character to draw at // this location. // // Draw a horizontal line on the third line down, so we // draw a box around the title. by = y1 == y ? 0 : y1 == y + 2 && title != NULL ? 2 : y1 == y + h - 1 ? 3 : 1; for (x1=x; x1<x+w; ++x1) { bx = x1 == x ? 0 : x1 == x + w - 1 ? 3 : 1; if (VALID_X(x1) && VALID_Y(y1)) { TXT_GotoXY(x1, y1); TXT_PutChar(borders[by][bx]); } } } // Draw the title if (title != NULL) { TXT_GotoXY(x + 1, y + 1); TXT_BGColor(TXT_COLOR_GREY, 0); TXT_FGColor(TXT_COLOR_BLUE); for (x1=0; x1<w-2; ++x1) { TXT_DrawString(" "); } TXT_GotoXY(x + (w - strlen(title)) / 2, y + 1); TXT_DrawString(title); } // Draw the window's shadow. TXT_DrawShadow(x + 2, y + h, w, 1); TXT_DrawShadow(x + w, y + 1, 2, h); }
void TXT_DrawVertScrollbar(int x, int y, int h, int cursor, int range) { int y1; int cursor_y; if (!VALID_X(x)) { return; } TXT_FGColor(TXT_COLOR_BLACK); TXT_BGColor(TXT_COLOR_GREY, 0); TXT_GotoXY(x, y); TXT_PutChar('\x18'); cursor_y = y + 1; if (cursor_y > y + h - 2) { cursor_y = y + h - 2; } if (range > 1) { cursor_y += (cursor * (h - 3)) / (range - 1); } for (y1=y+1; y1<y+h-1; ++y1) { if (VALID_Y(y1)) { TXT_GotoXY(x, y1); if (y1 == cursor_y) { TXT_PutChar('\xdb'); } else { TXT_PutChar('\xb1'); } } } TXT_GotoXY(x, y + h - 1); TXT_PutChar('\x19'); }
void TXT_DrawASCIITable(void) { unsigned char *screendata; char buf[10]; int x, y; int n; screendata = TXT_GetScreenData(); TXT_FGColor(TXT_COLOR_BRIGHT_WHITE); TXT_BGColor(TXT_COLOR_BLACK, 0); for (y=0; y<16; ++y) { for (x=0; x<16; ++x) { n = y * 16 + x; TXT_GotoXY(x * 5, y); sprintf(buf, "%02x ", n); TXT_Puts(buf); // Write the character directly to the screen memory buffer: screendata[(y * TXT_SCREEN_W + x * 5 + 3) * 2] = n; } } TXT_UpdateScreen(); }
static void TXT_TableDrawer(TXT_UNCAST_ARG(table), int selected) { TXT_CAST_ARG(txt_table_t, table); txt_widget_t *widget; int selected_cell; int i; // Check the table's current selection points at something valid before // drawing. CheckValidSelection(table); // Find the index of the currently-selected widget. selected_cell = table->selected_y * table->columns + table->selected_x; // Draw all cells for (i=0; i<table->num_widgets; ++i) { widget = table->widgets[i]; if (widget != NULL) { TXT_GotoXY(widget->x, widget->y); TXT_DrawWidget(widget, selected && i == selected_cell); } } }
static void TXT_SeparatorDrawer(TXT_UNCAST_ARG(separator)) { TXT_CAST_ARG(txt_separator_t, separator); int x, y; int w; w = separator->widget.w; TXT_GetXY(&x, &y); // Draw separator. Go back one character and draw two extra // to overlap the window borders. TXT_DrawSeparator(x-2, y, w + 4); if (separator->label != NULL) { TXT_GotoXY(x, y); TXT_FGColor(TXT_COLOR_BRIGHT_GREEN); TXT_DrawString(" "); TXT_DrawString(separator->label); TXT_DrawString(" "); } }
static void TXT_LabelDrawer(TXT_UNCAST_ARG(label), int selected) { TXT_CAST_ARG(txt_label_t, label); unsigned int x, y; int origin_x, origin_y; unsigned int align_indent = 0; unsigned int w; w = label->widget.w; TXT_BGColor(label->bgcolor, 0); TXT_FGColor(label->fgcolor); TXT_GetXY(&origin_x, &origin_y); for (y=0; y<label->h; ++y) { // Calculate the amount to indent this line due to the align // setting switch (label->widget.align) { case TXT_HORIZ_LEFT: align_indent = 0; break; case TXT_HORIZ_CENTER: align_indent = (label->w - strlen(label->lines[y])) / 2; break; case TXT_HORIZ_RIGHT: align_indent = label->w - strlen(label->lines[y]); break; } // Draw this line TXT_GotoXY(origin_x, origin_y + y); // Gap at the start for (x=0; x<align_indent; ++x) { TXT_DrawString(" "); } // The string itself TXT_DrawString(label->lines[y]); x += strlen(label->lines[y]); // Gap at the end for (; x<w; ++x) { TXT_DrawString(" "); } } }
void TXT_DrawWidget(TXT_UNCAST_ARG(widget), int selected) { TXT_CAST_ARG(txt_widget_t, widget); // For convenience... TXT_GotoXY(widget->x, widget->y); // Call drawer method widget->widget_class->drawer(widget, selected); }
static void DrawDesktopBackground(const char *title) { int i; unsigned char *screendata; unsigned char *p; screendata = TXT_GetScreenData(); // Fill the screen with gradient characters p = screendata; for (i=0; i<TXT_SCREEN_W * TXT_SCREEN_H; ++i) { *p++ = 0xb1; *p++ = TXT_COLOR_GREY | (TXT_COLOR_BLUE << 4); } // Draw the top and bottom banners p = screendata; for (i=0; i<TXT_SCREEN_W; ++i) { *p++ = ' '; *p++ = TXT_COLOR_BLACK | (TXT_COLOR_GREY << 4); } p = screendata + (TXT_SCREEN_H - 1) * TXT_SCREEN_W * 2; for (i=0; i<TXT_SCREEN_W; ++i) { *p++ = ' '; *p++ = TXT_COLOR_BLACK | (TXT_COLOR_GREY << 4); } // Print the title TXT_GotoXY(0, 0); TXT_FGColor(TXT_COLOR_BLACK); TXT_BGColor(TXT_COLOR_GREY, 0); TXT_PutChar(' '); TXT_Puts(title); }
void TXT_DrawHorizScrollbar(int x, int y, int w, int cursor, int range) { int x1; int cursor_x; if (!VALID_Y(y)) { return; } TXT_FGColor(TXT_COLOR_BLACK); TXT_BGColor(TXT_COLOR_GREY, 0); TXT_GotoXY(x, y); TXT_PutChar('\x1b'); cursor_x = x + 1; if (range > 1) { cursor_x += (cursor * (w - 3)) / (range - 1); } if (cursor_x > x + w - 2) { cursor_x = x + w - 2; } for (x1=x+1; x1<x+w-1; ++x1) { if (VALID_X(x1)) { if (x1 == cursor_x) { TXT_PutChar('\xdb'); } else { TXT_PutChar('\xb1'); } } } TXT_PutChar('\x1a'); }
void TXT_DrawWidget(TXT_UNCAST_ARG(widget)) { TXT_CAST_ARG(txt_widget_t, widget); txt_saved_colors_t colors; // The drawing function might change the fg/bg colors, // so make sure we restore them after it's done. TXT_SaveColors(&colors); // For convenience... TXT_GotoXY(widget->x, widget->y); // Call drawer method widget->widget_class->drawer(widget); TXT_RestoreColors(&colors); }
void TXT_DrawSeparator(int x, int y, int w) { unsigned char *data; int x1; int b; data = TXT_GetScreenData(); TXT_FGColor(TXT_COLOR_BRIGHT_CYAN); TXT_BGColor(TXT_WINDOW_BACKGROUND, 0); if (!VALID_Y(y)) { return; } data += (y * TXT_SCREEN_W + x) * 2; for (x1=x; x1<x+w; ++x1) { TXT_GotoXY(x1, y); b = x1 == x ? 0 : x1 == x + w - 1 ? 3 : 1; if (VALID_X(x1)) { // Read the current value from the screen // Check that it matches what the window should look like if // there is no separator, then apply the separator if (*data == borders[1][b]) { TXT_PutChar(borders[2][b]); } } data += 2; } }
static void TXT_TableDrawer(TXT_UNCAST_ARG(table)) { TXT_CAST_ARG(txt_table_t, table); txt_widget_t *widget; int i; // Check the table's current selection points at something valid before // drawing. CheckValidSelection(table); // Draw all cells for (i=0; i<table->num_widgets; ++i) { widget = table->widgets[i]; if (IsActualWidget(widget)) { TXT_GotoXY(widget->x, widget->y); TXT_DrawWidget(widget); } } }