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:
parent
065503ef64
commit
57a1bda6de
@ -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);
|
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 (new_brush)
|
||||||
{
|
{
|
||||||
if (is_truetype&&antialias)
|
if (!is_truetype || (is_truetype&&antialias))
|
||||||
{
|
{
|
||||||
// Display brush in remapped form.
|
// Display brush in remapped form.
|
||||||
byte *remapped_brush;
|
byte *remapped_brush;
|
||||||
|
|||||||
@ -216,6 +216,13 @@ byte Get_SDL_pixel_8(SDL_Surface *bmp, int x, int y)
|
|||||||
return ((byte *)(bmp->pixels))[(y*bmp->pitch+x)];
|
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.
|
/// Reads a pixel in a multi-byte SDL surface.
|
||||||
dword Get_SDL_pixel_hicolor(SDL_Surface *bmp, int x, int y)
|
dword Get_SDL_pixel_hicolor(SDL_Surface *bmp, int x, int y)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -56,6 +56,8 @@ SDL_Color Color_to_SDL_color(byte);
|
|||||||
byte Get_SDL_pixel_8(SDL_Surface *bmp, int x, int y);
|
byte Get_SDL_pixel_8(SDL_Surface *bmp, int x, int y);
|
||||||
/// Reads a pixel in a multi-byte SDL surface.
|
/// Reads a pixel in a multi-byte SDL surface.
|
||||||
dword Get_SDL_pixel_hicolor(SDL_Surface *bmp, int x, int y);
|
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
|
/// Convert a SDL Palette to a grafx2 palette
|
||||||
void Get_SDL_Palette(const SDL_Palette * sdl_palette, T_Palette palette);
|
void Get_SDL_Palette(const SDL_Palette * sdl_palette, T_Palette palette);
|
||||||
|
|
||||||
|
|||||||
69
src/text.c
69
src/text.c
@ -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)
|
byte *Render_text_SFont(const char *str, int font_number, int *width, int *height, T_Palette palette)
|
||||||
{
|
{
|
||||||
SFont_Font *font;
|
SFont_Font *font;
|
||||||
SDL_Surface * TexteColore;
|
|
||||||
SDL_Surface * text_surface;
|
SDL_Surface * text_surface;
|
||||||
SDL_Surface *Surface_fonte;
|
SDL_Surface *font_surface;
|
||||||
byte * new_brush;
|
byte * new_brush;
|
||||||
SDL_Rect rectangle;
|
SDL_Rect rectangle;
|
||||||
|
|
||||||
// Chargement de la fonte
|
// Chargement de la fonte
|
||||||
Surface_fonte=IMG_Load(Font_name(font_number));
|
font_surface=IMG_Load(Font_name(font_number));
|
||||||
if (!Surface_fonte)
|
if (!font_surface)
|
||||||
{
|
{
|
||||||
Verbose_message("Warning","Error loading font.\nThe file may be corrupt.");
|
Verbose_message("Warning","Error loading font.\nThe file may be corrupt.");
|
||||||
return NULL;
|
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)
|
if (!font)
|
||||||
{
|
{
|
||||||
DEBUG("Font init failed",1);
|
DEBUG("Font init failed",1);
|
||||||
|
SDL_FreeSurface(font_surface);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(palette, Main_palette, sizeof(T_Palette));
|
|
||||||
|
|
||||||
// Calcul des dimensions
|
// Calcul des dimensions
|
||||||
*height=SFont_TextHeight(font);
|
*height=SFont_TextHeight(font);
|
||||||
*width=SFont_TextWidth(font, str);
|
*width=SFont_TextWidth(font, str);
|
||||||
// Allocation d'une surface SDL
|
// 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
|
// Fill with backcolor
|
||||||
rectangle.x=0;
|
rectangle.x=0;
|
||||||
rectangle.y=0;
|
rectangle.y=0;
|
||||||
rectangle.w=*width;
|
rectangle.w=*width;
|
||||||
rectangle.h=*height;
|
rectangle.h=*height;
|
||||||
SDL_FillRect(TexteColore, &rectangle, SDL_MapRGB(
|
SDL_FillRect(text_surface, &rectangle, Back_color);
|
||||||
TexteColore->format,
|
|
||||||
Main_palette[Back_color].R,
|
|
||||||
Main_palette[Back_color].G,
|
|
||||||
Main_palette[Back_color].B
|
|
||||||
));
|
|
||||||
// Rendu du texte
|
// Rendu du texte
|
||||||
SFont_Write(TexteColore, font, 0, 0, str);
|
SFont_Write(text_surface, font, 0, 0, str);
|
||||||
if (!TexteColore)
|
if (!text_surface)
|
||||||
{
|
{
|
||||||
DEBUG("Rendering failed",2);
|
DEBUG("Rendering failed",2);
|
||||||
SFont_FreeFont(font);
|
SFont_FreeFont(font);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
text_surface=SDL_DisplayFormat(TexteColore);
|
|
||||||
SDL_FreeSurface(TexteColore);
|
|
||||||
|
|
||||||
new_brush=Surface_to_bytefield(text_surface, NULL);
|
new_brush=Surface_to_bytefield(text_surface, NULL);
|
||||||
if (!new_brush)
|
if (!new_brush)
|
||||||
{
|
{
|
||||||
DEBUG("Converting failed",3);
|
DEBUG("Converting failed",3);
|
||||||
SDL_FreeSurface(TexteColore);
|
|
||||||
SDL_FreeSurface(text_surface);
|
SDL_FreeSurface(text_surface);
|
||||||
SFont_FreeFont(font);
|
SFont_FreeFont(font);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Get_SDL_Palette(font_surface->format->palette, palette);
|
||||||
|
|
||||||
SDL_FreeSurface(text_surface);
|
SDL_FreeSurface(text_surface);
|
||||||
SFont_FreeFont(font);
|
SFont_FreeFont(font);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user