Updated font colors

This commit is contained in:
jsalmon3 2003-03-31 22:18:10 +00:00
parent bde48543db
commit abd090e0c2
5 changed files with 240 additions and 87 deletions

View file

@ -862,28 +862,28 @@ local void DebugDrawFonts(void)
VideoFillRectangle(ColorWhite,0,0,40,VideoHeight-1);
VideoDrawTextClip(8, 0+ 10,SmallFont,"FreeCraft");
VideoDrawTextClip(8, 0+ 20,SmallFont,
"~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
// VideoDrawTextClip(8, 0+ 20,SmallFont,
// "~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
VideoDrawTextClip(8, 0+ 30,SmallFont,"abdefgABCDEFQ");
VideoDrawTextClip(8, 40+ 10,GameFont,"FreeCraft");
VideoDrawTextClip(8, 40+ 25,GameFont,
"~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
// VideoDrawTextClip(8, 40+ 25,GameFont,
// "~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
VideoDrawTextClip(8, 40+ 40,GameFont,"abdefgABCDEFQ");
VideoDrawTextClip(8, 100+ 10,LargeFont,"FreeCraft");
VideoDrawTextClip(8, 100+ 25,LargeFont,
"~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
// VideoDrawTextClip(8, 100+ 25,LargeFont,
// "~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
VideoDrawTextClip(8, 100+ 40,LargeFont,"abdefgABCDEFQ");
VideoDrawTextClip(8, 160+ 10,SmallTitleFont,"FreeCraft");
VideoDrawTextClip(8, 160+ 35,SmallTitleFont,
"~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
// VideoDrawTextClip(8, 160+ 35,SmallTitleFont,
// "~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
VideoDrawTextClip(8, 160+ 60,SmallTitleFont,"abdefgABCDEFQ");
VideoDrawTextClip(8, 260+ 10,LargeTitleFont,"FreeCraft");
VideoDrawTextClip(8, 260+ 55,LargeTitleFont,
"~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
// VideoDrawTextClip(8, 260+ 55,LargeTitleFont,
// "~00~11~22~33~44~55~66~77~88~99~aa~bb~cc~dd~ee~ff");
VideoDrawTextClip(8, 260+ 100,LargeTitleFont,"abdefgABCDEFQ");
PopClipping();

View file

@ -1194,11 +1194,42 @@ local void VideoFreePallette(void* pixels)
#endif
/**
** Allocate a new hardware dependend palette palette.
** Maps RGB to a hardware dependent pixel.
**
** @param palette Hardware independend palette.
** @param r Red color.
** @param g Green color.
** @param b Blue color.
**
** @return A hardware dependend pixel table.
** @return A hardware dependent pixel.
*/
global unsigned long VideoMapRGB(int r, int g, int b)
{
XColor color;
XWindowAttributes xwa;
DebugCheck( !TheDisplay || !TheMainWindow );
XGetWindowAttributes(TheDisplay,TheMainWindow,&xwa);
color.red=r<<8;
color.green=g<<8;
color.blue=b<<8;
color.flags=DoRed|DoGreen|DoBlue;
if( !XAllocColor(TheDisplay,xwa.colormap,&color) ) {
fprintf(stderr,"Cannot allocate color\n");
// FIXME: Must find the nearest matching color
//ExitFatal(-1);
}
return color.pixel;
}
/**
** Allocate a new hardware dependent palette palette.
**
** @param palette Hardware independent palette.
**
** @return A hardware dependent pixel table.
**
** @todo FIXME: VideoFreePallette should be used to free unused colors
*/

View file

@ -10,7 +10,7 @@
//
/**@name font.c - The color fonts. */
//
// (c) Copyright 1998-2002 by Lutz Sammer
// (c) Copyright 1998-2003 by Lutz Sammer and Jimmy Salmon
//
// FreeCraft is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
@ -44,6 +44,29 @@
-- Variables
----------------------------------------------------------------------------*/
#define NumFontColors 7
/// Font color mapping
typedef struct _font_color_mapping_ {
char* Color; /// Font color
struct {
int R;
int G;
int B;
} RGB[NumFontColors];
VMemType Pixels[NumFontColors]; /// Array of hardware dependent pixels
struct _font_color_mapping_* Next; /// Next pointer
} FontColorMapping;
local const VMemType *FontPixels; /// Font pixels
#define FontPixels8 (&FontPixels->D8) /// font pixels 8bpp
#define FontPixels16 (&FontPixels->D16) /// font pixels 16bpp
#define FontPixels24 (&FontPixels->D24) /// font pixels 24bpp
#define FontPixels32 (&FontPixels->D32) /// font pixels 32bpp
/// Font color mappings
local FontColorMapping* FontColorMappings;
/**
** Fonts table
**
@ -51,29 +74,21 @@
*/
local ColorFont Fonts[MaxFonts];
/**
** Font color table.
*/
global unsigned char FontColors[16][8];
/// Current color
local const unsigned char* TextColor;
/// Last text color
local const unsigned char* LastTextColor;
local const VMemType* LastTextColor;
/// Default text color
local const unsigned char* DefaultTextColor;
local const VMemType* DefaultTextColor;
/// Reverse text color
local const unsigned char* ReverseTextColor;
local const VMemType* ReverseTextColor;
/// Default normal color index
local int DefaultNormalColorIndex;
local char* DefaultNormalColorIndex;
/// Default reverse color index
local int DefaultReverseColorIndex;
local char* DefaultReverseColorIndex;
/// Draw character with current video depth.
local void (*VideoDrawChar)(const Graphic*,int,int,int,int,int,int);
#ifdef USE_OPENGL
#define NumFontColors 7
/// Font bitmaps
local GLubyte *FontBitmaps[MaxFonts][NumFontColors];
/// Font bitmap widths
@ -123,19 +138,19 @@ local void VideoDrawChar8(const Graphic* sprite,
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels8[TextColor[p]];
*dp=FontPixels8[p];
}
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels8[TextColor[p]];
*dp=FontPixels8[p];
}
}
if( sp<=lp ) {
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels8[TextColor[p]];
*dp=FontPixels8[p];
}
}
sp+=sa;
@ -178,19 +193,19 @@ local void VideoDrawChar16(const Graphic* sprite,
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels16[TextColor[p]];
*dp=FontPixels16[p];
}
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels16[TextColor[p]];
*dp=FontPixels16[p];
}
}
if( sp<=lp ) {
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels16[TextColor[p]];
*dp=FontPixels16[p];
}
}
sp+=sa;
@ -233,19 +248,19 @@ local void VideoDrawChar24(const Graphic* sprite,
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels24[TextColor[p]];
*dp=FontPixels24[p];
}
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels24[TextColor[p]];
*dp=FontPixels24[p];
}
}
if( sp<=lp ) {
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels24[TextColor[p]];
*dp=FontPixels24[p];
}
}
sp+=sa;
@ -288,19 +303,19 @@ local void VideoDrawChar32(const Graphic* sprite,
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels32[TextColor[p]];
*dp=FontPixels32[p];
}
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels32[TextColor[p]];
*dp=FontPixels32[p];
}
}
if( sp<=lp ) {
++dp;
p=*++sp;
if( p!=255 ) {
*dp=Pixels32[TextColor[p]];
*dp=FontPixels32[p];
}
}
sp+=sa;
@ -329,7 +344,7 @@ local void VideoDrawCharOpenGL(const Graphic* sprite,
glDisable(GL_TEXTURE_2D);
for( i=0; i<NumFontColors; ++i ) {
c=GlobalPalette[TextColor[i]];
c=FontPixels[i];
glColor3ub(c.r,c.g,c.b);
glRasterPos2i(x,VideoHeight-y-h);
glBitmap(FontBitmapWidths[CurrentFont]*8,h,
@ -341,18 +356,34 @@ local void VideoDrawCharOpenGL(const Graphic* sprite,
}
#endif
local const VMemType* GetFontColorMapping(char* color)
{
FontColorMapping* fcm;
fcm=FontColorMappings;
while( fcm ) {
if( !strcmp(fcm->Color,color) ) {
return fcm->Pixels;
}
fcm=fcm->Next;
}
fprintf(stderr,"Font mapping not found: '%s'\n",color);
ExitFatal(1);
return NULL;
}
/**
** Set the default text colors.
**
** @param normal Normal text color.
** @param reverse Reverse text color.
*/
global void SetDefaultTextColors(int normal,int reverse)
global void SetDefaultTextColors(char* normal,char* reverse)
{
DefaultNormalColorIndex=normal;
DefaultReverseColorIndex=reverse;
LastTextColor=TextColor=DefaultTextColor=FontColors[normal];
ReverseTextColor=FontColors[reverse];
LastTextColor=DefaultTextColor=FontPixels=GetFontColorMapping(normal);
ReverseTextColor=GetFontColorMapping(reverse);
}
/**
@ -361,7 +392,7 @@ global void SetDefaultTextColors(int normal,int reverse)
** @param normalp Normal text color pointer.
** @param reversep Reverse text color pointer.
*/
global void GetDefaultTextColors(int *normalp,int *reversep)
global void GetDefaultTextColors(char** normalp,char** reversep)
{
*normalp=DefaultNormalColorIndex;
*reversep=DefaultReverseColorIndex;
@ -433,7 +464,6 @@ local void VideoDrawCharClip(const Graphic* graphic,int gx,int gy,int w,int h,
** ~ is special prefix.
** ~~ is the ~ character self.
** ~! print next character reverse.
** ~n 0123456789abcdef print text in color 1-16.
** ~< start reverse.
** ~> switch back to last used color.
**
@ -452,7 +482,7 @@ local int DoDrawText(int x,int y,unsigned font,const unsigned char* text,
int height;
int widths;
const ColorFont* fp;
const unsigned char* rev;
const VMemType* rev;
void (*DrawChar)(const Graphic*,int,int,int,int,int,int);
#ifdef USE_OPENGL
@ -477,30 +507,24 @@ local int DoDrawText(int x,int y,unsigned font,const unsigned char* text,
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
LastTextColor=TextColor;
TextColor=FontColors[*text-'0'];
continue;
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
LastTextColor=TextColor;
TextColor=FontColors[*text+10-'a'];
continue;
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
LastTextColor=TextColor;
TextColor=FontColors[*text+10-'A'];
continue;
fprintf(stderr,"Not supported: ~%c\n",*text);
ExitFatal(1);
break;
case '!':
rev=TextColor;
TextColor=ReverseTextColor;
rev=FontPixels;
FontPixels=ReverseTextColor;
++text;
break;
case '<':
LastTextColor=TextColor;
TextColor=ReverseTextColor;
LastTextColor=FontPixels;
FontPixels=ReverseTextColor;
continue;
case '>':
rev=LastTextColor; // swap last and current color
LastTextColor=TextColor;
TextColor=rev;
LastTextColor=FontPixels;
FontPixels=rev;
continue;
default:
@ -520,7 +544,7 @@ local int DoDrawText(int x,int y,unsigned font,const unsigned char* text,
}
widths+=w+1;
if( rev ) {
TextColor=rev;
FontPixels=rev;
rev=NULL;
}
}
@ -580,9 +604,9 @@ global int VideoDrawReverseText(int x,int y,unsigned font,
{
int w;
TextColor=ReverseTextColor;
FontPixels=ReverseTextColor;
w=VideoDrawText(x,y,font,text);
TextColor=DefaultTextColor;
FontPixels=DefaultTextColor;
return w;
}
@ -774,6 +798,10 @@ local void MakeFontBitmap(Graphic *g,int font)
global void LoadFonts(void)
{
unsigned i;
FontColorMapping* fcm;
void* pixels;
int v;
char* vp;
#ifdef USE_OPENGL
VideoDrawChar=VideoDrawCharOpenGL;
@ -812,6 +840,33 @@ global void LoadFonts(void)
#endif
}
}
fcm=FontColorMappings;
while( fcm ) {
pixels=fcm->Pixels;
for( i=0; i<7; ++i ) {
switch( VideoBpp ) {
case 8:
((VMemType8*)pixels)[i]=VideoMapRGB(fcm->RGB[i].R,fcm->RGB[i].G,fcm->RGB[i].B);
break;
case 15:
case 16:
((VMemType16*)pixels)[i]=VideoMapRGB(fcm->RGB[i].R,fcm->RGB[i].G,fcm->RGB[i].B);
break;
case 24:
v=VideoMapRGB(fcm->RGB[i].R,fcm->RGB[i].G,fcm->RGB[i].B);
vp=(char*)(&v);
((VMemType24*)pixels)[i].a=vp[0];
((VMemType24*)pixels)[i].b=vp[1];
((VMemType24*)pixels)[i].c=vp[2];
break;
case 32:
((VMemType32*)pixels)[i]=VideoMapRGB(fcm->RGB[i].R,fcm->RGB[i].G,fcm->RGB[i].B);
break;
}
}
fcm=fcm->Next;
}
}
/*----------------------------------------------------------------------------
@ -879,26 +934,51 @@ local SCM CclDefineFont(SCM type, SCM file, SCM width, SCM height)
}
/**
** Define the used font colors.
** Define a font color.
*/
local SCM CclDefineFontColors(SCM list)
local SCM CclDefineFontColor(SCM list)
{
int i;
int j;
SCM value;
SCM temp;
char* color;
int i;
FontColorMapping* fcm;
FontColorMapping** fcmp;
for (i = 0; i < 16; ++i) {
value = gh_car(list);
list = gh_cdr(list);
value=gh_car(list);
list=gh_cdr(list);
if (gh_vector_length(value) != 7) {
fprintf(stderr, "Wrong vector length\n");
}
for (j = 0; j < 7; ++j) {
temp = gh_vector_ref(value, gh_int2scm(j));
FontColors[i][j] = gh_scm2int(temp);
color=gh_scm2newstr(value,NULL);
if( !FontColorMappings ) {
FontColorMappings=calloc(sizeof(*FontColorMappings),1);
fcm=FontColorMappings;
} else {
fcmp=&FontColorMappings;
while( *fcmp ) {
if( !strcmp((*fcmp)->Color,color) ) {
fprintf(stderr,"Warning: Redefining color '%s'\n",color);
free((*fcmp)->Color);
fcm=*fcmp;
break;
}
fcmp=&(*fcmp)->Next;
}
*fcmp=calloc(sizeof(*FontColorMappings),1);
fcm=*fcmp;
}
fcm->Color=color;
fcm->Next=NULL;
value=gh_car(list);
list=gh_cdr(list);
if( gh_vector_length(value) != 7*3 ) {
fprintf(stderr,"Wrong vector length\n");
}
for( i=0; i<7; ++i ) {
fcm->RGB[i].R=gh_scm2int(gh_vector_ref(value,gh_int2scm(i*3+0)));
fcm->RGB[i].G=gh_scm2int(gh_vector_ref(value,gh_int2scm(i*3+1)));
fcm->RGB[i].B=gh_scm2int(gh_vector_ref(value,gh_int2scm(i*3+2)));
}
return SCM_UNSPECIFIED;
@ -912,7 +992,7 @@ local SCM CclDefineFontColors(SCM list)
global void FontsCclRegister(void)
{
gh_new_procedure4_0("define-font",CclDefineFont);
gh_new_procedureN("define-font-colors",CclDefineFontColors);
gh_new_procedureN("define-font-color",CclDefineFontColor);
//gh_new_procedure2_0("default-text-colors",CclDefaultTextColors);
//gh_new_procedure1_0("text-length",CclTextLength);
@ -930,6 +1010,8 @@ global void FontsCclRegister(void)
global void CleanFonts(void)
{
unsigned i;
FontColorMapping* fcm;
FontColorMapping* temp;
for( i=0; i<sizeof(Fonts)/sizeof(*Fonts); ++i ) {
free(Fonts[i].File);
@ -938,6 +1020,14 @@ global void CleanFonts(void)
Fonts[i].Graphic=NULL;
}
fcm=FontColorMappings;
while( fcm ) {
temp=fcm->Next;
free(fcm->Color);
free(fcm);
fcm=temp;
}
FontColorMappings=NULL;
}
/**

View file

@ -10,7 +10,7 @@
//
/**@name sdl.c - SDL video support. */
//
// (c) Copyright 1999-2002 by Lutz Sammer
// (c) Copyright 1999-2003 by Lutz Sammer and Jimmy Salmon
//
// FreeCraft is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
@ -762,11 +762,27 @@ global void WaitEventsOneFrame(const EventCallback* callbacks)
}
/**
** Create a new hardware dependend palette palette.
** Maps RGB to a hardware dependent pixel.
**
** @param palette Hardware independend palette.
** @param r Red color.
** @param g Green color.
** @param b Blue color.
**
** @return A hardware dependend pixel table.
** @return A hardware dependent pixel.
*/
global unsigned long VideoMapRGB(int r, int g, int b)
{
DebugCheck(!Screen);
return SDL_MapRGB(Screen->format, r, g, b);
}
/**
** Create a new hardware dependent palette palette.
**
** @param palette Hardware independent palette.
**
** @return A hardware dependent pixel table.
*/
global VMemType *VideoCreateNewPalette(const Palette * palette)
{

View file

@ -10,7 +10,7 @@
//
/**@name wince.c - WinCE video support. */
//
// (c) Copyright 2001,2002 by
// (c) Copyright 2001-2003 by Jimmy Salmon
//
// FreeCraft is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published
@ -242,11 +242,27 @@ global void WaitEventsOneFrame(const EventCallback* callbacks)
}
/**
** Create a new hardware dependend palette palette.
** Maps RGB to a hardware dependent pixel.
**
** @param palette Hardware independend palette.
** @param r Red color.
** @param g Green color.
** @param b Blue color.
**
** @return A hardware dependend pixel table.
** @return A hardware dependent pixel.
*/
global unsigned long VideoMapRGB(int r, int g, int b)
{
DebugCheck(!Screen);
return SDL_MapRGB(Screen->format, r, g, b);
}
/**
** Create a new hardware dependent palette palette.
**
** @param palette Hardware independent palette.
**
** @return A hardware dependent pixel table.
*/
global VMemType *VideoCreateNewPalette(const Palette * palette)
{