Skip to content

Commit 97eeb41

Browse files
committed
Fixed problem with 256-colour ANSI sequences
1 parent d4e43a2 commit 97eeb41

File tree

5 files changed

+157
-48
lines changed

5 files changed

+157
-48
lines changed

ansi.cpp

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -323,33 +323,59 @@ COLORREF iBackColour = pOldStyle->iBackColour;
323323
CAction * pAction = pOldStyle->pAction;
324324

325325

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

328-
if ((iFlags & COLOURTYPE) != COLOUR_RGB)
328+
if ((iFlags & COLOURTYPE) == COLOUR_CUSTOM)
329329
{
330330
GetStyleRGB (pOldStyle, iForeColour, iBackColour);
331331
iFlags &= ~COLOURTYPE; // clear custom bits
332332
iFlags |= COLOUR_RGB;
333333
} // end of switching to RGB mode
334334

335-
// change foreground or background as appropriate (honouring inverse flag)
336-
switch (m_phase)
335+
336+
337+
// if they are in RGB mode we have to do the RGB conversion now, not at display time
338+
if ((iFlags & COLOURTYPE) == COLOUR_RGB)
339+
{
340+
switch (m_phase)
341+
{
342+
case HAVE_FOREGROUND_256_FINISH:
343+
if (iFlags & INVERSE)
344+
iBackColour = xterm_256_colours [iCode];
345+
else
346+
iForeColour = xterm_256_colours [iCode];
347+
break;
348+
349+
case HAVE_BACKGROUND_256_FINISH:
350+
if (iFlags & INVERSE)
351+
iForeColour = xterm_256_colours [iCode];
352+
else
353+
iBackColour = xterm_256_colours [iCode];
354+
break;
355+
} // end of switch
356+
} // end style in RGB
357+
else
337358
{
338-
case HAVE_FOREGROUND_256_FINISH:
359+
// must be in ANSI mode
360+
switch (m_phase)
361+
{
362+
case HAVE_FOREGROUND_256_FINISH:
339363
if (iFlags & INVERSE)
340-
iBackColour = xterm_256_colours [iCode];
364+
iBackColour = iCode;
341365
else
342-
iForeColour = xterm_256_colours [iCode];
366+
iForeColour = iCode;
343367
break;
344368

345-
case HAVE_BACKGROUND_256_FINISH:
369+
case HAVE_BACKGROUND_256_FINISH:
346370
if (iFlags & INVERSE)
347-
iForeColour = xterm_256_colours [iCode];
371+
iForeColour = iCode;
348372
else
349-
iBackColour = xterm_256_colours [iCode];
373+
iBackColour = iCode;
350374
break;
375+
} // end of switch
351376

352-
} // end of switch on m_phase
377+
378+
}
353379

354380
m_phase = DOING_CODE;
355381

dialogs/TextAttributesDlg.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,26 @@ void CTextAttributesDlg::OnLineInfo()
215215
switch (pStyle->iFlags & COLOURTYPE)
216216
{
217217
case COLOUR_ANSI:
218-
INFO (TFormat (" Foreground colour ANSI : %i (%s)",
219-
pStyle->iForeColour,
220-
sColours [pStyle->iForeColour & 7]));
221-
INFO (TFormat (" Background colour ANSI : %i (%s)",
222-
pStyle->iBackColour,
223-
sColours [pStyle->iBackColour & 7]));
218+
if (pStyle->iForeColour >= 8)
219+
INFO (TFormat (" Foreground colour 256-ANSI : R=%i, G=%i, B=%i",
220+
GetRValue (xterm_256_colours [pStyle->iForeColour]),
221+
GetGValue (xterm_256_colours [pStyle->iForeColour]),
222+
GetBValue (xterm_256_colours [pStyle->iForeColour])
223+
));
224+
else
225+
INFO (TFormat (" Foreground colour ANSI : %i (%s)",
226+
pStyle->iForeColour,
227+
sColours [pStyle->iForeColour & 7]));
228+
if (pStyle->iBackColour >= 8)
229+
INFO (TFormat (" Background colour 256-ANSI : R=%i, G=%i, B=%i",
230+
GetRValue (xterm_256_colours [pStyle->iBackColour]),
231+
GetGValue (xterm_256_colours [pStyle->iBackColour]),
232+
GetBValue (xterm_256_colours [pStyle->iBackColour])
233+
));
234+
else
235+
INFO (TFormat (" Background colour ANSI : %i (%s)",
236+
pStyle->iBackColour,
237+
sColours [pStyle->iBackColour & 7]));
224238
break;
225239
case COLOUR_CUSTOM:
226240
INFO (TFormat (" Custom colour: %i (%s)",

doc.cpp

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5230,8 +5230,8 @@ int iForeground,
52305230
}
52315231
else
52325232
{
5233-
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
5234-
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
5233+
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
5234+
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);
52355235

52365236
// display bold inverse differently according to user taste
52375237

@@ -5242,19 +5242,35 @@ int iForeground,
52425242

52435243
if (style & INVERSE) // inverse inverts foreground and background
52445244
{
5245-
if (style & HILITE)
5246-
colour2 = m_boldcolour [iForeground];
5245+
if (iForeground >= 8)
5246+
colour2 = xterm_256_colours [iForeground];
52475247
else
5248-
colour2 = m_normalcolour [iForeground];
5249-
colour1 = m_normalcolour [iBackground];
5248+
{
5249+
if (style & HILITE)
5250+
colour2 = m_boldcolour [iForeground];
5251+
else
5252+
colour2 = m_normalcolour [iForeground];
5253+
}
5254+
if (iBackground >= 8)
5255+
colour1 = xterm_256_colours [iBackground];
5256+
else
5257+
colour1 = m_normalcolour [iBackground];
52505258
}
52515259
else
52525260
{
5253-
if (style & HILITE)
5254-
colour1 = m_boldcolour [iForeground];
5261+
if (iForeground >= 8)
5262+
colour1 = xterm_256_colours [iForeground];
52555263
else
5256-
colour1 = m_normalcolour [iForeground];
5257-
colour2 = m_normalcolour [iBackground];
5264+
{
5265+
if (style & HILITE)
5266+
colour1 = m_boldcolour [iForeground];
5267+
else
5268+
colour1 = m_normalcolour [iForeground];
5269+
}
5270+
if (iBackground >= 8)
5271+
colour2 = xterm_256_colours [iBackground];
5272+
else
5273+
colour2 = m_normalcolour [iBackground];
52585274
} // end of not inverse
52595275

52605276

@@ -5273,10 +5289,23 @@ int iForeground,
52735289
}
52745290

52755291
if (style & HILITE)
5276-
colour1 = m_boldcolour [iForeground];
5292+
{
5293+
if (iForeground >= 8)
5294+
colour1 = xterm_256_colours [iForeground];
5295+
else
5296+
colour1 = m_boldcolour [iForeground];
5297+
}
5298+
else
5299+
{
5300+
if (iForeground >= 8)
5301+
colour1 = xterm_256_colours [iForeground];
5302+
else
5303+
colour1 = m_normalcolour [iForeground];
5304+
}
5305+
if (iBackground >= 8)
5306+
colour2 = xterm_256_colours [iBackground];
52775307
else
5278-
colour1 = m_normalcolour [iForeground];
5279-
colour2 = m_normalcolour [iBackground];
5308+
colour2 = m_normalcolour [iBackground];
52805309

52815310
} // end of old way
52825311

@@ -5392,8 +5421,8 @@ void CMUSHclientDoc::RememberStyle (const CStyle * pStyle)
53925421
else
53935422
if ((pStyle->iFlags & COLOURTYPE) == COLOUR_ANSI)
53945423
{
5395-
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
5396-
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
5424+
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
5425+
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);
53975426
}
53985427

53995428

mushview.cpp

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,12 +1299,22 @@ previousLineHPtime.QuadPart = 0;
12991299
clrBackground = iBackColour;
13001300
else
13011301
{
1302-
ASSERT (iForeColour >= 0 && iForeColour < 8);
1303-
ASSERT (iBackColour >= 0 && iBackColour < 8);
1302+
ASSERT (iForeColour >= 0 && iForeColour < 256);
1303+
ASSERT (iBackColour >= 0 && iBackColour < 256);
13041304
if (style & INVERSE) // inverse inverts foreground and background
1305-
clrBackground = pDoc->m_normalcolour [iForeColour];
1305+
{
1306+
if (iForeColour >= 8)
1307+
clrBackground = xterm_256_colours [iForeColour];
1308+
else
1309+
clrBackground = pDoc->m_normalcolour [iForeColour];
1310+
}
13061311
else
1307-
clrBackground = pDoc->m_normalcolour [iBackColour];
1312+
{
1313+
if (iBackColour >= 8)
1314+
clrBackground = xterm_256_colours [iBackColour];
1315+
else
1316+
clrBackground = pDoc->m_normalcolour [iBackColour];
1317+
}
13081318
} // not custom
13091319

13101320
SetRect (&r,
@@ -1341,14 +1351,24 @@ previousLineHPtime.QuadPart = 0;
13411351
clrBackground = iForeColour;
13421352
else
13431353
clrBackground = iBackColour;
1344-
else
1354+
else // ie. COLOUR_ANSI
13451355
{
1346-
ASSERT (iForeColour >= 0 && iForeColour < 8);
1347-
ASSERT (iBackColour >= 0 && iBackColour < 8);
1356+
ASSERT (iForeColour >= 0 && iForeColour < 256);
1357+
ASSERT (iBackColour >= 0 && iBackColour < 256);
13481358
if (style & INVERSE) // inverse inverts foreground and background
1349-
clrBackground = pDoc->m_normalcolour [iForeColour];
1359+
{
1360+
if (iForeColour >= 8)
1361+
clrBackground = xterm_256_colours [iForeColour];
1362+
else
1363+
clrBackground = pDoc->m_normalcolour [iForeColour];
1364+
}
13501365
else
1351-
clrBackground = pDoc->m_normalcolour [iBackColour];
1366+
{
1367+
if (iBackColour >= 8)
1368+
clrBackground = xterm_256_colours [iBackColour];
1369+
else
1370+
clrBackground = pDoc->m_normalcolour [iBackColour];
1371+
}
13521372
} // not custom
13531373

13541374
GetClientRect (&cr);
@@ -5315,8 +5335,7 @@ CTextAttributesDlg dlg;
53155335
dlg.m_strBackColour = "Custom";
53165336
dlg.m_strCustomColour = pDoc->m_strCustomColourName [pStyle->iForeColour];
53175337
}
5318-
else
5319-
if ((iStyle & COLOURTYPE) == COLOUR_RGB)
5338+
else if ((iStyle & COLOURTYPE) == COLOUR_RGB)
53205339
{
53215340
dlg.m_strTextColour = CFormat ("R=%i, G=%i, B=%i",
53225341
GetRValue (pStyle->iForeColour),
@@ -5328,12 +5347,25 @@ CTextAttributesDlg dlg;
53285347
GetBValue (pStyle->iBackColour));
53295348
dlg.m_strCustomColour = "RGB";
53305349
}
5331-
else
5350+
else // ie. COLOUR_ANSI
53325351
{
5333-
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 8);
5334-
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 8);
5335-
dlg.m_strTextColour = sColours [pStyle->iForeColour & 7];
5336-
dlg.m_strBackColour = sColours [pStyle->iBackColour & 7];
5352+
ASSERT (pStyle->iForeColour >= 0 && pStyle->iForeColour < 256);
5353+
ASSERT (pStyle->iBackColour >= 0 && pStyle->iBackColour < 256);
5354+
5355+
if (pStyle->iForeColour >= 8)
5356+
dlg.m_strTextColour = CFormat ("R=%i, G=%i, B=%i",
5357+
GetRValue (xterm_256_colours [pStyle->iForeColour]),
5358+
GetGValue (xterm_256_colours [pStyle->iForeColour]),
5359+
GetBValue (xterm_256_colours [pStyle->iForeColour]));
5360+
else
5361+
dlg.m_strTextColour = sColours [pStyle->iForeColour & 7];
5362+
if (pStyle->iBackColour >= 8)
5363+
dlg.m_strBackColour = CFormat ("R=%i, G=%i, B=%i",
5364+
GetRValue (xterm_256_colours [pStyle->iBackColour]),
5365+
GetGValue (xterm_256_colours [pStyle->iBackColour]),
5366+
GetBValue (xterm_256_colours [pStyle->iBackColour]));
5367+
else
5368+
dlg.m_strBackColour = sColours [pStyle->iBackColour & 7];
53375369
dlg.m_strCustomColour = "n/a";
53385370
}
53395371

scripting/methods/methods_colours.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ BSTR CMUSHclientDoc::RGBColourToName(long Colour)
7979
46: Cyan
8080
47: White
8181
82+
// 256 colour ANSI foreground
83+
38;5;n where n is 0 to 255
84+
85+
// 256 colour ANSI background
86+
48;5;n where n is 0 to 255
87+
88+
See: http://www.gammon.com.au/forum/?id=7761
89+
8290
*/
8391

8492

0 commit comments

Comments
 (0)