카테고리 없음

[FdF] MiniLibX mlx_xpm_to_image

음 그냥  이건  잘 모르겟다 ㅋㅋㅋ

이해하려 해도 무슨 목적으로 만든지 이해가 안된다

결국은 xpm파일을 image로 만들어 mlx_img_list_t 형태로 반환해 준다

 

void	*mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height)
{
  mlx_img_list_t	*img;

	/* 
    mlx_int_parse_xpm   xpm을 만드는 함수같음
    mlx_int_static_line 이건 함수임
    */
  if ((img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line)))
    {
      *width = img->width;
      *height = img->height;
    }
  return (img);
}

이녀석은 xpm 이라는 파일을 이미지로 바꾸는거 같다

xpm 은 좀신기한 예인데

/* 선언 */
static char *test[] = {
/* 문자에대한 색 */
"64 20 5 1 ",
"  c #0000FF",
". c #FF0000",
"X c #00FF00",
"o c #000000",
"O c #FFFFFF",
/* 이미지만드는곳 */
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"                                                                ",
"................................................................",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"                                                                ",
"................................................................",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
};

이러면 밑에 있는 문자들이 위에 문자와 대칭해서 치환해준다

 

일단 실행 예제이다  ㅋ 그냥 잘 읽어서 만드는 구나 하는게 좋겠다

#include <stdio.h>
#include <mlx.h>
typedef struct s_img
{
	void		*ptr;
	int			*data;
	int			width;
	int			height;

	int			bits_per_pixel;
	int			size_line;
	int			endian;
}				t_img;

/* 선언 */
static char *test[] = {
/* 문자에대한 색 */
"64 20 5 1 ",
"  c #0000FF",
". c #FF0000",
"X c #00FF00",
"o c #000000",
"O c #FFFFFF",
/* 이미지만드는곳 */
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"                                                                ",
"................................................................",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"                                                                ",
"................................................................",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
};

int main()
{
		void	*mlx_ptr;
		void	*win_ptr;
		t_img	img;
		int		count_h;
		int		count_w;


		mlx_ptr = mlx_init();
		win_ptr = mlx_new_window(mlx_ptr, 300, 300, "my_mlx");
		mlx_clear_window(mlx_ptr, win_ptr);

		img.ptr = mlx_xpm_to_image(mlx_ptr, test, &img.width, &img.height);
		img.data = (int *)mlx_get_data_addr(img.ptr, &img.bits_per_pixel, &img.size_line, &img.endian);
		mlx_put_image_to_window(mlx_ptr, win_ptr, img.ptr, 50, 50);
		mlx_loop(mlx_ptr);
		return (0);
}

 

 

/ bonus /

void *mlx_int_parse_xpm(mlx_ptr_t *xvar, void *info, int info_size, char *(*f)())
{
  int pos;
  char *line;
  char **tab;
  char *data;
  char *clip_data;
  int nc;
  int opp;
  int cpp;
  int col;
  int rgb_col;
  int col_name;
  int method;
  int x;
  int i;
  int j;
  mlx_img_list_t *img;
  t_xpm_col *colors;
  int *colors_direct;
  int width;
  int height;

  colors = 0;
  colors_direct = 0;
  img = 0;
  tab = 0;
  pos = 0;
  if (!(line = f(info, &pos, info_size)) ||
      !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) ||
      !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) ||
      !(cpp = atoi(tab[3])))
    RETURN;
  free(tab);
  tab = 0;

  method = 0;
  if (cpp <= 2)
  {
    method = 1;
    if (!(colors_direct = malloc((cpp == 2 ? 65536 : 256) * sizeof(int))))
      RETURN;
  }
  else if (!(colors = malloc(nc * sizeof(*colors))))
    RETURN;

  clip_data = 0;

  i = nc;
  while (i--)
  {
    if (!(line = f(info, &pos, info_size)) ||
        !(tab = mlx_int_str_to_wordtab(line + cpp)))
      RETURN;
    j = 0;
    while (tab[j] && strcmp(tab[j++], "c"))
      ;

    if (!tab[j])
      RETURN;

    rgb_col = mlx_int_get_text_rgb(tab[j], tab[j + 1]);
    if (method)
      colors_direct[mlx_int_get_col_name(line, cpp)] = rgb_col;
    else
    {
      colors[i].name = mlx_int_get_col_name(line, cpp);
      colors[i].col = rgb_col;
    }
    free(tab);
    tab = 0;
  }

  if (!(img = mlx_new_image(xvar, width, height)))
    RETURN;
  opp = 4;

  i = height;
  data = img->buffer;
  while (i--)
  {
    if (!(line = f(info, &pos, info_size)))
      RETURN;
    x = 0;
    while (x < width)
    {
      col = 0;
      col_name = mlx_int_get_col_name(line + cpp * x, cpp);
      if (method)
        col = colors_direct[col_name];
      else
      {
        j = nc;
        while (j--)
          if (colors[j].name == col_name)
          {
            col = colors[j].col;
            j = 0;
          }
      }
      if (col == -1)
        col = 0xFF000000;
      mlx_int_xpm_set_pixel(img, data, opp, col, x);
      x++;
    }
    data += img->width * 4;
  }
  if (colors)
    free(colors);
  if (colors_direct)
    free(colors_direct);
  return (img);
}

음 일단 mlx_intstatic_line 은  size 를 쓰지않는다 왜냐면 전해 줄 때 부터 0이다...

즉 그냥 0임...

pos 는 0으로 시작하여 데이터를 읽을때마다 하나씩 추가된다

 

char	*mlx_int_static_line(char **xpm_data,int *pos,int size)
{
  static char	*copy = 0;
  static int	len = 0;
  int		len2;
  char		*str;

  str = xpm_data[(*pos)++];
  if ((len2 = strlen(str))>len)
    {
      if (copy)
	free(copy);
      if (!(copy = malloc(len2+1)))
	return ((char *)0);
      len = len2;
    }
  /* strcpy(copy,str); */
  strlcpy(copy, str, len2+1);
  return (copy);
}

mlx_int_str_to_wordtab은 문자열을

char	**mlx_int_str_to_wordtab(char *str)
{
  char	**tab;
  int	pos;
  int	nb_word;
  int	len;

  len = strlen(str);
  nb_word = 0;
  pos = 0;
  while (pos<len)
  {
    while (*(str+pos)==' ' || *(str+pos)=='\t')
      pos ++;
    if (*(str+pos))
      nb_word ++;
    while (*(str+pos) && *(str+pos)!=' ' && *(str+pos)!='\t')
      pos ++;
  }
  /*문자 갯수 구함*/
  if (!(tab = malloc((1+nb_word)*sizeof(*tab))))
    return ((char **)0);
  nb_word = 0;
  pos = 0;
  while (pos<len)
  {
    while (*(str+pos)==' ' || *(str+pos)=='\t')
	{
	  *(str+pos) = 0;
	  pos ++;
	}
    if (*(str+pos))
	{
	  tab[nb_word] = str+pos;
	  nb_word ++;
	}
    // 문자면 넣어줌
    while (*(str+pos) && *(str+pos)!=' ' && *(str+pos)!='\t')
	pos ++;
    }
  tab[nb_word] = 0;
  return (tab);
}

뭔가 비효율 적이게 짠거같은느낌...??? while을 2번 쓸 필요가 있엇나??? 0으로 초기화 때문에 그런가...? 맨위에 if 문 하나면 될거같은데.. 왜 0 으로 바꿔주는건지도 잘 모르겟넹..

 

mlx_int_get_text_rgb 이건 문자 에 대한 색을 만드는 거같다

int	mlx_int_get_text_rgb(char *name, char *end)
{
  int	i;
  char	buff[64];

  if (*name == '#')
    return (strtol(name+1,0,16));
  if (end)
    {
      snprintf(buff, 64, "%s %s", name, end);
      name = buff;
    }
  i = 0;
  while (mlx_col_name[i].name)
    {
      if (!strcasecmp(mlx_col_name[i].name, name))
	return (mlx_col_name[i].color);
      i ++;
    }
  return (0);
}

엔 뭐냐.. 중복 확인할려고 이름 만든거 같은데??뭐지..

int	mlx_int_get_col_name(char *str,int size)
{
  int	result;

  result = 0;
  while (size--)
    result = (result<<8)+*(str++);
  return (result);
}​

 

void	mlx_int_xpm_set_pixel(mlx_img_list_t *img, char *data, int opp, int col, int x)
{
  /*
  int	dec;

  dec = opp;
  while (dec--)
    {
      if (img->image->byte_order)
	*(data+x*opp+dec) = col&0xFF;
      else
	*(data+x*opp+opp-dec-1) = col&0xFF;
      col >>= 8;
    }
  */
  // opp is 4, do it the simple way
  *((unsigned int *)(data+4*x)) = col;
}

암튼 만들어진 이미지를