Beispiel #1
0
static void utterance_parse (utterance *utt)
{
    int i, j, whitespace;
    
    utt->letters [0] = LETTER_PAU;
    i = 0; j = 1; whitespace = 1;
    
    while (utt->text[i] != 0 && i < STR_SIZE)
	{	
	    if (utt->text[i] == '-' ||
		utt->text[i] == '\''
		) {
		i++;
		continue;
	    }
	    if (utt->text[i] == ' ' ||
		utt->text[i] == '_' ||
		utt->text[i] == '\"' ||
		utt->text[i] == '\t' ||
		utt->text[i] == '\n') {
		i++;
		if (!whitespace) {
		        utt->letters[j] = LETTER_PAU;
		        j++;
		        whitespace = 1;
		}
		continue;
	    }
	    if (utt->text[i] > 'z' || utt->text[i] < 'A') {
		i++;
		continue;
	    }
		
	    utt->letters[j] = get_letter_index (utt, i);
	    i += utf8_length(utt->text + i);
	    j ++;
	    whitespace = 0;
	}
    if (whitespace == 0)
        utt->letters[j] = LETTER_PAU;
}
Beispiel #2
0
int draw_vector_char(framebuffer_t fb, vector_font_t *font, uint32_t c, xy_t p, xy_t off, double scale, col_t colour, double line_thick, const int mode, const int bidi)
{
	letter_t *l;
	double fixoff, wc1, wc2;
	unicode_data_t ucd;
	int found = 0;

	// Algorithmic substitution
	if (bidi == -2)
		c = substitute_rtl_punctuation(c);

	process_one_glyph(font, get_letter_index(font, c));

	l = get_letter(font, c);
	if (l)
	if (l->obj)
	{
		found = 1;
		fixoff = 0.;
		if ((mode&12)==MONOSPACE || ((mode&12)==MONODIGITS && c>='0' && c<='9'))
			fixoff = 0.5 * (4. - l->width);

		if (bidi == -2)
			fixoff -= l->br;
		else
			fixoff -= l->bl;

		draw_vobj(fb, l->obj, xy(p.x + off.x + fixoff*scale, p.y + off.y), scale, 0., line_thick, colour);
	}

	// Alias
	if (found==0 && l)
		if (l->alias)
			found |= draw_vector_char(fb, font, l->alias, p, off, scale, colour, line_thick, mode, bidi);

	// Combo
	if (found==0)
	{
		ucd = get_unicode_data(c);
		if (/*ucd.decomp_type == decomp_canonical &&*/ ucd.combo1)		// if we have a valid combo for this character
		{
			wc1 = glyph_width(font, off.x, ucd.combo1, scale, mode);

			found |= draw_vector_char(fb, font, ucd.combo1, p, off, scale, colour, line_thick, mode, bidi);

			if (ucd.uccat == uccat_Ll)	// if character is lowercase
			{
				wc2 = ((glyph_width(font, off.x, ucd.combo2, 1., mode) - LETTERSPACING) * LOWERCASESCALE + LETTERSPACING) * scale;
				scale *= LOWERCASESCALE;
			}
			else
				wc2 = glyph_width(font, off.x, ucd.combo2, scale, mode);

			if (bidi == -2)
				off.x -= (wc1 - wc2) * 0.5;
			else
				off.x += (wc1 - wc2) * 0.5;
			found |= draw_vector_char(fb, font, ucd.combo2, p, off, scale, colour, line_thick, mode, bidi);
		}
	}

	// Upper case
	if (found==0)
		if (ucd.upper_map)
			found |= draw_vector_char(fb, font, ucd.upper_map, p, off, scale*LOWERCASESCALE, colour, line_thick, mode, bidi);

	// Decomposed CJK
	if (found==0)
		found |= draw_cjkdec_glyph(fb, font, c, add_xy(p, off), scale, colour, line_thick, mode);

	return found;
}