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);
 | 
			
		||||
      if (new_brush)
 | 
			
		||||
      {
 | 
			
		||||
        if (is_truetype&&antialias)
 | 
			
		||||
        if (!is_truetype || (is_truetype&&antialias))
 | 
			
		||||
        {
 | 
			
		||||
          // Display brush in remapped form.
 | 
			
		||||
          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)];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// 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)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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)
 | 
			
		||||
{
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user