@@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
50
50
#include " main.h"
51
51
#include " settings.h"
52
52
#include " client.h"
53
+ #include " util/string.h" // for parseColorString()
53
54
54
55
#define MY_CHECKPOS (a,b ) \
55
56
if (v_pos.size() != 2 ) { \
@@ -1575,7 +1576,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element)
1575
1576
1576
1577
video::SColor tmp_color;
1577
1578
1578
- if (parseColor (parts[2 ], tmp_color, false )) {
1579
+ if (parseColorString (parts[2 ], tmp_color, false )) {
1579
1580
BoxDrawSpec spec (pos, geom, tmp_color);
1580
1581
1581
1582
m_boxes.push_back (spec);
@@ -1595,7 +1596,7 @@ void GUIFormSpecMenu::parseBackgroundColor(parserData* data,std::string element)
1595
1596
if (((parts.size () == 1 ) || (parts.size () == 2 )) ||
1596
1597
((parts.size () > 2 ) && (m_formspec_version > FORMSPEC_API_VERSION)))
1597
1598
{
1598
- parseColor (parts[0 ],m_bgcolor,false );
1599
+ parseColorString (parts[0 ],m_bgcolor,false );
1599
1600
1600
1601
if (parts.size () == 2 ) {
1601
1602
std::string fullscreen = parts[1 ];
@@ -1613,20 +1614,20 @@ void GUIFormSpecMenu::parseListColors(parserData* data,std::string element)
1613
1614
if (((parts.size () == 2 ) || (parts.size () == 3 ) || (parts.size () == 5 )) ||
1614
1615
((parts.size () > 5 ) && (m_formspec_version > FORMSPEC_API_VERSION)))
1615
1616
{
1616
- parseColor (parts[0 ], m_slotbg_n, false );
1617
- parseColor (parts[1 ], m_slotbg_h, false );
1617
+ parseColorString (parts[0 ], m_slotbg_n, false );
1618
+ parseColorString (parts[1 ], m_slotbg_h, false );
1618
1619
1619
1620
if (parts.size () >= 3 ) {
1620
- if (parseColor (parts[2 ], m_slotbordercolor, false )) {
1621
+ if (parseColorString (parts[2 ], m_slotbordercolor, false )) {
1621
1622
m_slotborder = true ;
1622
1623
}
1623
1624
}
1624
1625
if (parts.size () == 5 ) {
1625
1626
video::SColor tmp_color;
1626
1627
1627
- if (parseColor (parts[3 ], tmp_color, false ))
1628
+ if (parseColorString (parts[3 ], tmp_color, false ))
1628
1629
m_default_tooltip_bgcolor = tmp_color;
1629
- if (parseColor (parts[4 ], tmp_color, false ))
1630
+ if (parseColorString (parts[4 ], tmp_color, false ))
1630
1631
m_default_tooltip_color = tmp_color;
1631
1632
}
1632
1633
return ;
@@ -1644,7 +1645,7 @@ void GUIFormSpecMenu::parseTooltip(parserData* data, std::string element)
1644
1645
} else if (parts.size () == 4 ) {
1645
1646
std::string name = parts[0 ];
1646
1647
video::SColor tmp_color1, tmp_color2;
1647
- if ( parseColor (parts[2 ], tmp_color1, false ) && parseColor (parts[3 ], tmp_color2, false ) ) {
1648
+ if ( parseColorString (parts[2 ], tmp_color1, false ) && parseColorString (parts[3 ], tmp_color2, false ) ) {
1648
1649
m_tooltips[narrow_to_wide (name.c_str ())] = TooltipSpec (parts[1 ], tmp_color1, tmp_color2);
1649
1650
return ;
1650
1651
}
@@ -3388,67 +3389,3 @@ std::wstring GUIFormSpecMenu::getLabelByID(s32 id)
3388
3389
}
3389
3390
return L" " ;
3390
3391
}
3391
-
3392
- bool GUIFormSpecMenu::parseColor (const std::string &value, video::SColor &color,
3393
- bool quiet)
3394
- {
3395
- const char *hexpattern = NULL ;
3396
- if (value[0 ] == ' #' ) {
3397
- if (value.size () == 9 )
3398
- hexpattern = " #RRGGBBAA" ;
3399
- else if (value.size () == 7 )
3400
- hexpattern = " #RRGGBB" ;
3401
- else if (value.size () == 5 )
3402
- hexpattern = " #RGBA" ;
3403
- else if (value.size () == 4 )
3404
- hexpattern = " #RGB" ;
3405
- }
3406
-
3407
- if (hexpattern) {
3408
- assert (strlen (hexpattern) == value.size ());
3409
- video::SColor outcolor (255 , 255 , 255 , 255 );
3410
- for (size_t pos = 0 ; pos < value.size (); ++pos) {
3411
- // '#' in the pattern means skip that character
3412
- if (hexpattern[pos] == ' #' )
3413
- continue ;
3414
-
3415
- // Else assume hexpattern[pos] is one of 'R' 'G' 'B' 'A'
3416
- // Read one or two digits, depending on hexpattern
3417
- unsigned char c1, c2;
3418
- if (hexpattern[pos+1 ] == hexpattern[pos]) {
3419
- // Two digits, e.g. hexpattern == "#RRGGBB"
3420
- if (!hex_digit_decode (value[pos], c1) ||
3421
- !hex_digit_decode (value[pos+1 ], c2))
3422
- goto fail;
3423
- ++pos;
3424
- }
3425
- else {
3426
- // One digit, e.g. hexpattern == "#RGB"
3427
- if (!hex_digit_decode (value[pos], c1))
3428
- goto fail;
3429
- c2 = c1;
3430
- }
3431
- u32 colorpart = ((c1 & 0x0f ) << 4 ) | (c2 & 0x0f );
3432
-
3433
- // Update outcolor with newly read color part
3434
- if (hexpattern[pos] == ' R' )
3435
- outcolor.setRed (colorpart);
3436
- else if (hexpattern[pos] == ' G' )
3437
- outcolor.setGreen (colorpart);
3438
- else if (hexpattern[pos] == ' B' )
3439
- outcolor.setBlue (colorpart);
3440
- else if (hexpattern[pos] == ' A' )
3441
- outcolor.setAlpha (colorpart);
3442
- }
3443
-
3444
- color = outcolor;
3445
- return true ;
3446
- }
3447
-
3448
- // Optionally, named colors could be implemented here
3449
-
3450
- fail:
3451
- if (!quiet)
3452
- errorstream<<" Invalid color: \" " <<value<<" \" " <<std::endl;
3453
- return false ;
3454
- }
0 commit comments