Skip to content

Commit

Permalink
Fixed problem with 256-colour ANSI sequences
Browse files Browse the repository at this point in the history
  • Loading branch information
nickgammon committed Oct 18, 2014
1 parent d4e43a2 commit 97eeb41
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 48 deletions.
48 changes: 37 additions & 11 deletions ansi.cpp
Expand Up @@ -323,33 +323,59 @@ COLORREF iBackColour = pOldStyle->iBackColour;
CAction * pAction = pOldStyle->pAction;


// if they are not in RGB mode, have to switch to it
// if they are in custom mode, we'll have to switch to RGB mode

if ((iFlags & COLOURTYPE) != COLOUR_RGB)
if ((iFlags & COLOURTYPE) == COLOUR_CUSTOM)
{
GetStyleRGB (pOldStyle, iForeColour, iBackColour);
iFlags &= ~COLOURTYPE; // clear custom bits
iFlags |= COLOUR_RGB;
} // end of switching to RGB mode

// change foreground or background as appropriate (honouring inverse flag)
switch (m_phase)


// if they are in RGB mode we have to do the RGB conversion now, not at display time
if ((iFlags & COLOURTYPE) == COLOUR_RGB)
{
switch (m_phase)
{
case HAVE_FOREGROUND_256_FINISH:
if (iFlags & INVERSE)
iBackColour = xterm_256_colours [iCode];
else
iForeColour = xterm_256_colours [iCode];
break;

case HAVE_BACKGROUND_256_FINISH:
if (iFlags & INVERSE)
iForeColour = xterm_256_colours [iCode];
else
iBackColour = xterm_256_colours [iCode];
break;
} // end of switch
} // end style in RGB
else
{
case HAVE_FOREGROUND_256_FINISH:
// must be in ANSI mode
switch (m_phase)
{
case HAVE_FOREGROUND_256_FINISH:
if (iFlags & INVERSE)
iBackColour = xterm_256_colours [iCode];
iBackColour = iCode;
else
iForeColour = xterm_256_colours [iCode];
iForeColour = iCode;
break;

case HAVE_BACKGROUND_256_FINISH:
case HAVE_BACKGROUND_256_FINISH:
if (iFlags & INVERSE)
iForeColour = xterm_256_colours [iCode];
iForeColour = iCode;
else
iBackColour = xterm_256_colours [iCode];
iBackColour = iCode;
break;
} // end of switch

} // end of switch on m_phase

}

m_phase = DOING_CODE;

Expand Down
26 changes: 20 additions & 6 deletions dialogs/TextAttributesDlg.cpp
Expand Up @@ -215,12 +215,26 @@ void CTextAttributesDlg::OnLineInfo()
switch (pStyle->iFlags & COLOURTYPE)
{
case COLOUR_ANSI:
INFO (TFormat (" Foreground colour ANSI : %i (%s)",
pStyle->iForeColour,
sColours [pStyle->iForeColour & 7]));
INFO (TFormat (" Background colour ANSI : %i (%s)",
pStyle->iBackColour,
sColours [pStyle->iBackColour & 7]));
if (pStyle->iForeColour >= 8)
INFO (TFormat (" Foreground colour 256-ANSI : R=%i, G=%i, B=%i",
GetRValue (xterm_256_colours [pStyle->iForeColour]),
GetGValue (xterm_256_colours [pStyle->iForeColour]),
GetBValue (xterm_256_colours [pStyle->iForeColour])
));
else
INFO (TFormat (" Foreground colour ANSI : %i (%s)",
pStyle->iForeColour,
sColours [pStyle->iForeColour & 7]));
if (pStyle->iBackColour >= 8)
INFO (TFormat (" Background colour 256-ANSI : R=%i, G=%i, B=%i",
GetRValue (xterm_256_colours [pStyle->iBackColour]),
GetGValue (xterm_256_colours [pStyle->iBackColour]),
GetBValue (xterm_256_colours [pStyle->iBackColour])
));
else
INFO (TFormat (" Background colour ANSI : %i (%s)",
pStyle->iBackColour,
sColours [pStyle->iBackColour & 7]));
break;
case COLOUR_CUSTOM:
INFO (TFormat (" Custom colour: %i (%s)",
Expand Down
59 changes: 44 additions & 15 deletions doc.cpp
Expand Up @@ -5230,8 +5230,8 @@ int iForeground,
}
else
{
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);

// display bold inverse differently according to user taste

Expand All @@ -5242,19 +5242,35 @@ int iForeground,

if (style & INVERSE) // inverse inverts foreground and background
{
if (style & HILITE)
colour2 = m_boldcolour [iForeground];
if (iForeground >= 8)
colour2 = xterm_256_colours [iForeground];
else
colour2 = m_normalcolour [iForeground];
colour1 = m_normalcolour [iBackground];
{
if (style & HILITE)
colour2 = m_boldcolour [iForeground];
else
colour2 = m_normalcolour [iForeground];
}
if (iBackground >= 8)
colour1 = xterm_256_colours [iBackground];
else
colour1 = m_normalcolour [iBackground];
}
else
{
if (style & HILITE)
colour1 = m_boldcolour [iForeground];
if (iForeground >= 8)
colour1 = xterm_256_colours [iForeground];
else
colour1 = m_normalcolour [iForeground];
colour2 = m_normalcolour [iBackground];
{
if (style & HILITE)
colour1 = m_boldcolour [iForeground];
else
colour1 = m_normalcolour [iForeground];
}
if (iBackground >= 8)
colour2 = xterm_256_colours [iBackground];
else
colour2 = m_normalcolour [iBackground];
} // end of not inverse


Expand All @@ -5273,10 +5289,23 @@ int iForeground,
}

if (style & HILITE)
colour1 = m_boldcolour [iForeground];
{
if (iForeground >= 8)
colour1 = xterm_256_colours [iForeground];
else
colour1 = m_boldcolour [iForeground];
}
else
{
if (iForeground >= 8)
colour1 = xterm_256_colours [iForeground];
else
colour1 = m_normalcolour [iForeground];
}
if (iBackground >= 8)
colour2 = xterm_256_colours [iBackground];
else
colour1 = m_normalcolour [iForeground];
colour2 = m_normalcolour [iBackground];
colour2 = m_normalcolour [iBackground];

} // end of old way

Expand Down Expand Up @@ -5392,8 +5421,8 @@ void CMUSHclientDoc::RememberStyle (const CStyle * pStyle)
else
if ((pStyle->iFlags & COLOURTYPE) == COLOUR_ANSI)
{
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);
}


Expand Down
64 changes: 48 additions & 16 deletions mushview.cpp
Expand Up @@ -1299,12 +1299,22 @@ previousLineHPtime.QuadPart = 0;
clrBackground = iBackColour;
else
{
ASSERT (iForeColour >= 0 && iForeColour < 8);
ASSERT (iBackColour >= 0 && iBackColour < 8);
ASSERT (iForeColour >= 0 && iForeColour < 256);
ASSERT (iBackColour >= 0 && iBackColour < 256);
if (style & INVERSE) // inverse inverts foreground and background
clrBackground = pDoc->m_normalcolour [iForeColour];
{
if (iForeColour >= 8)
clrBackground = xterm_256_colours [iForeColour];
else
clrBackground = pDoc->m_normalcolour [iForeColour];
}
else
clrBackground = pDoc->m_normalcolour [iBackColour];
{
if (iBackColour >= 8)
clrBackground = xterm_256_colours [iBackColour];
else
clrBackground = pDoc->m_normalcolour [iBackColour];
}
} // not custom

SetRect (&r,
Expand Down Expand Up @@ -1341,14 +1351,24 @@ previousLineHPtime.QuadPart = 0;
clrBackground = iForeColour;
else
clrBackground = iBackColour;
else
else // ie. COLOUR_ANSI
{
ASSERT (iForeColour >= 0 && iForeColour < 8);
ASSERT (iBackColour >= 0 && iBackColour < 8);
ASSERT (iForeColour >= 0 && iForeColour < 256);
ASSERT (iBackColour >= 0 && iBackColour < 256);
if (style & INVERSE) // inverse inverts foreground and background
clrBackground = pDoc->m_normalcolour [iForeColour];
{
if (iForeColour >= 8)
clrBackground = xterm_256_colours [iForeColour];
else
clrBackground = pDoc->m_normalcolour [iForeColour];
}
else
clrBackground = pDoc->m_normalcolour [iBackColour];
{
if (iBackColour >= 8)
clrBackground = xterm_256_colours [iBackColour];
else
clrBackground = pDoc->m_normalcolour [iBackColour];
}
} // not custom

GetClientRect (&cr);
Expand Down Expand Up @@ -5315,8 +5335,7 @@ CTextAttributesDlg dlg;
dlg.m_strBackColour = "Custom";
dlg.m_strCustomColour = pDoc->m_strCustomColourName [pStyle->iForeColour];
}
else
if ((iStyle & COLOURTYPE) == COLOUR_RGB)
else if ((iStyle & COLOURTYPE) == COLOUR_RGB)
{
dlg.m_strTextColour = CFormat ("R=%i, G=%i, B=%i",
GetRValue (pStyle->iForeColour),
Expand All @@ -5328,12 +5347,25 @@ CTextAttributesDlg dlg;
GetBValue (pStyle->iBackColour));
dlg.m_strCustomColour = "RGB";
}
else
else // ie. COLOUR_ANSI
{
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
dlg.m_strTextColour = sColours [pStyle->iForeColour & 7];
dlg.m_strBackColour = sColours [pStyle->iBackColour & 7];
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);

if (pStyle->iForeColour >= 8)
dlg.m_strTextColour = CFormat ("R=%i, G=%i, B=%i",
GetRValue (xterm_256_colours [pStyle->iForeColour]),
GetGValue (xterm_256_colours [pStyle->iForeColour]),
GetBValue (xterm_256_colours [pStyle->iForeColour]));
else
dlg.m_strTextColour = sColours [pStyle->iForeColour & 7];
if (pStyle->iBackColour >= 8)
dlg.m_strBackColour = CFormat ("R=%i, G=%i, B=%i",
GetRValue (xterm_256_colours [pStyle->iBackColour]),
GetGValue (xterm_256_colours [pStyle->iBackColour]),
GetBValue (xterm_256_colours [pStyle->iBackColour]));
else
dlg.m_strBackColour = sColours [pStyle->iBackColour & 7];
dlg.m_strCustomColour = "n/a";
}

Expand Down
8 changes: 8 additions & 0 deletions scripting/methods/methods_colours.cpp
Expand Up @@ -79,6 +79,14 @@ BSTR CMUSHclientDoc::RGBColourToName(long Colour)
46: Cyan
47: White
// 256 colour ANSI foreground
38;5;n where n is 0 to 255
// 256 colour ANSI background
48;5;n where n is 0 to 255
See: http://www.gammon.com.au/forum/?id=7761
*/


Expand Down

0 comments on commit 97eeb41

Please sign in to comment.