Improved text with bitmap fonts : Works great with 'Get brush colors' (F11) to import the exact font colors.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1708 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2011-02-05 19:43:51 +00:00
parent 065503ef64
commit 57a1bda6de
4 changed files with 59 additions and 21 deletions

View File

@ -4857,7 +4857,7 @@ void Button_Text(void)
new_brush = Render_text(preview_string, selected_font_index, font_size, antialias, is_bold, is_italic, &new_width, &new_height, text_palette);
if (new_brush)
{
if (is_truetype&&antialias)
if (!is_truetype || (is_truetype&&antialias))
{
// Display brush in remapped form.
byte *remapped_brush;

View File

@ -216,6 +216,13 @@ byte Get_SDL_pixel_8(SDL_Surface *bmp, int x, int y)
return ((byte *)(bmp->pixels))[(y*bmp->pitch+x)];
}
/// Writes a pixel in a 8-bit SDL surface.
void Set_SDL_pixel_8(SDL_Surface *bmp, int x, int y, byte color)
{
((byte *)(bmp->pixels))[(y*bmp->pitch+x)]=color;
}
/// Reads a pixel in a multi-byte SDL surface.
dword Get_SDL_pixel_hicolor(SDL_Surface *bmp, int x, int y)
{

View File

@ -56,6 +56,8 @@ SDL_Color Color_to_SDL_color(byte);
byte Get_SDL_pixel_8(SDL_Surface *bmp, int x, int y);
/// Reads a pixel in a multi-byte SDL surface.
dword Get_SDL_pixel_hicolor(SDL_Surface *bmp, int x, int y);
/// Writes a pixel in a 8-bit SDL surface.
void Set_SDL_pixel_8(SDL_Surface *bmp, int x, int y, byte color);
/// Convert a SDL Palette to a grafx2 palette
void Get_SDL_Palette(const SDL_Palette * sdl_palette, T_Palette palette);

View File

@ -510,65 +510,94 @@ byte *Render_text_TTF(const char *str, int font_number, int size, int antialias,
byte *Render_text_SFont(const char *str, int font_number, int *width, int *height, T_Palette palette)
{
SFont_Font *font;
SDL_Surface * TexteColore;
SDL_Surface * text_surface;
SDL_Surface *Surface_fonte;
SDL_Surface *font_surface;
byte * new_brush;
SDL_Rect rectangle;
// Chargement de la fonte
Surface_fonte=IMG_Load(Font_name(font_number));
if (!Surface_fonte)
font_surface=IMG_Load(Font_name(font_number));
if (!font_surface)
{
Verbose_message("Warning","Error loading font.\nThe file may be corrupt.");
return NULL;
}
font=SFont_InitFont(Surface_fonte);
// Font is 24bit: Perform a color reduction
if (font_surface->format->BitsPerPixel>8)
{
SDL_Surface * reduced_surface;
int x,y,color;
SDL_Color rgb;
reduced_surface=SDL_CreateRGBSurface(SDL_SWSURFACE, font_surface->w, font_surface->h, 8, 0, 0, 0, 0);
if (!reduced_surface)
{
SDL_FreeSurface(font_surface);
return NULL;
}
// Set the quick palette
for (color=0;color<256;color++)
{
rgb.r=((color & 0xE0)>>5)<<5;
rgb.g=((color & 0x1C)>>2)<<5;
rgb.b=((color & 0x03)>>0)<<6;
SDL_SetColors(reduced_surface, &rgb, color, 1);
}
// Perform reduction
for (y=0; y<font_surface->h; y++)
for (x=0; x<font_surface->w; x++)
{
SDL_GetRGB(Get_SDL_pixel_hicolor(font_surface, x, y), font_surface->format, &rgb.r, &rgb.g, &rgb.b);
color=((rgb.r >> 5) << 5) |
((rgb.g >> 5) << 2) |
((rgb.b >> 6));
Set_SDL_pixel_8(reduced_surface, x, y, color);
}
SDL_FreeSurface(font_surface);
font_surface=reduced_surface;
}
font=SFont_InitFont(font_surface);
if (!font)
{
DEBUG("Font init failed",1);
SDL_FreeSurface(font_surface);
return NULL;
}
memcpy(palette, Main_palette, sizeof(T_Palette));
// Calcul des dimensions
*height=SFont_TextHeight(font);
*width=SFont_TextWidth(font, str);
// Allocation d'une surface SDL
TexteColore=SDL_CreateRGBSurface(SDL_SWSURFACE, *width, *height, 24, 0, 0, 0, 0);
text_surface=SDL_CreateRGBSurface(SDL_SWSURFACE, *width, *height, 8, 0, 0, 0, 0);
// Copy palette
SDL_SetPalette(text_surface, SDL_LOGPAL, font_surface->format->palette->colors, 0, 256);
// Fill with backcolor
rectangle.x=0;
rectangle.y=0;
rectangle.w=*width;
rectangle.h=*height;
SDL_FillRect(TexteColore, &rectangle, SDL_MapRGB(
TexteColore->format,
Main_palette[Back_color].R,
Main_palette[Back_color].G,
Main_palette[Back_color].B
));
SDL_FillRect(text_surface, &rectangle, Back_color);
// Rendu du texte
SFont_Write(TexteColore, font, 0, 0, str);
if (!TexteColore)
SFont_Write(text_surface, font, 0, 0, str);
if (!text_surface)
{
DEBUG("Rendering failed",2);
SFont_FreeFont(font);
return NULL;
}
text_surface=SDL_DisplayFormat(TexteColore);
SDL_FreeSurface(TexteColore);
new_brush=Surface_to_bytefield(text_surface, NULL);
if (!new_brush)
{
DEBUG("Converting failed",3);
SDL_FreeSurface(TexteColore);
SDL_FreeSurface(text_surface);
SFont_FreeFont(font);
return NULL;
}
Get_SDL_Palette(font_surface->format->palette, palette);
SDL_FreeSurface(text_surface);
SFont_FreeFont(font);