Implement proper console color handling.

Don't draw over the screen title.
Oddly the menu doesn't seem to clear the screen.
Looks much better now:
http://revolf.free.fr/beos/shots/shot_haiku_loader_amiga_m68k_003.png


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39076 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol
2010-10-23 19:13:55 +00:00
parent c8afe2ca9b
commit 22d81b6c8e
2 changed files with 69 additions and 11 deletions
+57 -11
View File
@@ -29,9 +29,28 @@ class ConsoleHandle : public CharHandle {
uint16 fPen;
};
static const uint16 kPalette[] = {
0x000,
0x00a,
0x0a0,
0x0aa,
0xa00,
0xa0a,
0xa50,
0xaaa,
0x555,
0x55f,
0x5f5,
0x5ff,
0xf55,
0xf5f,
0xff5,
0xfff
};
static Screen *sScreen;
static int16 sFontWidth, sFontHeight;
static int sScreenTopOffset = 16;
int16 ConsoleHandle::fX = 0;
int16 ConsoleHandle::fY = 0;
@@ -102,10 +121,10 @@ console_init(void)
static NewScreen newScreen = {
0, 0,
640, -1,
2,
0, 1,
4,
BLACK, WHITE,
0x8000,
0x1,
0x11,
NULL,
"Haiku Loader",
NULL,
@@ -116,10 +135,10 @@ console_init(void)
if (sScreen == NULL)
panic("OpenScreen()\n");
static const uint16 palette[] = {0xbb9, 0x0, 0xfff, 0x0f0};
LoadRGB4(&sScreen->ViewPort, palette, 4);
LoadRGB4(&sScreen->ViewPort, kPalette, 16);
SetDrMd(&sScreen->RastPort, JAM2);
SetDrMd(&sScreen->RastPort, 0);
// seems not necessary, there is a default font already set.
/*
TextAttr attrs = { "Topaz", 8, 0, 0};
@@ -131,10 +150,34 @@ console_init(void)
sFontHeight = sScreen->Font->ta_YSize;
sFontWidth = font->tf_XSize;
ClearScreen(&sScreen->RastPort);
sScreenTopOffset = sScreen->BarHeight * 2; // ???
//ClearScreen(&sScreen->RastPort);
dbgerr = stdout = stderr = (FILE *)&sOutput;
console_set_cursor(0, 0);
/*
dprintf("LeftEdge %d\n", sScreen->LeftEdge);
dprintf("TopEdge %d\n", sScreen->TopEdge);
dprintf("Width %d\n", sScreen->Width);
dprintf("Height %d\n", sScreen->Height);
dprintf("MouseX %d\n", sScreen->MouseX);
dprintf("MouseY %d\n", sScreen->MouseY);
dprintf("Flags 0x%08x\n", sScreen->Flags);
dprintf("BarHeight %d\n", sScreen->BarHeight);
dprintf("BarVBorder %d\n", sScreen->BarVBorder);
dprintf("BarHBorder %d\n", sScreen->BarHBorder);
dprintf("MenuVBorder %d\n", sScreen->MenuVBorder);
dprintf("MenuHBorder %d\n", sScreen->MenuHBorder);
dprintf("WBorTop %d\n", sScreen->WBorTop);
dprintf("WBorLeft %d\n", sScreen->WBorLeft);
dprintf("WBorRight %d\n", sScreen->WBorRight);
dprintf("WBorBottom %d\n", sScreen->WBorBottom);
*/
return B_OK;
}
@@ -152,7 +195,7 @@ console_clear_screen(void)
int32
console_width(void)
{
int columnCount = 80; //XXX: check video mode
int columnCount = sScreen->Width / sFontWidth;
return columnCount;
}
@@ -160,7 +203,7 @@ console_width(void)
int32
console_height(void)
{
int lineCount = 25; //XXX: check video mode
int lineCount = (sScreen->Height - sScreenTopOffset) / sFontHeight;
return lineCount;
}
@@ -168,7 +211,9 @@ console_height(void)
void
console_set_cursor(int32 x, int32 y)
{
Move(&sScreen->RastPort, sFontWidth * x, sFontHeight * y);
Move(&sScreen->RastPort, sFontWidth * x,
sFontHeight * y + sScreenTopOffset);
// why do I have to add this to keep the title ?
}
@@ -176,7 +221,8 @@ console_set_cursor(int32 x, int32 y)
void
console_set_color(int32 foreground, int32 background)
{
//TODO
SetAPen(&sScreen->RastPort, foreground);
SetBPen(&sScreen->RastPort, background);
}
@@ -1229,6 +1229,14 @@ extern struct GfxBase *GRAPHICS_BASE_NAME;
LP3NR(0xf0, Move, struct RastPort *, par1, a1, long, par2, d0, long, last, d1, \
, GRAPHICS_BASE_NAME)
#define SetAPen(par1, last) \
LP2NR(0x156, SetAPen, struct RastPort *, par1, a1, unsigned long, last, d0, \
, GRAPHICS_BASE_NAME)
#define SetBPen(par1, last) \
LP2NR(0x15c, SetBPen, struct RastPort *, par1, a1, unsigned long, last, d0, \
, GRAPHICS_BASE_NAME)
#define SetDrMd(par1, last) \
LP2NR(0x162, SetDrMd, struct RastPort *, par1, a1, unsigned long, last, d0, \
, GRAPHICS_BASE_NAME)
@@ -1236,6 +1244,10 @@ extern struct GfxBase *GRAPHICS_BASE_NAME;
#endif
/* drawing modes */
#define JAM1 0 // only draw foreground
#define JAM2 1 // draw both fg & bg
// #pragma mark -