Arabic diacritics support
This commit is contained in:
		
							parent
							
								
									a82890fffc
								
							
						
					
					
						commit
						ad109fe056
					
				
					 3 changed files with 39 additions and 6 deletions
				
			
		
							
								
								
									
										12
									
								
								font/font.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								font/font.c
									
										
									
									
									
								
							|  | @ -1248,6 +1248,13 @@ blit_comb (const struct grub_unicode_glyph *glyph_id, | |||
| 	    min_devwidth = combining_glyphs[i]->width; | ||||
| 	  break; | ||||
| 
 | ||||
| 	  /* TODO: Put dammah and fathah nearer to shadda.  */ | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_DAMMAH: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_DAMMATAN: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_FATHATAN: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_FATHAH: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_SUKUN: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_SHADDA: | ||||
| 	case GRUB_UNICODE_COMB_HEBREW_RAFE: | ||||
| 	case GRUB_UNICODE_STACK_ABOVE: | ||||
| 	  space = combining_glyphs[i]->offset_y | ||||
|  | @ -1276,12 +1283,15 @@ blit_comb (const struct grub_unicode_glyph *glyph_id, | |||
| 	case GRUB_UNICODE_COMB_HEBREW_PATAH: | ||||
| 	case GRUB_UNICODE_COMB_HEBREW_QUBUTS: | ||||
| 	case GRUB_UNICODE_COMB_HEBREW_METEG: | ||||
| 	  /* TODO: Put kasra and kasratan under shadda.  */ | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_KASRA: | ||||
| 	case GRUB_UNICODE_COMB_ARABIC_KASRATAN: | ||||
| 	  /* I don't know how ypogegrammeni differs from subscript. */ | ||||
| 	case GRUB_UNICODE_COMB_YPOGEGRAMMENI: | ||||
| 	case GRUB_UNICODE_STACK_BELOW: | ||||
| 	  space = -(combining_glyphs[i]->offset_y  | ||||
| 		    + combining_glyphs[i]->height); | ||||
| 	  if (space < 0) | ||||
| 	  if (space <= 0) | ||||
| 	    space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; | ||||
| 	   | ||||
| 	case GRUB_UNICODE_STACK_ATTACHED_BELOW: | ||||
|  |  | |||
|  | @ -106,6 +106,14 @@ enum grub_comb_type | |||
|     GRUB_UNICODE_COMB_HEBREW_SHIN_DOT = 24, | ||||
|     GRUB_UNICODE_COMB_HEBREW_SIN_DOT = 25, | ||||
|     GRUB_UNICODE_COMB_HEBREW_VARIKA = 26, | ||||
|     GRUB_UNICODE_COMB_ARABIC_FATHATAN = 27, | ||||
|     GRUB_UNICODE_COMB_ARABIC_DAMMATAN = 28, | ||||
|     GRUB_UNICODE_COMB_ARABIC_KASRATAN = 29, | ||||
|     GRUB_UNICODE_COMB_ARABIC_FATHAH = 30, | ||||
|     GRUB_UNICODE_COMB_ARABIC_DAMMAH = 31, | ||||
|     GRUB_UNICODE_COMB_ARABIC_KASRA = 32, | ||||
|     GRUB_UNICODE_COMB_ARABIC_SHADDA = 33, | ||||
|     GRUB_UNICODE_COMB_ARABIC_SUKUN = 34, | ||||
|     GRUB_UNICODE_STACK_ATTACHED_BELOW = 202, | ||||
|     GRUB_UNICODE_STACK_ATTACHED_ABOVE = 214, | ||||
|     GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT = 216, | ||||
|  |  | |||
|  | @ -28,9 +28,8 @@ | |||
|   - Indic languages | ||||
|   - non-Semitic shaping (rarely used) | ||||
|   - Zl and Zp characters | ||||
|   - Combining characters of types 7, 8, 9, 21, 27, 28, 29, 30, 31, | ||||
|   32, 33, 34, 35, 36, 84, 91, 103, 107, 118, 122, 129, 130, 132, | ||||
|   218, 224, 226, 233, 234 | ||||
|   - Combining characters of types 7, 8, 9, 21, 35, 36, 84, 91, 103, 107, | ||||
|   118, 122, 129, 130, 132, 218, 224, 226, 233, 234 | ||||
|   - Private use characters (not really a problem) | ||||
|   - Variations (no font support) | ||||
|   - Vertical text | ||||
|  | @ -40,7 +39,7 @@ | |||
|   - Justification data | ||||
|   - Glyph posititioning | ||||
|   - Baseline data | ||||
|   TODO: Use form characters of Unicode as last resort Arabic shaping. | ||||
|   Most underline diacritics aren't displayed in gfxterm | ||||
|  */ | ||||
| 
 | ||||
| /* Convert a (possibly null-terminated) UTF-8 string of at most SRCSIZE
 | ||||
|  | @ -550,6 +549,22 @@ grub_unicode_estimate_width (const struct grub_unicode_glyph *c) | |||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| static inline int | ||||
| is_type_after (enum grub_comb_type a, enum grub_comb_type b) | ||||
| { | ||||
|   /* Shadda is numerically higher than most of Arabic diacritics but has
 | ||||
|      to be rendered before them.  */ | ||||
|   if (a == GRUB_UNICODE_COMB_ARABIC_SHADDA  | ||||
|       && b <= GRUB_UNICODE_COMB_ARABIC_KASRA | ||||
|       && b >= GRUB_UNICODE_COMB_ARABIC_FATHATAN) | ||||
|     return 0; | ||||
|   if (b == GRUB_UNICODE_COMB_ARABIC_SHADDA  | ||||
|       && a <= GRUB_UNICODE_COMB_ARABIC_KASRA | ||||
|       && a >= GRUB_UNICODE_COMB_ARABIC_FATHATAN) | ||||
|     return 1; | ||||
|   return a > b; | ||||
| } | ||||
| 
 | ||||
| grub_size_t | ||||
| grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen, | ||||
| 			      struct grub_unicode_glyph *out) | ||||
|  | @ -605,7 +620,7 @@ grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen, | |||
| 	  out->combining = n; | ||||
| 
 | ||||
| 	  for (j = last_comb_pointer; j < out->ncomb; j++) | ||||
| 	    if (out->combining[j].type > comb_type) | ||||
| 	    if (is_type_after (out->combining[j].type, comb_type)) | ||||
| 	      break; | ||||
| 	  grub_memmove (out->combining + j + 1, | ||||
| 			out->combining + j, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue