add Get_font_character_pixel() to get font pixels
This commit is contained in:
		
							parent
							
								
									144d10b682
								
							
						
					
					
						commit
						2ad59e1686
					
				
							
								
								
									
										222
									
								
								src/windows.c
									
									
									
									
									
								
							
							
						
						
									
										222
									
								
								src/windows.c
									
									
									
									
									
								
							@ -678,6 +678,191 @@ void Display_menu(void)
 | 
			
		||||
 | 
			
		||||
// -- Affichage de texte -----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static const byte * Get_font_character_pixel(unsigned int c)
 | 
			
		||||
{
 | 
			
		||||
  // convert some known Unicode chars we have in the Grafx2 base font
 | 
			
		||||
  switch (c)
 | 
			
		||||
  {
 | 
			
		||||
    case 0x20ac:
 | 
			
		||||
      c = 0x80; // ;Euro Sign
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x201a:
 | 
			
		||||
      c = 0x82; // Single Low-9 Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0192:
 | 
			
		||||
      c = 0x83; // Latin Small Letter F With Hook
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x201e:
 | 
			
		||||
      c = 0x84; // Double Low-9 Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2026:
 | 
			
		||||
      c = 0x85; // Horizontal Ellipsis
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2020:
 | 
			
		||||
      c = 0x86; // Dagger
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2021:
 | 
			
		||||
      c = 0x87; // Double Dagger
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x02c6:
 | 
			
		||||
      c = 0x88; // Modifier Letter Circumflex Accent
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2030:
 | 
			
		||||
      c = 0x89; // Per Mille Sign
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0160:
 | 
			
		||||
      c = 0x8a; // Latin Capital Letter S With Caron
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2039:
 | 
			
		||||
      c = 0x8b; // Single Left-Pointing Angle Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0152:
 | 
			
		||||
      c = 0x8c; // Latin Capital Ligature Oe
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x017d:
 | 
			
		||||
      c = 0x8e; // Latin Capital Letter Z With Caron
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2018:
 | 
			
		||||
      c = 0x91; // Left Single Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2019:
 | 
			
		||||
      c = 0x92; // Right Single Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x201c:
 | 
			
		||||
      c = 0x93; // Left Double Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x201d:
 | 
			
		||||
      c = 0x94; // Right Double Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2022:
 | 
			
		||||
      c = 0x95; // Bullet
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2013:
 | 
			
		||||
      c = 0x96; // En Dash
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2014:
 | 
			
		||||
      c = 0x97; // Em Dash
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x02dc:
 | 
			
		||||
      c = 0x98; // Small Tilde
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2122:
 | 
			
		||||
      c = 0x99; // Trade Mark Sign
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0161:
 | 
			
		||||
      c = 0x9a; // Latin Small Letter S With Caron
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x203a:
 | 
			
		||||
      c = 0x9b; // Single Right-Pointing Angle Quotation Mark
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0153:
 | 
			
		||||
      c = 0x9c; // Latin Small Ligature Oe
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x017e:
 | 
			
		||||
      c = 0x9e; // Latin Small Letter Z With Caron
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x0178:
 | 
			
		||||
      c = 0x9f; // Latin Capital Letter Y With Diaeresis
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2190:
 | 
			
		||||
      c = 0x1b; // left arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2191:
 | 
			
		||||
      c = 0x18; // up arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2192:
 | 
			
		||||
      c = 0x1a; // right arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2193:
 | 
			
		||||
      c = 0x19; // down arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2194:
 | 
			
		||||
      c = 0x1d; // right/left arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2195:
 | 
			
		||||
      c = 0x12; // up/down arrow
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x21A8:
 | 
			
		||||
      c = 0x17; // up/down arrow with base
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x221F:
 | 
			
		||||
      c = 0x1c; // right angle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2302:
 | 
			
		||||
      c = 0x7f; // House
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25ac:
 | 
			
		||||
      c = 0x16; // Black rectangle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25b2:
 | 
			
		||||
      c = 0x1e; // up triangle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25ba:
 | 
			
		||||
      c = 0x10; // right rectangle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25bc:
 | 
			
		||||
      c = 0x1f; // down rectangle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25c4:
 | 
			
		||||
      c = 0x11; // left rectange
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25cb:
 | 
			
		||||
      c = 0x09; // circle
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x25d8:
 | 
			
		||||
      c = 0x08; // inverse bullet
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x263a:
 | 
			
		||||
      c = 0x01; // smile
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x263b:
 | 
			
		||||
      c = 0x02; // smile !
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x263c:
 | 
			
		||||
      c = 0x0f; // Sun
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2640:
 | 
			
		||||
      c = 0x0c; // female
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2642:
 | 
			
		||||
      c = 0x0b; // male
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2660:
 | 
			
		||||
      c = 0x06; // spade
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2663:
 | 
			
		||||
      c = 0x05; // club
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2665:
 | 
			
		||||
      c = 0x03; // heart
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x2666:
 | 
			
		||||
      c = 0x04; // diamond
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x266a:
 | 
			
		||||
      c = 0x0d; // eighth note
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x266b:
 | 
			
		||||
      c = 0x0e; // beamed eighth notes
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  if (c < 256)
 | 
			
		||||
    return Menu_font+(c<<6);
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    T_Unicode_Font * ufont;
 | 
			
		||||
    const byte * font_pixel = Menu_font + (1<<6); // dummy character
 | 
			
		||||
    for (ufont = Unicode_fonts; ufont != NULL; ufont = ufont->Next)
 | 
			
		||||
      if (ufont->FirstChar <= c && c <= ufont->LastChar)
 | 
			
		||||
      {
 | 
			
		||||
        font_pixel = ufont->FontData + ((c - ufont->FirstChar) << 6);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    return font_pixel;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  // -- Afficher une chaîne n'importe où à l'écran --
 | 
			
		||||
 | 
			
		||||
void Print_general(short x,short y,const char * str,byte text_color,byte background_color)
 | 
			
		||||
@ -713,12 +898,11 @@ void Print_general_unicode(short x,short y,const word * str,byte text_color,byte
 | 
			
		||||
  word  index;
 | 
			
		||||
  int x_pos;
 | 
			
		||||
  int y_pos;
 | 
			
		||||
  byte *font_pixel;
 | 
			
		||||
  const byte *font_pixel;
 | 
			
		||||
  short real_x;
 | 
			
		||||
  short real_y;
 | 
			
		||||
  byte repeat_menu_x_factor;
 | 
			
		||||
  byte repeat_menu_y_factor;
 | 
			
		||||
  unsigned int c;
 | 
			
		||||
 | 
			
		||||
  real_y=y;
 | 
			
		||||
  for (y_pos=0;y_pos<8<<3;y_pos+=1<<3)
 | 
			
		||||
@ -726,21 +910,7 @@ void Print_general_unicode(short x,short y,const word * str,byte text_color,byte
 | 
			
		||||
    real_x=0; // Position dans le buffer
 | 
			
		||||
    for (index=0;str[index]!=0;index++)
 | 
			
		||||
    {
 | 
			
		||||
      c = str[index];
 | 
			
		||||
      // Pointeur sur le premier pixel du caractère
 | 
			
		||||
      if (c < 256)
 | 
			
		||||
        font_pixel=Menu_font+(c<<6);
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        T_Unicode_Font * ufont;
 | 
			
		||||
        font_pixel=Menu_font + (1<<6); // dummy character
 | 
			
		||||
        for (ufont = Unicode_fonts; ufont != NULL; ufont = ufont->Next)
 | 
			
		||||
          if (ufont->FirstChar <= c && c <= ufont->LastChar)
 | 
			
		||||
          {
 | 
			
		||||
            font_pixel = ufont->FontData + ((c - ufont->FirstChar) << 6);
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
      font_pixel = Get_font_character_pixel(str[index]);
 | 
			
		||||
      for (x_pos=0;x_pos<8;x_pos+=1)
 | 
			
		||||
        for (repeat_menu_x_factor=0;repeat_menu_x_factor<Menu_factor_X*Pixel_width;repeat_menu_x_factor++)
 | 
			
		||||
          Horizontal_line_buffer[real_x++]=*(font_pixel+x_pos+y_pos)?text_color:background_color;
 | 
			
		||||
@ -755,21 +925,9 @@ void Print_char_in_window(short x_pos, short y_pos, unsigned int c,byte text_col
 | 
			
		||||
{
 | 
			
		||||
  short x,y;
 | 
			
		||||
  const byte *pixel;
 | 
			
		||||
  // Premier pixel du caractère
 | 
			
		||||
  if (c < 256)
 | 
			
		||||
    pixel=Menu_font + (c<<6);
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    T_Unicode_Font * ufont;
 | 
			
		||||
    pixel=Menu_font + (1<<6); // dummy character
 | 
			
		||||
    for (ufont = Unicode_fonts; ufont != NULL; ufont = ufont->Next)
 | 
			
		||||
      if (ufont->FirstChar <= c && c <= ufont->LastChar)
 | 
			
		||||
      {
 | 
			
		||||
        pixel = ufont->FontData + ((c - ufont->FirstChar) << 6);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  // First pixel of the character
 | 
			
		||||
  pixel = Get_font_character_pixel(c);
 | 
			
		||||
 | 
			
		||||
  for (y=0;y<8;y++)
 | 
			
		||||
    for (x=0;x<8;x++)
 | 
			
		||||
      Pixel_in_window(x_pos+x, y_pos+y,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user