1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

support for predefined colors

This commit is contained in:
Laserlicht 2023-09-13 02:04:59 +02:00
parent f776422c67
commit f5505c9f6d
4 changed files with 224 additions and 13 deletions

View File

@ -154,11 +154,13 @@ void CTextContainer::blitLine(Canvas & to, Rect destRect, std::string what)
delimitersCount *= f->getStringWidth(delimeters)/2;
std::smatch match;
std::regex expr("\\{(#[0-9a-fA-F]{6})");
std::regex expr("\\{(.*?)\\|");
std::string::const_iterator searchStart( what.cbegin() );
while(std::regex_search(searchStart, what.cend(), match, expr))
{
delimitersCount += f->getStringWidth(match[1].str());
std::string colorText = match[1].str();
if(CMessage::parseColor(colorText).a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
delimitersCount += f->getStringWidth(colorText + "|");
searchStart = match.suffix().first;
}
@ -201,15 +203,19 @@ void CTextContainer::blitLine(Canvas & to, Rect destRect, std::string what)
if(currDelimeter % 2) // Enclosed in {} text - set to yellow or defined color
{
std::smatch match;
std::regex expr("^#([0-9a-fA-F]{6})");
std::regex expr("^(.*?)\\|");
if(std::regex_search(toPrint, match, expr))
{
ui8 rgb[3] = {0, 0, 0};
std::string tmp = boost::algorithm::unhex(match[1].str());
std::copy(tmp.begin(), tmp.end(), rgb);
toPrint = toPrint.substr(7, toPrint.length() - 6);
to.drawText(where, font, ColorRGBA(rgb[0], rgb[1], rgb[2]), ETextAlignment::TOPLEFT, toPrint);
std::string colorText = match[1].str();
ColorRGBA color = CMessage::parseColor(colorText);
if(color.a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
{
toPrint = toPrint.substr(colorText.length() + 1, toPrint.length() - colorText.length());
to.drawText(where, font, color, ETextAlignment::TOPLEFT, toPrint);
}
else
to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint);
}
else
to.drawText(where, font, Colors::YELLOW, ETextAlignment::TOPLEFT, toPrint);

View File

@ -14,6 +14,7 @@
#include "../CGameInfo.h"
#include "../../lib/CGeneralTextHandler.h"
#include "../../lib/TextOperations.h"
#include "../../lib/JsonNode.h"
#include "../windows/InfoWindows.h"
#include "../widgets/Buttons.h"
@ -152,12 +153,16 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi
opened=true;
std::smatch match;
std::regex expr("^\\{(#[0-9a-fA-F]{6})$");
std::string tmp = text.substr(currPos, 8);
std::regex expr("^\\{(.*?)\\|");
std::string tmp = text.substr(currPos);
if(std::regex_search(tmp, match, expr))
{
color = match[1].str();
currPos += 7;
std::string colorText = match[1].str();
if(CMessage::parseColor(colorText).a != Colors::TRANSPARENCY.ALPHA_TRANSPARENT)
{
color = colorText + "|";
currPos += colorText.length() + 1;
}
}
}
else if (text[currPos]=='}')
@ -222,6 +227,32 @@ std::vector<std::string> CMessage::breakText( std::string text, size_t maxLineWi
return ret;
}
ColorRGBA CMessage::parseColor(std::string text)
{
std::smatch match;
std::regex expr("^#([0-9a-fA-F]{6})$");
ui8 rgb[3] = {0, 0, 0};
if(std::regex_search(text, match, expr))
{
std::string tmp = boost::algorithm::unhex(match[1].str());
std::copy(tmp.begin(), tmp.end(), rgb);
return ColorRGBA(rgb[0], rgb[1], rgb[2]);
}
const JsonNode config(JsonPath::builtin("CONFIG/textColors"));
auto colors = config["colors"].Struct();
for(auto & color : colors) {
if(boost::algorithm::to_lower_copy(color.first) == boost::algorithm::to_lower_copy(text))
{
std::string tmp = boost::algorithm::unhex(color.second.String());
std::copy(tmp.begin(), tmp.end(), rgb);
return ColorRGBA(rgb[0], rgb[1], rgb[2]);
}
}
return Colors::TRANSPARENCY;
}
std::string CMessage::guessHeader(const std::string & msg)
{
size_t begin = 0;

View File

@ -15,6 +15,7 @@
struct SDL_Surface;
class CInfoWindow;
class CComponent;
class ColorRGBA;
/// Class which draws formatted text messages and generates chat windows
@ -32,6 +33,9 @@ public:
/// split text in lines
static std::vector<std::string> breakText(std::string text, size_t maxLineWidth, EFonts font);
/// parse color
static ColorRGBA parseColor(std::string text);
/// Try to guess a header of a message
static std::string guessHeader(const std::string & msg);

170
config/textColors.json Normal file
View File

@ -0,0 +1,170 @@
{
"colors": {
"r": "F80000",
"g": "00FC00",
"b": "0000F8",
"y": "F8FC00",
"o": "F88000",
"p": "F800F8",
"c": "00FCF8",
"k": "000000",
"w": "FFFFFF",
"Regular": "F8F0D8",
"Highlight": "E8D478",
"H3Red": "F80000",
"H3Cyan": "00FCF8",
"H3Green": "00FC00",
"H3Blue": "0000F8",
"H3Yellow": "F8FC00",
"H3Orange": "F88000",
"H3Purple": "F800F8",
"H3Pink": "C07888",
"AliceBlue": "F0F8FF",
"AntiqueWhite": "FAEBD7",
"Aqua": "00FFFF",
"Aquamarine": "7FFFD4",
"Azure": "F0FFFF",
"Beige": "F5F5DC",
"Bisque": "FFE4C4",
"Black": "000000",
"BlanchedAlmond": "FFEBCD",
"Blue": "0000FF",
"BlueViolet": "8A2BE2",
"Brown": "A52A2A",
"BurlyWood": "DEB887",
"CadetBlue": "5F9EA0",
"Chartreuse": "7FFF00",
"Chocolate": "D2691E",
"Coral": "FF7F50",
"CornflowerBlue": "6495ED",
"Cornsilk": "FFF8DC",
"Crimson": "DC143C",
"Cyan": "00FFFF",
"DarkBlue": "00008B",
"DarkCyan": "008B8B",
"DarkGoldenRod": "B8860B",
"DarkGray": "A9A9A9",
"DarkGrey": "A9A9A9",
"DarkGreen": "A9A9A9",
"DarkKhaki": "006400",
"DarkMagenta": "8B008B",
"DarkOliveGreen": "556B2F",
"Darkorange": "FF8C00",
"DarkOrchid": "9932CC",
"DarkRed": "8B0000",
"DarkSalmon": "E9967A",
"DarkSeaGreen": "8FBC8F",
"DarkSlateBlue": "483D8B",
"DarkSlateGray": "2F4F4F",
"DarkSlateGrey": "2F4F4F",
"DarkTurquoise": "00CED1",
"DarkViolet": "9400D3",
"DeepPink": "FF1493",
"DeepSkyBlue": "00BFFF",
"DimGray": "696969",
"DimGrey": "696969",
"DodgerBlue": "1E90FF",
"FireBrick": "B22222",
"FloralWhite": "FFFAF0",
"ForestGreen": "228B22",
"Fuchsia": "FF00FF",
"Gainsboro": "DCDCDC",
"GhostWhite": "F8F8FF",
"Gold": "FFD700",
"GoldenRod": "DAA520",
"Gray": "808080",
"Grey": "808080",
"Green": "008000",
"GreenYellow": "ADFF2F",
"HoneyDew": "F0FFF0",
"HotPink": "FF69B4",
"IndianRed": "CD5C5C",
"Indigo": "4B0082",
"Ivory": "FFFFF0",
"Khaki": "F0E68C",
"Lavender": "E6E6FA",
"LavenderBlush": "FFF0F5",
"LawnGreen": "7CFC00",
"LemonChiffon": "FFFACD",
"LightBlue": "ADD8E6",
"LightCoral": "F08080",
"LightCyan": "E0FFFF",
"LightGoldenRodYellow": "FAFAD2",
"LightGray": "D3D3D3",
"LightGrey": "D3D3D3",
"LightGreen": "90EE90",
"LightPink": "FFB6C1",
"LightSalmon": "FFA07A",
"LightSeaGreen": "20B2AA",
"LightSkyBlue": "87CEFA",
"LightSlateGray": "778899",
"LightSlateGrey": "778899",
"LightSteelBlue": "B0C4DE",
"LightYellow": "FFFFE0",
"Lime": "00FF00",
"LimeGreen": "32CD32",
"Linen": "FAF0E6",
"Magenta": "FF00FF",
"Maroon": "800000",
"MediumAquaMarine": "66CDAA",
"MediumBlue": "0000CD",
"MediumOrchid": "BA55D3",
"MediumPurple": "9370D8",
"MediumSeaGreen": "3CB371",
"MediumSlateBlue": "7B68EE",
"MediumSpringGreen": "00FA9A",
"MediumTurquoise": "48D1CC",
"MediumVioletRed": "C71585",
"MidnightBlue": "191970",
"MintCream": "F5FFFA",
"MistyRose": "FFE4E1",
"Moccasin": "FFE4B5",
"NavajoWhite": "FFDEAD",
"Navy": "000080",
"OldLace": "FDF5E6",
"Olive": "808000",
"OliveDrab": "6B8E23",
"Orange": "FFA500",
"OrangeRed": "FF4500",
"Orchid": "DA70D6",
"PaleGoldenRod": "EEE8AA",
"PaleGreen": "98FB98",
"PaleTurquoise": "AFEEEE",
"PaleVioletRed": "D87093",
"PapayaWhip": "FFEFD5",
"PeachPuff": "FFDAB9",
"Peru": "CD853F",
"Pink": "FFC0CB",
"Plum": "DDA0DD",
"PowderBlue": "B0E0E6",
"Purple": "800080",
"Red": "FF0000",
"RosyBrown": "BC8F8F",
"RoyalBlue": "4169E1",
"SaddleBrown": "8B4513",
"Salmon": "FA8072",
"SandyBrown": "F4A460",
"SeaGreen": "2E8B57",
"SeaShell": "FFF5EE",
"Sienna": "A0522D",
"Silver": "C0C0C0",
"SkyBlue": "87CEEB",
"SlateBlue": "6A5ACD",
"SlateGray": "708090",
"SlateGrey": "708090",
"Snow": "FFFAFA",
"SpringGreen": "00FF7F",
"SteelBlue": "4682B4",
"Tan": "D2B48C",
"Teal": "008080",
"Thistle": "D8BFD8",
"Tomato": "FF6347",
"Turquoise": "40E0D0",
"Violet": "EE82EE",
"Wheat": "F5DEB3",
"White": "FFFFFF",
"WhiteSmoke": "F5F5F5",
"Yellow": "FFFF00",
"YellowGreen": "9ACD32"
}
}