음 그냥 이건 잘 모르겟다 ㅋㅋㅋ
이해하려 해도 무슨 목적으로 만든지 이해가 안된다
결국은 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;
}
암튼 만들어진 이미지를