Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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)