char *parse_file(char *file) { int fd; int ret; static char buf[BUFFER_SIZE]; fd = open(file, O_RDONLY); if (fd == -1) ft_error(); ret = read(fd, buf, BUFFER_SIZE); buf[ret] = '\0'; close(fd); ft_check_file(buf); ft_check_char(buf); ft_check_full_o(buf); ft_check_grid(buf); return (buf); }
static BOOL ft_get_char(void *p_priv, u16 char_code, rsc_fstyle_t *p_fstyle, rsc_char_info_t *p_info) { RET_CODE ret = SUCCESS; ft_cache_t *p_vf_cache = NULL; u32 i = 0, ckey = 0; ft_priv_t *p_vf = (ft_priv_t *)p_priv; FT_Stroker p_stroker = {0}; FT_Raster_Params params = {0}; FT_Glyph p_glyph = {0}; spans_t spans = {0}; FT_BBox bbox_fg = {0}, bbox_bg = {0}; u16 w_bg = 0, w_fg = 0, h_bg = 0, h_fg = 0; FT_Matrix matrix = {0}; rsc_font_t hdr_font = {{0}}; u8 *p_font = NULL; MT_ASSERT(p_vf != NULL); if(ft_hit_cache(p_priv, char_code, p_fstyle, p_info)) { p_info->ckey = p_fstyle->color ? 0 : 1; p_info->bpp = p_vf->bpp; return TRUE; } MT_ASSERT(p_fstyle->width <= p_vf->max_width); MT_ASSERT(p_fstyle->height <= p_vf->max_height); if(!rsc_get_font(p_vf->rsc_handle, p_fstyle->font_id, &hdr_font, &p_font)) { return FALSE; } MT_ASSERT(hdr_font.type == FONT_VECTOR); if(!ft_check_char(p_priv, char_code, p_font, hdr_font.head.org_size, p_fstyle)) { return FALSE; } p_vf_cache = ft_insert_cache(p_priv, char_code, p_fstyle); ckey = p_fstyle->color ? 0 : 1; MT_ASSERT(p_vf_cache != NULL); if((p_fstyle->attr & VFONT_ITALIC) != 0) { matrix.xx = 0x10000L; matrix.xy = 0x1000L; matrix.yx = 0; matrix.yy = 0x10000L; FT_Set_Transform(p_vf->p_face, &matrix, 0); } else { FT_Set_Transform(p_vf->p_face, NULL, 0); } ret = FT_Set_Pixel_Sizes(p_vf->p_face, p_vf_cache->char_width, p_vf_cache->char_height); MT_ASSERT(ret == SUCCESS); if(((p_fstyle->attr & VFONT_STROK) == 0) || (p_vf->is_alpha_spt == FALSE)) { if(p_vf->is_alpha_spt) { ret = FT_Load_Char(p_vf->p_face, char_code, FT_LOAD_RENDER); p_info->is_alpha_spt = TRUE; } else { ret = FT_Load_Char(p_vf->p_face, char_code, FT_LOAD_RENDER | FT_LOAD_MONOCHROME); p_info->is_alpha_spt = FALSE; } if((p_fstyle->attr & VFONT_BOLD) != 0) { FT_Bitmap_Embolden(p_vf->p_library, &p_vf->p_face->glyph->bitmap, 64, 64); } MT_ASSERT(ret == SUCCESS); p_info->height = p_vf->p_face->glyph->bitmap.rows; p_info->width = p_vf->p_face->glyph->bitmap.width; p_info->xoffset = p_vf->p_face->glyph->bitmap_left; p_info->yoffset = ((p_vf->p_face->size->metrics.ascender - p_vf->p_face->glyph->metrics.horiBearingY) >> 6); p_info->pitch = p_vf->max_width * p_vf->bpp >> 3; p_info->alpha_pitch = p_vf->max_width; p_info->x_step = ((p_vf->p_face->glyph->advance.x) >> 6); p_info->step_width = p_vf->p_face->glyph->metrics.horiAdvance >> 6; //p_info->step_height = p_vf->p_face->size->metrics.y_ppem; p_info->step_height = p_vf->p_face->size->metrics.height >> 6; p_vf_cache->pitch = p_info->pitch; p_vf_cache->alpha_pitch = p_info->alpha_pitch; p_vf_cache->xoff = p_info->xoffset; p_vf_cache->yoff = p_info->yoffset; p_vf_cache->step_width = p_info->step_width; p_vf_cache->step_height = p_info->step_height; p_vf_cache->x_step = p_info->x_step; p_vf_cache->width = p_info->width; p_vf_cache->height = p_info->height; p_vf_cache->color = p_fstyle->color; if(p_vf->is_alpha_spt) { for(i = 0; i < p_vf->p_face->glyph->bitmap.rows; i++) { memcpy((u8 *)p_vf_cache->p_alpha + i * p_vf->max_width, p_vf->p_face->glyph->bitmap.buffer + i * p_vf->p_face->glyph->bitmap.pitch, p_vf->p_face->glyph->bitmap.pitch); } for(i = 0; i < (p_vf->max_height * p_vf->max_width); i++) { if(p_vf->bpp == 32) { *((u32 *)(p_vf_cache->p_char) + i) = p_fstyle->color; } else if(p_vf->bpp == 16) { *((u16 *)(p_vf_cache->p_char) + i) = p_fstyle->color; } } } else { if(p_vf->bpp == 32) { mono_to_u32buf(p_vf->p_face->glyph->bitmap.buffer, p_vf->p_face->glyph->bitmap.width, p_vf->p_face->glyph->bitmap.rows, p_vf->p_face->glyph->bitmap.pitch, p_vf_cache->p_char, p_vf->max_width * 4, p_fstyle->color, ckey); } else if(p_vf->bpp == 16) { mono_to_u16buf(p_vf->p_face->glyph->bitmap.buffer, p_vf->p_face->glyph->bitmap.width, p_vf->p_face->glyph->bitmap.rows, p_vf->p_face->glyph->bitmap.pitch, p_vf_cache->p_char, p_vf->max_width * 2, p_fstyle->color, ckey); } } p_info->p_alpha = p_vf_cache->p_alpha; p_info->p_char = p_vf_cache->p_char; p_info->p_strok_alpha = NULL; p_info->p_strok_char = NULL; } else if((p_fstyle->attr & VFONT_STROK) != 0)