// Linha horizontal void block::FIREHLINE() { e[0] = e[7] = true; BLOCK(NR, 15, 0); HLINE(DR, 14, 12, 1); HLINE(UR, 14, 12, 3); }
static void rtgui_dc_buffer_draw_hline(struct rtgui_dc *self, int x1, int x2, int y1) { struct rtgui_dc_buffer *dst; unsigned r, g, b, a; dst = (struct rtgui_dc_buffer *)self; if (y1 >= dst->height) return; if (x1 > dst->width) x1 = dst->width; if (x2 > dst->width) x2 = dst->width; r = RTGUI_RGB_R(dst->gc.foreground); g = RTGUI_RGB_G(dst->gc.foreground); b = RTGUI_RGB_B(dst->gc.foreground); a = RTGUI_RGB_A(dst->gc.foreground); switch (dst->pixel_format) { case RTGRAPHIC_PIXEL_FORMAT_RGB565: HLINE(rt_uint16_t, DRAW_SETPIXEL_RGB565, 0); break; case RTGRAPHIC_PIXEL_FORMAT_BGR565: HLINE(rt_uint16_t, DRAW_SETPIXEL_BGR565, 0); break; case RTGRAPHIC_PIXEL_FORMAT_RGB888: HLINE(rt_uint16_t, DRAW_SETPIXEL_RGB888, 0); break; case RTGRAPHIC_PIXEL_FORMAT_ARGB888: HLINE(rt_uint32_t, DRAW_SETPIXEL_ARGB8888, 0); break; } }
static void SDL_DrawLine4(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color, SDL_bool draw_end) { if (y1 == y2) { HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); } else if (x1 == x2) { VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); } else if (ABS(x1 - x2) == ABS(y1 - y2)) { DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); } else { Uint8 _r, _g, _b, _a; const SDL_PixelFormat * fmt = dst->format; SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a); if (fmt->Rmask == 0x00FF0000) { if (!fmt->Amask) { AALINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_RGB888, draw_end); } else { AALINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_ARGB8888, draw_end); } } else { AALINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB, draw_end); } } }
// Invencible item void block::INVENCIBLEIT() { e[0] = e[3] = true; item = 'i'; BLOCK(NR, 6, 14); HLINE(UT, 6, 14, 1); DOT(LG, 2, 6, 21, 23, 25); }
void block::MONSTER1() { ZERO(); e[0] = e[5] = true; monster = '1'; CIRCLE(12, 0); HLINE(UT, 12, 0, 1); DOT(E2, 0, 12, 22); DOT(E3, 0, 12, 24); DOT(UT, 0, 12, 33); }
static void dumpSvgLine(XtermWidget xw, int row, FILE *fp) { TScreen *s = TScreenOf(xw); int inx = ROW2INX(s, row); LineData *ld = getLineData(s, inx); int col, sal, i; /* sal: same attribute length */ if (ld == 0) return; for (col = 0; col < MaxCols(s); col += sal) { XColor fgcolor, bgcolor; /* Count how many consecutive cells have the same color & attributes. */ for (sal = 1; col + sal < MaxCols(s); ++sal) { #if OPT_ISO_COLORS if (ld->color[col] != ld->color[col + sal]) break; #endif if (ld->attribs[col] != ld->attribs[col + sal]) break; } fgcolor.pixel = xw->old_foreground; bgcolor.pixel = xw->old_background; #if OPT_ISO_COLORS if (ld->attribs[col] & FG_COLOR) { unsigned fg = extract_fg(xw, ld->color[col], ld->attribs[col]); fgcolor.pixel = s->Acolors[fg].value; } if (ld->attribs[col] & BG_COLOR) { unsigned bg = extract_bg(xw, ld->color[col], ld->attribs[col]); bgcolor.pixel = s->Acolors[bg].value; } #endif XQueryColor(xw->screen.display, xw->core.colormap, &fgcolor); XQueryColor(xw->screen.display, xw->core.colormap, &bgcolor); if (ld->attribs[col] & BLINK) { /* White on red. */ fgcolor.red = fgcolor.green = fgcolor.blue = 65535u; bgcolor.red = 65535u; bgcolor.green = bgcolor.blue = 0u; } #if OPT_WIDE_ATTRS if (ld->attribs[col] & ATR_FAINT) { fgcolor.red = (unsigned short) ((2 * fgcolor.red) / 3); fgcolor.green = (unsigned short) ((2 * fgcolor.green) / 3); fgcolor.blue = (unsigned short) ((2 * fgcolor.blue) / 3); } #endif if (ld->attribs[col] & INVERSE) { XColor tmp = fgcolor; fgcolor = bgcolor; bgcolor = tmp; } /* Draw the background rectangle. */ fprintf(fp, " <rect x='%d' y='%d' ", bw + ib + col * CELLW, bw + ib + row * CELLH); fprintf(fp, "height='%d' width='%d' ", CELLH, sal * CELLW); fprintf(fp, "fill='rgb(%.2f%%, %.2f%%, %.2f%%)'/>\n", RGBPCT(bgcolor)); /* Now the <text>. */ /* * SVG: Rendering text strings into a given rectangle is a challenge. * Some renderers accept and do the right thing with the 'textLength' * attribute, while others ignore it. The only predictable way to place * (even monospaced) text properly is to do it character by character. */ fprintf(fp, " <g"); if (ld->attribs[col] & BOLD) fprintf(fp, " font-weight='bold'"); #if OPT_WIDE_ATTRS if (ld->attribs[col] & ATR_ITALIC) fprintf(fp, " font-style='italic'"); #endif fprintf(fp, " fill='rgb(%.2f%%, %.2f%%, %.2f%%)'>\n", RGBPCT(fgcolor)); for (i = 0; i < sal; ++i) { IChar chr = ld->charData[col + i]; if (chr == ' ') continue; fprintf(fp, " <text x='%d' y='%d'>", bw + ib + (col + i) * CELLW, bw + ib + row * CELLH + (CELLH * 3) / 4); #if OPT_WIDE_CHARS if (chr > 127) { /* Ignore hidden characters. */ if (chr != HIDDEN_CHAR) { Char temp[10]; *convertToUTF8(temp, chr) = 0; fputs((char *) temp, fp); } } else #endif switch (chr) { case 0: /* This sometimes happens when resizing... ignore. */ break; case '&': fputs("&", fp); break; case '<': fputs("<", fp); break; case '>': fputs(">", fp); break; default: fputc((int) chr, fp); } fprintf(fp, "</text>\n"); } fprintf(fp, " </g>\n"); #define HLINE(x) \ fprintf(fp, " <line x1='%d' y1='%d' " \ "x2='%d' y2='%d' " \ "stroke='rgb(%.2f%%, %.2f%%, %.2f%%)'/>\n", \ bw + ib + col * CELLW, bw + ib + row * CELLH + CELLH - (x), \ bw + ib + (col + sal) * CELLW, bw + ib + row * CELLH + CELLH - (x), \ RGBPCT(fgcolor)) /* Now the line attributes. */ if (ld->attribs[col] & UNDERLINE) { HLINE(4); } #if OPT_WIDE_ATTRS if (ld->attribs[col] & ATR_STRIKEOUT) { HLINE(9); } if (ld->attribs[col] & ATR_DBL_UNDER) { HLINE(3); HLINE(1); } #endif } }
int quick_dialog_skip (quick_dialog_t * quick_dlg, int nskip) { int len; int blen = 0; int x, y; /* current positions */ int y1 = 0; /* bottom of 1st column in case of two columns */ int y2 = -1; /* start of two columns */ int width1 = 0; /* width of single column */ int width2 = 0; /* width of each of two columns */ gboolean have_groupbox = FALSE; gboolean two_columns = FALSE; gboolean put_buttons = FALSE; /* x position of 1st column is 3 */ const int x1 = 3; /* x position of 2nd column is 4 and it will be fixed later, after creation of all widgets */ int x2 = 4; GArray *widgets; size_t i; quick_widget_t *quick_widget; WGroupbox *g = NULL; WDialog *dd; int return_val; len = str_term_width1 (I18N (quick_dlg->title)) + 6; quick_dlg->cols = max (quick_dlg->cols, len); y = 1; x = x1; /* create widgets */ widgets = g_array_sized_new (FALSE, FALSE, sizeof (quick_widget_item_t), 8); for (quick_widget = quick_dlg->widgets; quick_widget->widget_type != quick_end; quick_widget++) { quick_widget_item_t item = { NULL, quick_widget }; int width = 0; switch (quick_widget->widget_type) { case quick_checkbox: item.widget = WIDGET (check_new (++y, x, *quick_widget->u.checkbox.state, I18N (quick_widget->u.checkbox.text))); g_array_append_val (widgets, item); width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_button: /* single button */ item.widget = WIDGET (button_new (++y, x, quick_widget->u.button.action, quick_widget->u.button.action == B_ENTER ? DEFPUSH_BUTTON : NORMAL_BUTTON, I18N (quick_widget->u.button.text), quick_widget->u.button.callback)); g_array_append_val (widgets, item); width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_input: *quick_widget->u.input.result = NULL; y++; if (quick_widget->u.input.label_location != input_label_none) quick_create_labeled_input (widgets, &y, x, quick_widget, &width); else { item.widget = WIDGET (quick_create_input (y, x, quick_widget)); g_array_append_val (widgets, item); width = item.widget->cols; } if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_label: item.widget = WIDGET (label_new (++y, x, I18N (quick_widget->u.label.text))); g_array_append_val (widgets, item); y += item.widget->lines - 1; width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_radio: { WRadio *r; char **items = NULL; /* create the copy of radio_items to avoid mwmory leak */ items = g_new (char *, quick_widget->u.radio.count + 1); for (i = 0; i < (size_t) quick_widget->u.radio.count; i++) items[i] = g_strdup (_(quick_widget->u.radio.items[i])); items[i] = NULL; r = radio_new (++y, x, quick_widget->u.radio.count, (const char **) items); r->pos = r->sel = *quick_widget->u.radio.value; g_strfreev (items); item.widget = WIDGET (r); g_array_append_val (widgets, item); y += item.widget->lines - 1; width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); } break; case quick_start_groupbox: I18N (quick_widget->u.groupbox.title); len = str_term_width1 (quick_widget->u.groupbox.title); g = groupbox_new (++y, x, 1, len + 4, quick_widget->u.groupbox.title); item.widget = WIDGET (g); g_array_append_val (widgets, item); have_groupbox = TRUE; break; case quick_stop_groupbox: if (g != NULL) { Widget *w = WIDGET (g); y++; w->lines = y + 1 - w->y; g = NULL; g_array_append_val (widgets, item); } break; case quick_separator: y++; if (quick_widget->u.separator.line) { item.widget = WIDGET (hline_new (y, x, 1)); g_array_append_val (widgets, item); } break; case quick_start_columns: y2 = y; g_array_append_val (widgets, item); two_columns = TRUE; break; case quick_next_column: x = x2; y1 = y; y = y2; break; case quick_stop_columns: x = x1; y = max (y1, y); g_array_append_val (widgets, item); two_columns = FALSE; break; case quick_buttons: /* start put several buttons in bottom line */ if (quick_widget->u.separator.space) { y++; if (quick_widget->u.separator.line) item.widget = WIDGET (hline_new (y, 1, -1)); } g_array_append_val (widgets, item); /* several buttons in bottom line */ y++; quick_widget++; for (; quick_widget->widget_type == quick_button; quick_widget++) { item.widget = WIDGET (button_new (y, x++, quick_widget->u.button.action, quick_widget->u.button.action == B_ENTER ? DEFPUSH_BUTTON : NORMAL_BUTTON, I18N (quick_widget->u.button.text), quick_widget->u.button.callback)); item.quick_widget = quick_widget; g_array_append_val (widgets, item); blen += item.widget->cols + 1; } /* stop dialog build here */ blen--; quick_widget->widget_type = quick_end; quick_widget--; break; default: break; } } /* adjust dialog width */ quick_dlg->cols = max (quick_dlg->cols, blen + 6); if (have_groupbox) { if (width1 != 0) width1 += 2; if (width2 != 0) width2 += 2; } if (width2 == 0) len = width1 + 6; else { len = width2 * 2 + 7; if (width1 != 0) len = max (len, width1 + 6); } quick_dlg->cols = max (quick_dlg->cols, len); width1 = quick_dlg->cols - 6; width2 = (quick_dlg->cols - 7) / 2; if (quick_dlg->x == -1 || quick_dlg->y == -1) dd = create_dlg (TRUE, 0, 0, y + 3, quick_dlg->cols, dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help, quick_dlg->title, DLG_CENTER | DLG_TRYUP); else dd = create_dlg (TRUE, quick_dlg->y, quick_dlg->x, y + 3, quick_dlg->cols, dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help, quick_dlg->title, DLG_NONE); /* add widgets into the dialog */ x2 = x1 + width2 + 1; g = NULL; two_columns = FALSE; x = (WIDGET (dd)->cols - blen) / 2; for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; int column_width; item = &g_array_index (widgets, quick_widget_item_t, i); column_width = two_columns ? width2 : width1; /* adjust widget width and x position */ switch (item->quick_widget->widget_type) { case quick_label: { quick_widget_t *input = item->quick_widget->u.label.input; if (input != NULL && input->u.input.label_location == input_label_right) { /* location of this label will be adjusted later */ break; } } /* fall through */ case quick_checkbox: case quick_radio: if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; break; case quick_button: if (!put_buttons) { if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; } else { item->widget->x = x; x += item->widget->cols + 1; } break; case quick_input: { Widget *label = WIDGET (INPUT (item->widget)->label); int width = column_width; if (g != NULL) width -= 4; switch (item->quick_widget->u.input.label_location) { case input_label_left: /* label was adjusted before; adjust input line */ item->widget->x = label->x + label->cols + 1 - WIDGET (label->owner)->x; item->widget->cols = width - label->cols - 1; break; case input_label_right: label->x = item->widget->x + item->widget->cols + 1 - WIDGET (item->widget->owner)->x; item->widget->cols = width - label->cols - 1; break; default: if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; item->widget->cols = width; break; } /* forced update internal variables of inpuit line */ input_set_origin (INPUT (item->widget), item->widget->x, item->widget->cols); } break; case quick_start_groupbox: g = GROUPBOX (item->widget); if (item->widget->x != x1) item->widget->x = x2; item->widget->cols = column_width; break; case quick_stop_groupbox: g = NULL; break; case quick_separator: if (item->widget != NULL) { if (g != NULL) { Widget *wg = WIDGET (g); HLINE (item->widget)->auto_adjust_cols = FALSE; item->widget->x = wg->x + 1 - WIDGET (wg->owner)->x; item->widget->cols = wg->cols; } else if (two_columns) { HLINE (item->widget)->auto_adjust_cols = FALSE; if (item->widget->x != x1) item->widget->x = x2; item->widget->x--; item->widget->cols = column_width + 2; } else HLINE (item->widget)->auto_adjust_cols = TRUE; } break; case quick_start_columns: two_columns = TRUE; break; case quick_stop_columns: two_columns = FALSE; break; case quick_buttons: /* several buttons in bottom line */ put_buttons = TRUE; break; default: break; } if (item->widget != NULL) { unsigned long id; /* add widget into dialog */ item->widget->options |= item->quick_widget->options; /* FIXME: cannot reset flags, setup only */ id = add_widget_autopos (dd, item->widget, item->quick_widget->pos_flags, NULL); if (item->quick_widget->id != NULL) *item->quick_widget->id = id; } } while (nskip-- != 0) { dd->current = g_list_next (dd->current); if (dd->current == NULL) dd->current = dd->widgets; } return_val = run_dlg (dd); /* Get the data if we found something interesting */ if (return_val != B_CANCEL) for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; item = &g_array_index (widgets, quick_widget_item_t, i); switch (item->quick_widget->widget_type) { case quick_checkbox: *item->quick_widget->u.checkbox.state = CHECK (item->widget)->state & C_BOOL; break; case quick_input: if ((quick_widget->u.input.flags & 2) != 0) *item->quick_widget->u.input.result = tilde_expand (INPUT (item->widget)->buffer); else *item->quick_widget->u.input.result = g_strdup (INPUT (item->widget)->buffer); break; case quick_radio: *item->quick_widget->u.radio.value = RADIO (item->widget)->sel; break; default: break; } } destroy_dlg (dd); /* destroy input labels created before */ for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; item = &g_array_index (widgets, quick_widget_item_t, i); if (item->quick_widget->widget_type == quick_input) g_free (item->quick_widget->u.input.label); } g_array_free (widgets, TRUE); return return_val; }
static void SDL_BlendLine_ARGB8888(SDL_Surface * dst, int x1, int y1, int x2, int y2, SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, SDL_bool draw_end) { unsigned r, g, b, a, inva; if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { r = DRAW_MUL(_r, _a); g = DRAW_MUL(_g, _a); b = DRAW_MUL(_b, _a); a = _a; } else { r = _r; g = _g; b = _b; a = _a; } inva = (a ^ 0xff); if (y1 == y2) { switch (blendMode) { case SDL_BLENDMODE_BLEND: HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; case SDL_BLENDMODE_ADD: HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: HLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); break; default: HLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); break; } } else if (x1 == x2) { switch (blendMode) { case SDL_BLENDMODE_BLEND: VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; case SDL_BLENDMODE_ADD: VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: VLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); break; default: VLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); break; } } else if (ABS(x1 - x2) == ABS(y1 - y2)) { switch (blendMode) { case SDL_BLENDMODE_BLEND: DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); break; case SDL_BLENDMODE_ADD: DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: DLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); break; default: DLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); break; } } else { switch (blendMode) { case SDL_BLENDMODE_BLEND: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888, draw_end); break; case SDL_BLENDMODE_ADD: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888, draw_end); break; case SDL_BLENDMODE_MOD: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_MOD_ARGB8888, DRAW_SETPIXELXY_MOD_ARGB8888, draw_end); break; default: AALINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888, draw_end); break; } } }
static cb_ret_t hline_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { WHLine *l = HLINE (w); WDialog *h = w->owner; switch (msg) { case MSG_INIT: case MSG_RESIZE: if (l->auto_adjust_cols) { Widget *wo = WIDGET (h); if (((h->flags & DLG_COMPACT) != 0)) { w->x = wo->x; w->cols = wo->cols; } else { w->x = wo->x + 1; w->cols = wo->cols - 2; } } return MSG_HANDLED; case MSG_FOCUS: /* We don't want to get the focus */ return MSG_NOT_HANDLED; case MSG_DRAW: if (l->transparent) tty_setcolor (DEFAULT_COLOR); else tty_setcolor (h->color[DLG_COLOR_NORMAL]); tty_draw_hline (w->y, w->x + 1, ACS_HLINE, w->cols - 2); if (l->auto_adjust_cols) { widget_move (w, 0, 0); tty_print_alt_char (ACS_LTEE, FALSE); widget_move (w, 0, w->cols - 1); tty_print_alt_char (ACS_RTEE, FALSE); } if (l->text != NULL) { int text_width; text_width = str_term_width1 (l->text); widget_move (w, 0, (w->cols - text_width) / 2); tty_print_string (l->text); } return MSG_HANDLED; case MSG_DESTROY: g_free (l->text); return MSG_HANDLED; default: return widget_default_callback (w, sender, msg, parm, data); } }