trectangle::trectangle(const config& cfg) : x_(cfg["x"]) , y_(cfg["y"]) , w_(cfg["w"]) , h_(cfg["h"]) , border_thickness_(cfg["border_thickness"]) , border_color_(decode_color(cfg["border_color"])) , fill_color_(decode_color(cfg["fill_color"])) { /*WIKI * @page = GUICanvasWML * * == Rectangle == * @begin{tag}{name="rectangle"}{min="0"}{max="-1"} * * Definition of a rectangle. When drawing a rectangle it doesn't get blended on * the surface but replaces the pixels instead. A blitting flag might be added * later if needed. * * Keys: * @begin{table}{config} * x & f_unsigned & 0 & The x coordinate of the top left corner. $ * y & f_unsigned & 0 & The y coordinate of the top left corner. $ * w & f_unsigned & 0 & The width of the rectangle. $ * h & f_unsigned & 0 & The height of the rectangle. $ * border_thickness & unsigned & 0 & * The thickness of the border if the * thickness is zero it's not drawn. $ * border_color & color & "" & The color of the border if empty it's * not drawn. $ * fill_color & color & "" & The color of the interior if omitted * it's not drawn. $ * debug & string & "" & Debug message to show upon creation * this message is not stored. $ * @end{table} * @end{tag}{name="rectangle"} * Variables: * See [[#general_variables|Line]]. * */ if(border_color_ == 0) { border_thickness_ = 0; } const std::string& debug = (cfg["debug"]); if(!debug.empty()) { DBG_GUI_P << "Rectangle: found debug message '" << debug << "'.\n"; } }
tbuilder_control::tbuilder_control(const config& cfg) : tbuilder_widget(cfg) , id(cfg["id"]) , definition(cfg["definition"]) , linked_group(cfg["linked_group"]) , label(cfg["label"].t_str()) , tooltip(cfg["tooltip"].t_str()) , help(cfg["help"].t_str()) , use_tooltip_on_label_overflow(true) #ifndef LOW_MEM , debug_border_mode(cfg["debug_border_mode"]) , debug_border_color(decode_color(cfg["debug_border_colour"])) #endif { if(definition.empty()) { definition = "default"; } if(!(help.empty() || !tooltip.empty())) { /** @deprecated 1.9.7. */ lg::wml_error << "A widget with a helptip without a tooltip is " << "deprecated, support will be removed in 1.9.7.\n"; } // VALIDATE(help.empty() || !tooltip.empty() // , _("Found a widget with a helptip and without a tooltip.") // , (formatter() << "id '" << id << // << "' label '" << label << // << "' helptip '" << help << "'.").str()); DBG_GUI_P << "Window builder: found control with id '" << id << "' and definition '" << definition << "'.\n"; }
tbuilder_control::tbuilder_control(const config& cfg) : tbuilder_widget(cfg) , id(cfg["id"]) , definition(cfg["definition"]) , linked_group(cfg["linked_group"]) , label(cfg["label"].t_str()) , tooltip(cfg["tooltip"].t_str()) , help(cfg["help"].t_str()) , use_tooltip_on_label_overflow(true) #ifndef LOW_MEM , debug_border_mode(cfg["debug_border_mode"]) , debug_border_color(decode_color(cfg["debug_border_color"])) #endif { if(definition.empty()) { definition = "default"; } VALIDATE_WITH_DEV_MESSAGE(help.empty() || !tooltip.empty() , _("Found a widget with a helptip and without a tooltip.") , (formatter() << "id '" << id << "' label '" << label << "' helptip '" << help << "'.").str()); DBG_GUI_P << "Window builder: found control with id '" << id << "' and definition '" << definition << "'.\n"; }
tbuilder_widget::tbuilder_widget(const config& cfg) : id(cfg["id"]) , linked_group(cfg["linked_group"]) #ifndef LOW_MEM , debug_border_mode(cfg["debug_border_mode"]) , debug_border_color(decode_color(cfg["debug_border_color"])) #endif { }
scheme_language_rep::scheme_language_rep (string name): language_rep (name), colored ("") { eval ("(use-modules (utils misc tm-keywords))"); list<string> l= as_list_string (eval ("(map symbol->string highlight-any)")); while (!is_nil (l)) { colored (l->item)= decode_color ("scheme", encode_color ("keyword")); l= l->next; } }
static rgba_group parse_color_line( struct pike_string *cn, int sl ) { int toggle = 0; struct buffer s; rgba_group res; int i; for(i=sl; i<cn->len; i++) { switch(cn->str[i]) { case ' ': case '\t': if(toggle==4) { s.len = i-(s.str-cn->str); return decode_color(&s); } else if(toggle>=2) toggle=3; else toggle=0; break; case 'c': if(!toggle) { toggle=2; break; } /* FALLTHRU */ default: if(toggle == 3) { s.str = cn->str+i; toggle = 4; } else if(toggle != 4) toggle=1; } } if(toggle==4) { s.len = cn->len-(s.str-cn->str); return decode_color(&s); } res.r = res.g = res.b = 0; res.alpha = 255; return res; }
struct background *get_background(unsigned char *bg, unsigned char *bgcolor) { struct background *b; struct rgb r; b = mem_alloc(sizeof(struct background)); /* !!! FIXME: background image */ { b->img = 0; if (bgcolor && !decode_color(bgcolor, &r)) { b->u.sRGB=(r.r << 16) + (r.g << 8) + r.b; } else { b->u.sRGB=(d_opt->default_bg.r << 16) + (d_opt->default_bg.g << 8) + d_opt->default_bg.b; } } return b; }
tbuilder_control::tbuilder_control(const config& cfg) : tbuilder_widget(cfg) , id(cfg["id"]) , definition(cfg["definition"]) , linked_group(cfg["linked_group"]) , label(cfg["label"].t_str()) , tooltip(cfg["tooltip"].t_str()) , help(cfg["help"].t_str()) , use_tooltip_on_label_overflow(true) #ifndef LOW_MEM , debug_border_mode(cfg["debug_border_mode"]) , debug_border_color(decode_color(cfg["debug_border_colour"])) #endif { if(definition.empty()) { definition = "default"; } DBG_GUI_P << "Window builder: found control with id '" << id << "' and definition '" << definition << "'.\n"; }
tcircle::tcircle(const config& cfg) : x_(cfg["x"]) , y_(cfg["y"]) , radius_(cfg["radius"]) , color_(decode_color(cfg["color"])) { /*WIKI * @page = GUICanvasWML * * == Circle == * @begin{tag}{name="circle"}{min="0"}{max="-1"} * * Definition of a circle. When drawing a circle it doesn't get blended on * the surface but replaces the pixels instead. A blitting flag might be * added later if needed. * * Keys: * @begin{table}{config} * x & f_unsigned & 0 & The x coordinate of the centre. $ * y & f_unsigned & 0 & The y coordinate of the centre. $ * radius & f_unsigned & 0 & The radius of the circle if 0 nothing is * drawn. $ * color & color & "" & The color of the circle. $ * debug & string & "" & Debug message to show upon creation this * message is not stored. $ * @end{table} * @end{tag}{name="circle"} * Variables: * See [[#general_variables|Line]]. * * Drawing outside the area will result in unpredictable results including * crashing. (That should be fixed, when encountered.) */ const std::string& debug = (cfg["debug"]); if(!debug.empty()) { DBG_GUI_P << "Circle: found debug message '" << debug << "'.\n"; } }
string scheme_language_rep::get_color (tree t, int start, int end) { static string none= ""; if (start >= end) return none; string s= t->label; for (int i= max (0, start-1000); i <= start; i++) switch (s[i]) { case ';': if (i>1 && s[i-1] == '\\' && s[i-2] == '#') break; return decode_color ("scheme", encode_color ("comment")); case '\042': if (i>1 && s[i-1] == '\\' && s[i-2] == '#') break; i++; while (i <= start && s[i] != '\042') if (s[i] == '\\' && i < start) i += 2; else i++; if (i >= start) return decode_color ("scheme", encode_color ("constant_string")); break; } if (is_numeric (s[start])) return decode_color ("scheme", encode_color ("constant_number")); if (s[start] == '\042' || s[start] == '#') return decode_color ("scheme", encode_color ("constant_string")); if (s[start] == ':') return decode_color ("scheme", encode_color ("declare_category")); string r= s (start, end); if (!colored->contains (r)) { colored (r)= ""; if (as_bool (call ("defined?", symbol_object (tm_decode (r))))) colored (r)= decode_color ("scheme", encode_color ("variable_identifier")); } return colored[r]; }
tline::tline(const config& cfg) : x1_(cfg["x1"]) , y1_(cfg["y1"]) , x2_(cfg["x2"]) , y2_(cfg["y2"]) , color_(decode_color(cfg["color"])) , thickness_(cfg["thickness"]) { /*WIKI * @page = GUICanvasWML * * == Line == * @begin{tag}{name="line"}{min="0"}{max="-1"} * Definition of a line. When drawing a line it doesn't get blended on the * surface but replaces the pixels instead. A blitting flag might be added later * if needed. * * Keys: * @begin{table}{config} * x1 & f_unsigned & 0 & The x coordinate of the startpoint. $ * y1 & f_unsigned & 0 & The y coordinate of the startpoint. $ * x2 & f_unsigned & 0 & The x coordinate of the endpoint. $ * y2 & f_unsigned & 0 & The y coordinate of the endpoint. $ * color & color & "" & The color of the line. $ * thickness & unsigned & 0 & The thickness of the line if 0 nothing * is drawn. $ * debug & string & "" & Debug message to show upon creation * this message is not stored. $ * @end{table} * @end{tag}{name="line"} * * <span id="general_variables">Variables:</span>. * @begin{table}{formula} * width & unsigned & The width of the canvas. $ * height & unsigned & The height of the canvas. $ * text & tstring & The text to render on the widget. $ * text_maximum_width & unsigned & The maximum width available for the text * on the widget. $ * text_maximum_height & unsigned & The maximum height available for the text * on the widget. $ * text_wrap_mode & int & When the text doesn't fit in the * available width there are several ways * to fix that. This variable holds the * best method. (NOTE this is a 'hidden' * variable meant to copy state from a * widget to its canvas so there's no * reason to use this variable and thus * its values are not listed and might * change without further notice.) $ * text_alignment & h_align & The way the text is aligned inside the * canvas. $ *@end{table} * * The size variables are copied to the window and will be determined at * runtime. This is needed since the main window can be resized and the dialog * needs to resize accordingly. The following variables are available: * @begin{table}{formula} * screen_width & unsigned & The usable width of the Wesnoth main * window. $ * screen_height & unsigned & The usable height of the Wesnoth main * window. $ * gamemap_width & unsigned & The usable width of the Wesnoth gamemap, * if no gamemap shown it's the same value as * screen_width. $ * gamemap_height & unsigned & The usable height of the Wesnoth gamemap, * if no gamemap shown it's the same value as * screen_height. $ * @end{table} * * Note when drawing the valid coordinates are:<br> * 0 -> width - 1 <br> * 0 -> height -1 * * Drawing outside this area will result in unpredictable results including * crashing. (That should be fixed, when encountered.) */ /*WIKI - unclassified * This code can be used by a parser to generate the wiki page * structure * [tag name] * param type_info description * * param Name of the parameter. * * type_info = ( type = default_value) The info about a optional parameter. * type_info = ( type ) The info about a mandatory parameter * type_info = [ type_info ] The info about a conditional parameter * description should explain the reason. * * description Description of the parameter. * * * * * Formulas are a function between brackets, that way the engine can see whether * there is standing a plain number or a formula eg: * 0 A value of zero * (0) A formula returning zero * * When formulas are available the text should state the available variables * which are available in that function. */ /*WIKI * @page = GUIVariable * * {{Autogenerated}} * * = Variables = * * In various parts of the GUI there are several variables types in use. This * page describes them. * * == Simple types == * * The simple types are types which have one value or a short list of options. * * @begin{table}{variable_types} * unsigned & Unsigned number (positive whole numbers * and zero). $ * f_unsigned & Unsigned number or formula returning an * unsigned number. $ * int & Signed number (whole numbers). $ * f_int & Signed number or formula returning an * signed number. $ * bool & A boolean value accepts the normal * values as the rest of the game. $ * f_bool & Boolean value or a formula returning a * boolean value. $ * string & A text. $ * tstring & A translatable string. $ * f_tstring & Formula returning a translatable string. $ * * color & A string which contains the color, this * a group of 4 numbers between 0 and 255 * separated by a comma. The numbers are red * component, green component, blue * component and alpha. A color of 0 is not * available. An alpha of 255 is fully * transparent. Omitted values are set to 0. $ * * font_style & A string which contains the style of the * font: * @* normal normal font * @* bold bold font * @* italic italic font * @* underline underlined font * @-Since SDL has problems combining these * styles only one can be picked. Once SDL * will allow multiple options, this type * will be transformed to a comma separated * list. If empty we default to the normal * style. Since the render engine is * replaced by Pango markup this field will * change later on. Note widgets that allow * marked up text can use markup to change * the font style. $ * * v_align & Vertical alignment; how an item is * aligned vertically in the available * space. Possible values: * @* top aligned at the top * @* bottom aligned at the bottom * @* center centered * @-When nothing is set or an another * value as in the list the item is * centered. $ * * h_align & Horizontal alignment; how an item is * aligned horizontal in the available * space. Possible values: * @* left aligned at the left side * @* right aligned at the right side * @* center centered $ * * f_h_align & A horizontal alignment or a formula * returning a horizontal alignment. $ * * border & Comma separated list of borders to use. * Possible values: * @* left border at the left side * @* right border at the right side * @* top border at the top * @* bottom border at the bottom * @* all alias for "left, right, top, * bottom" $ * * scrollbar_mode & How to show the scrollbar of a widget. * Possible values: * @* always The scrollbar is always * shown, regardless whether it's required * or not. * @* never The scrollbar is never * shown, even not when needed. (Note when * setting this mode dialogs might * not properly fit anymore). * @* auto Shows the scrollbar when * needed. The widget will reserve space for * the scrollbar, but only show when needed. * @* initial_auto Like auto, but when the * scrollbar is not needed the space is not * reserved. * @-Use auto when the list can be changed * dynamically eg the game list in the * lobby. For optimization you can also * use auto when you really expect a * scrollbar, but don't want it to be shown * when not needed eg the language list * will need a scrollbar on most screens. $ * * resize_mode & Determines how an image is resized. * Possible values: * @* scale The image is scaled. * @* stretch The first row or column * of pixels is copied over the entire * image. (Can only be used to scale resize * in one direction, else falls * back to scale.) * @* tile The image is placed * several times until the entire surface * is filled. The last images are * truncated. $ * @end{table} * @allow{type}{name="unsigned"}{value="^\d+$"} * @allow{type}{name="f_unsigned"}{value="^.+$"} * @allow{type}{name="int"}{value="^-?\d+$"} * @allow{type}{name="f_int"}{value="^.*$"} * @allow{type}{name="bool"}{value="^true|false|yes|no$"} * @allow{type}{name="f_bool"}{value="^.*$"} * @allow{type}{name="string"}{value="^.*$"} * @allow{type}{name="t_string"}{value="^_?.*$"} * @allow{type}{name="f_string"}{value="^.*$"} * @allow{type}{name="f_tstring"}{value="^_?.*$"} * * @allow{type}{name="color"}{value="^(?:2[0-5][0-5]|[01]?\d?\d)[.,]\s*(?:2[0-5][0-5]|[01]?\d?\d)[.,]\s*(?:2[0-5][0-5]|[01]?\d?\d)[.,]\s*(?:2[0-5][0-5]|[01]?\d?\d)$"} * * @allow{type}{name="font_style"}{value="^(normal|bold|italic|underline)?$"} * @allow{type}{name="v_align"}{value="^top|bottom|center$"} * @allow{type}{name="h_align"}{value="^left|right|center$"} * @allow{type}{name="f_h_align"}{value="^.*$"} * @allow{type}{name="border"}{value="^(top|bottom|left|right|all)?(,\s*(top|bottom|left|right|all))*$"} * @allow{type}{name="scrollbar_mode"}{value="^always|never|auto|initial_auto$"} * @allow{type}{name="resize_mode"}{value="^scale|stretch|tile$"} * * @remove{type}{name="section"} * @remove{type}{name="config"} * @remove{type}{name="grid"} * == Section types == * * For more complex parts, there are sections. Sections contain of several * lines of WML and can have sub sections. For example a grid has sub sections * which contain various widgets. Here's the list of sections. * * @begin{table}{variable_types} * section & A generic section. The documentation * about the section should describe the * section in further detail. $ * * grid & A grid contains several widgets. (TODO * add link to generic grid page.) $ * @end{table} */ const std::string& debug = (cfg["debug"]); if(!debug.empty()) { DBG_GUI_P << "Line: found debug message '" << debug << "'.\n"; } }
ttext::ttext(const config& cfg) : x_(cfg["x"]) , y_(cfg["y"]) , w_(cfg["w"]) , h_(cfg["h"]) , font_size_(cfg["font_size"]) , font_style_(decode_font_style(cfg["font_style"])) , text_alignment_(cfg["text_alignment"]) , color_(decode_color(cfg["color"])) , text_(cfg["text"]) , text_markup_(cfg["text_markup"], false) , maximum_width_(cfg["maximum_width"], -1) , maximum_height_(cfg["maximum_height"], -1) { /*WIKI * @page = GUICanvasWML * * == Text == * @begin{tag}{name="text"}{min="0"}{max="-1"} * Definition of text. * * Keys: * @begin{table}{config} * x & f_unsigned & 0 & The x coordinate of the top left corner. $ * y & f_unsigned & 0 & The y coordinate of the top left corner. $ * w & f_unsigned & 0 & The width of the text's bounding * rectangle. $ * h & f_unsigned & 0 & The height of the text's bounding * rectangle. $ * font_size & unsigned & & The size of the text font. $ * font_style & font_style & "" & The style of the text. $ * text_alignment & f_h_align & "left" & * The alignment of the text. $ * color & color & "" & The color of the text. $ * text & f_tstring & "" & The text to draw (translatable). $ * text_markup & f_bool & false & Can the text have mark-up? $ * maximum_width & f_int & -1 & The maximum width the text is allowed to * be. $ * maximum_height & f_int & -1 & The maximum height the text is allowed * to be. $ * debug & string & "" & Debug message to show upon creation * this message is not stored. $ * @end{table} * @end{tag}{name="text"} * NOTE alignment could only be done with the formulas, but now with the * text_alignment flag as well, older widgets might still use the formulas and * not all widgets may expose the text alignment yet and when exposed not use * it yet. * * Variables: * @begin{table}{formula} * text_width & unsigned & The width of the rendered text. $ * text_height & unsigned & The height of the rendered text. $ * @end{table} * Also the general variables are available, see [[#general_variables|Line]]. * @end{parent}{name="generic/state/draw/"} */ VALIDATE(font_size_, _("Text has a font size of 0.")); const std::string& debug = (cfg["debug"]); if(!debug.empty()) { DBG_GUI_P << "Text: found debug message '" << debug << "'.\n"; } }
void decode_sequence(int r, int g, int b) { decode_color(sequence, g); decode_color(&sequence[2*8], r); decode_color(&sequence[2*8*2], b); }
static void decode_color_64(Uchar *data, Flic *flic) { decode_color(data, flic, screen_put_colors_64); }
int css_parse_color_value(struct css_property_info *propinfo, union css_property_value *value, struct scanner *scanner) { struct scanner_token *token = get_scanner_token(scanner); assert(propinfo->value_type == CSS_VT_COLOR); if (token->type == CSS_TOKEN_RGB) { /* RGB function */ int shift; token = get_next_scanner_token(scanner); /* First color component is shifted 16, next is shifted 8 and * last is not shifted. */ for (shift = 16; token && shift >= 0; shift -= 8) { /* The first two args are terminated by ',' and the * last one by ')'. */ unsigned char paskynator = shift ? ',' : ')'; const unsigned char *nstring = token->string; int part; /* Are the current and next token valid? */ if ((token->type != CSS_TOKEN_NUMBER && token->type != CSS_TOKEN_PERCENTAGE) || !check_next_scanner_token(scanner, paskynator)) return 0; /* Parse the digit */ part = strtol(token->string, (char **) &nstring, 10); if (token->string == nstring) return 0; /* Adjust percentage values */ if (token->type == CSS_TOKEN_PERCENTAGE) { int_bounds(&part, 0, 100); part *= 255; part /= 100; } /* Adjust color component value and add it */ int_bounds(&part, 0, 255); value->color |= part << shift; /* Paskynate the token arg and separator */ token = skip_css_tokens(scanner, paskynator); } return 1; } /* Just a color value we already know how to parse. */ if (token->type != CSS_TOKEN_IDENT && token->type != CSS_TOKEN_HEX_COLOR) return 0; if (decode_color(token->string, token->length, &value->color) < 0) { return 0; } skip_css_tokens(scanner, token->type); return 1; }