nicolas-arnaud
2 years ago
29 changed files with 7021 additions and 3 deletions
@ -0,0 +1,24 @@ |
|||||
|
#
|
||||
|
#
|
||||
|
|
||||
|
NOM=libmlx.a |
||||
|
SRC= mlx_shaders.c mlx_new_window.m mlx_init_loop.m mlx_new_image.m mlx_xpm.c mlx_int_str_to_wordtab.c |
||||
|
SRC+= mlx_png.c mlx_mouse.m |
||||
|
OBJ1=$(SRC:.c=.o) |
||||
|
OBJ=$(OBJ1:.m=.o) |
||||
|
CFLAGS+=-O2 |
||||
|
|
||||
|
# add to match string put with X11 in size and position
|
||||
|
CFLAGS+= -DSTRINGPUTX11 |
||||
|
|
||||
|
all: $(NOM) |
||||
|
|
||||
|
$(NOM): $(OBJ) |
||||
|
ar -r $(NOM) $(OBJ) |
||||
|
ranlib $(NOM) |
||||
|
|
||||
|
clean: |
||||
|
rm -f $(NOM) $(OBJ) *~ |
||||
|
rm -f mlx_app |
||||
|
|
||||
|
re: clean all |
File diff suppressed because it is too large
Binary file not shown.
Binary file not shown.
@ -0,0 +1,149 @@ |
|||||
|
/*
|
||||
|
** mlx.h for MinilibX in |
||||
|
** |
||||
|
** Made by Charlie Root |
||||
|
** Login <ol@staff.42.fr> |
||||
|
** |
||||
|
** Started on Mon Jul 31 16:37:50 2000 Charlie Root |
||||
|
** Last update Tue Oct 01 16:23:28 2014 Olivier Crouzet |
||||
|
*/ |
||||
|
|
||||
|
/*
|
||||
|
** MinilibX - Please report bugs |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** FR msg - FR msg - FR msg |
||||
|
** |
||||
|
** MacOSX |
||||
|
** La MinilibX utilise 2 frameworks Mac : OpenGL et AppKit |
||||
|
** qu'il faut ajouter a la compilation : |
||||
|
** -framework OpenGL -framework AppKit |
||||
|
** |
||||
|
** UNIX / Linux |
||||
|
** La MinilibX utilise 2 librairies supplementaires qu'il |
||||
|
** est necessaire de rajouter a la compilation : |
||||
|
** -lmlx -lXext -lX11 |
||||
|
** |
||||
|
** La MinilibX permet le chargement des images de type Xpm. |
||||
|
** Notez que cette implementation est incomplete. |
||||
|
** |
||||
|
** Il y a des differences entre X11 et MacOS. |
||||
|
** les numeros des touches ne sont pas les memes, |
||||
|
** les numeros des boutons souris ne sont pas les memes. |
||||
|
** Egalement l'expose est gere differemment, et sous MacOS |
||||
|
** il est preferable d'entrer le plus tot possible dans mlx_loop, |
||||
|
** il est normal que les fenetres n'apparaissent pas avant mlx_loop |
||||
|
** (ou bien forcez avec mlx_do_sync mais c'est pas genial). |
||||
|
** Sous MacOS, l'octet Alpha est pris en compte dans toutes les |
||||
|
** images, et represente la transparence et non l'opacite comme |
||||
|
** c'est normalement le cas. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef MLX_H |
||||
|
|
||||
|
#define MLX_H |
||||
|
|
||||
|
|
||||
|
void *mlx_init(); |
||||
|
/*
|
||||
|
** needed before everything else. |
||||
|
** return (void *)0 if failed |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** Basic actions |
||||
|
*/ |
||||
|
|
||||
|
void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); |
||||
|
/*
|
||||
|
** return void *0 if failed |
||||
|
*/ |
||||
|
int mlx_clear_window(void *mlx_ptr, void *win_ptr); |
||||
|
int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); |
||||
|
/*
|
||||
|
** origin for x & y is top left corner of the window |
||||
|
** y down is positive |
||||
|
** color is 0x00RRGGBB |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** Image stuff |
||||
|
*/ |
||||
|
|
||||
|
void *mlx_new_image(void *mlx_ptr,int width,int height); |
||||
|
/*
|
||||
|
** return void *0 if failed |
||||
|
*/ |
||||
|
char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, |
||||
|
int *size_line, int *endian); |
||||
|
/*
|
||||
|
** endian : 0 = sever X is little endian, 1 = big endian |
||||
|
** endian : useless on macos, client and graphical framework have the same endian |
||||
|
*/ |
||||
|
int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, |
||||
|
int x, int y); |
||||
|
unsigned int mlx_get_color_value(void *mlx_ptr, int color); |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** dealing with Events |
||||
|
*/ |
||||
|
|
||||
|
int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); |
||||
|
int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); |
||||
|
int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); |
||||
|
|
||||
|
int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); |
||||
|
int mlx_loop (void *mlx_ptr); |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** hook funct are called as follow : |
||||
|
** |
||||
|
** expose_hook(void *param); |
||||
|
** key_hook(int keycode, void *param); |
||||
|
** mouse_hook(int button, int x,int y, void *param); |
||||
|
** loop_hook(void *param); |
||||
|
** |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
** Usually asked... |
||||
|
*/ |
||||
|
|
||||
|
int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, |
||||
|
char *string); |
||||
|
void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, |
||||
|
int *width, int *height); |
||||
|
void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, |
||||
|
int *width, int *height); |
||||
|
void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); |
||||
|
|
||||
|
int mlx_destroy_window(void *mlx_ptr, void *win_ptr); |
||||
|
|
||||
|
int mlx_destroy_image(void *mlx_ptr, void *img_ptr); |
||||
|
|
||||
|
/*
|
||||
|
** generic hook system for all events, and minilibX functions that |
||||
|
** can be hooked. Some macro and defines from X11/X.h are needed here. |
||||
|
*/ |
||||
|
|
||||
|
int mlx_hook(void *win_ptr, int x_event, int x_mask, |
||||
|
int (*funct)(), void *param); |
||||
|
|
||||
|
int mlx_mouse_hide(); |
||||
|
int mlx_mouse_show(); |
||||
|
int mlx_mouse_move(void *win_ptr, int x, int y); |
||||
|
int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); |
||||
|
|
||||
|
int mlx_do_key_autorepeatoff(void *mlx_ptr); |
||||
|
int mlx_do_key_autorepeaton(void *mlx_ptr); |
||||
|
int mlx_do_sync(void *mlx_ptr); |
||||
|
|
||||
|
#endif /* MLX_H */ |
@ -0,0 +1,192 @@ |
|||||
|
// mlx_init_loop.m |
||||
|
// By Ol |
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import <OpenGL/gl3.h> |
||||
|
#import <AppKit/NSOpenGLView.h> |
||||
|
|
||||
|
#include "mlx_int.h" |
||||
|
#include "mlx_new_window.h" |
||||
|
|
||||
|
#include "font.c" |
||||
|
|
||||
|
|
||||
|
void do_loop_hook2(CFRunLoopTimerRef observer, void * info) |
||||
|
{ |
||||
|
((mlx_ptr_t *)info)->loop_hook(((mlx_ptr_t *)info)->loop_hook_data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void do_loop_flush(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void * info) |
||||
|
{ |
||||
|
mlx_ptr_t *mlx_ptr; |
||||
|
mlx_win_list_t *win; |
||||
|
|
||||
|
mlx_ptr = (mlx_ptr_t *)info; |
||||
|
win = mlx_ptr->win_list; |
||||
|
while (win) |
||||
|
{ |
||||
|
if (win->nb_flush > 0 && win->pixmgt) |
||||
|
{ |
||||
|
[(id)win->winid selectGLContext]; |
||||
|
[(id)win->winid mlx_gl_draw]; |
||||
|
glFlush(); |
||||
|
win->nb_flush = 0; |
||||
|
} |
||||
|
win = win->next; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
void *mlx_init() |
||||
|
{ |
||||
|
mlx_ptr_t *new_mlx; |
||||
|
int bidon; |
||||
|
int i; |
||||
|
|
||||
|
if ((new_mlx = malloc(sizeof(*new_mlx))) == NULL) |
||||
|
return ((void *)0); |
||||
|
new_mlx->win_list = NULL; |
||||
|
new_mlx->img_list = NULL; |
||||
|
new_mlx->loop_hook = NULL; |
||||
|
new_mlx->loop_hook_data = NULL; |
||||
|
new_mlx->main_loop_active = 0; |
||||
|
|
||||
|
new_mlx->appid = [NSApplication sharedApplication]; |
||||
|
|
||||
|
// super magic trick to detach app from terminal, get menubar & key input events |
||||
|
for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) |
||||
|
{ |
||||
|
[app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; |
||||
|
break; |
||||
|
} |
||||
|
usleep(100000); |
||||
|
ProcessSerialNumber psn = { 0, kCurrentProcess }; |
||||
|
(void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); |
||||
|
usleep(100000); |
||||
|
[[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; |
||||
|
|
||||
|
// load font |
||||
|
new_mlx->font = mlx_new_image(new_mlx, (FONT_WIDTH+2)*95, FONT_HEIGHT); |
||||
|
i = 0; |
||||
|
while (i < 4*(FONT_WIDTH+2)*95*FONT_HEIGHT) |
||||
|
{ |
||||
|
new_mlx->font->buffer[i+0] = font_atlas.pixel_data[i+2]; |
||||
|
new_mlx->font->buffer[i+1] = font_atlas.pixel_data[i+1]; |
||||
|
new_mlx->font->buffer[i+2] = font_atlas.pixel_data[i+0]; |
||||
|
((unsigned char *)new_mlx->font->buffer)[i+3] = 0xFF-font_atlas.pixel_data[i+3]; |
||||
|
i += 4; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#ifdef STRINGPUTX11 |
||||
|
new_mlx->font->vertexes[2] = FONT_WIDTH/1.4; |
||||
|
new_mlx->font->vertexes[4] = FONT_WIDTH/1.4; |
||||
|
new_mlx->font->vertexes[5] = (-FONT_HEIGHT-1)/1.4; |
||||
|
new_mlx->font->vertexes[7] = (-FONT_HEIGHT-1)/1.4; |
||||
|
#else |
||||
|
new_mlx->font->vertexes[2] = FONT_WIDTH; |
||||
|
new_mlx->font->vertexes[4] = FONT_WIDTH; |
||||
|
new_mlx->font->vertexes[5] = -FONT_HEIGHT-1; |
||||
|
new_mlx->font->vertexes[7] = -FONT_HEIGHT-1; |
||||
|
#endif |
||||
|
|
||||
|
return ((void *)new_mlx); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_loop(mlx_ptr_t *mlx_ptr) |
||||
|
{ |
||||
|
CFRunLoopObserverRef observer; |
||||
|
CFRunLoopObserverContext ocontext = {.version = 0, .info = mlx_ptr, .retain = NULL, .release = NULL, .copyDescription = NULL}; |
||||
|
|
||||
|
mlx_ptr->main_loop_active = 1; |
||||
|
|
||||
|
observer = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, true, 0, do_loop_flush, &ocontext); |
||||
|
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes); |
||||
|
|
||||
|
// [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0]; |
||||
|
|
||||
|
[NSApp run]; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_pixel_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color) |
||||
|
{ |
||||
|
if (!win_ptr->pixmgt) |
||||
|
return ; |
||||
|
[(id)(win_ptr->winid) selectGLContext]; |
||||
|
[(id)(win_ptr->winid) pixelPutColor:color X:x Y:y]; |
||||
|
win_ptr->nb_flush ++; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_int_loop_once() |
||||
|
{ |
||||
|
NSEvent *event; |
||||
|
NSDate *thedate; |
||||
|
|
||||
|
thedate = [NSDate dateWithTimeIntervalSinceNow:0.1]; |
||||
|
while (42) |
||||
|
{ |
||||
|
event = [NSApp nextEventMatchingMask:NSEventMaskAny |
||||
|
untilDate:thedate |
||||
|
inMode:NSDefaultRunLoopMode |
||||
|
dequeue:YES]; |
||||
|
if (event == nil) |
||||
|
{ |
||||
|
[thedate release]; |
||||
|
return ; |
||||
|
} |
||||
|
[NSApp sendEvent:event]; |
||||
|
[NSApp updateWindows]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_do_sync(mlx_ptr_t *mlx_ptr) |
||||
|
{ |
||||
|
mlx_win_list_t *win; |
||||
|
|
||||
|
win = mlx_ptr->win_list; |
||||
|
while (win) |
||||
|
{ |
||||
|
if (win->pixmgt) |
||||
|
{ |
||||
|
[(id)(win->winid) selectGLContext]; |
||||
|
[(id)(win->winid) mlx_gl_draw]; |
||||
|
glFlush(); |
||||
|
if (!mlx_ptr->main_loop_active) |
||||
|
mlx_int_loop_once(); |
||||
|
} |
||||
|
win = win->next; |
||||
|
} |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param) |
||||
|
{ |
||||
|
CFRunLoopTimerContext tcontext = {0, mlx_ptr, NULL, NULL, NULL}; |
||||
|
CFRunLoopTimerRef timer; |
||||
|
|
||||
|
if (mlx_ptr->loop_hook != NULL) |
||||
|
{ |
||||
|
CFRunLoopTimerInvalidate(mlx_ptr->loop_timer); |
||||
|
[(id)(mlx_ptr->loop_timer) release]; |
||||
|
} |
||||
|
|
||||
|
mlx_ptr->loop_hook = fct; |
||||
|
mlx_ptr->loop_hook_data = param; |
||||
|
|
||||
|
if (fct) |
||||
|
{ |
||||
|
timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, &do_loop_hook2, &tcontext); |
||||
|
mlx_ptr->loop_timer = timer; |
||||
|
CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes); |
||||
|
} |
||||
|
|
||||
|
return (0); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,102 @@ |
|||||
|
//
|
||||
|
// mlx_int.h for minilibx
|
||||
|
//
|
||||
|
// ol@staff.42.fr
|
||||
|
//
|
||||
|
// include opengl needed before mlx_int.h
|
||||
|
//
|
||||
|
|
||||
|
|
||||
|
#define MAX_EVENT 32 |
||||
|
#define MAX_PIXEL_NB 200000 |
||||
|
#define UNIQ_BPP 4 |
||||
|
|
||||
|
#define FONT_WIDTH 10 |
||||
|
#define FONT_HEIGHT 20 |
||||
|
|
||||
|
|
||||
|
typedef int (*func_t)(); |
||||
|
|
||||
|
/* structs */ |
||||
|
|
||||
|
typedef struct glsl_info_s |
||||
|
{ |
||||
|
GLuint pixel_vshader; |
||||
|
GLuint pixel_fshader; |
||||
|
GLuint pixel_program; |
||||
|
GLint loc_pixel_position; |
||||
|
GLint loc_pixel_texture; |
||||
|
GLint loc_pixel_winhalfsize; |
||||
|
|
||||
|
GLuint image_vshader; |
||||
|
GLuint image_fshader; |
||||
|
GLuint image_program; |
||||
|
GLint loc_image_position; |
||||
|
GLint loc_image_winhalfsize; |
||||
|
GLint loc_image_texture; |
||||
|
GLint loc_image_pos; |
||||
|
GLint loc_image_size; |
||||
|
|
||||
|
GLuint font_vshader; |
||||
|
GLuint font_fshader; |
||||
|
GLuint font_program; |
||||
|
GLint loc_font_position; |
||||
|
GLint loc_font_winhalfsize; |
||||
|
GLint loc_font_texture; |
||||
|
GLint loc_font_color; |
||||
|
GLint loc_font_posinwin; |
||||
|
GLint loc_font_posinatlas; |
||||
|
GLint loc_font_atlassize; |
||||
|
} glsl_info_t; |
||||
|
|
||||
|
|
||||
|
typedef struct mlx_img_list_s |
||||
|
{ |
||||
|
int width; |
||||
|
int height; |
||||
|
char *buffer; |
||||
|
GLfloat vertexes[8]; |
||||
|
struct mlx_img_list_s *next; |
||||
|
} mlx_img_list_t; |
||||
|
|
||||
|
|
||||
|
typedef struct mlx_img_ctx_s |
||||
|
{ |
||||
|
GLuint texture; |
||||
|
GLuint vbuffer; |
||||
|
mlx_img_list_t *img; |
||||
|
struct mlx_img_ctx_s *next; |
||||
|
} mlx_img_ctx_t; |
||||
|
|
||||
|
typedef struct mlx_win_list_s |
||||
|
{ |
||||
|
void *winid; |
||||
|
mlx_img_ctx_t *img_list; |
||||
|
int nb_flush; |
||||
|
int pixmgt; |
||||
|
struct mlx_win_list_s *next; |
||||
|
} mlx_win_list_t; |
||||
|
|
||||
|
|
||||
|
typedef struct mlx_ptr_s |
||||
|
{ |
||||
|
void *appid; |
||||
|
mlx_win_list_t *win_list; |
||||
|
mlx_img_list_t *img_list; |
||||
|
void (*loop_hook)(void *); |
||||
|
void *loop_hook_data; |
||||
|
void *loop_timer; |
||||
|
mlx_img_list_t *font; |
||||
|
int main_loop_active; |
||||
|
} mlx_ptr_t; |
||||
|
|
||||
|
// proto
|
||||
|
|
||||
|
int mlx_shaders(glsl_info_t *glsl); |
||||
|
char **mlx_int_str_to_wordtab(char *str); |
||||
|
int mlx_int_str_str(char *str,char *find,int len); |
||||
|
int mlx_int_str_str_cote(char *str,char *find,int len); |
||||
|
int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_ptr); |
||||
|
void *mlx_new_image(); |
||||
|
void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height); |
||||
|
int mlx_do_sync(mlx_ptr_t *mlx_ptr); |
@ -0,0 +1,107 @@ |
|||||
|
//
|
||||
|
// str 2 wordtab & co
|
||||
|
// by ol
|
||||
|
|
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
int mlx_int_str_str(char *str,char *find,int len) |
||||
|
{ |
||||
|
int len_f; |
||||
|
int pos; |
||||
|
char *s; |
||||
|
char *f; |
||||
|
|
||||
|
len_f = strlen(find); |
||||
|
if (len_f>len) |
||||
|
return (-1); |
||||
|
pos = 0; |
||||
|
while (*(str+len_f-1)) |
||||
|
{ |
||||
|
s = str; |
||||
|
f = find; |
||||
|
while (*(f++) == *(s++)) |
||||
|
if (!*f) |
||||
|
return (pos); |
||||
|
str ++; |
||||
|
pos ++; |
||||
|
} |
||||
|
return (-1); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
int mlx_int_str_str_cote(char *str,char *find,int len) |
||||
|
{ |
||||
|
int len_f; |
||||
|
int pos; |
||||
|
char *s; |
||||
|
char *f; |
||||
|
int cote; |
||||
|
|
||||
|
len_f = strlen(find); |
||||
|
if (len_f>len) |
||||
|
return (-1); |
||||
|
cote = 0; |
||||
|
pos = 0; |
||||
|
while (*(str+len_f-1)) |
||||
|
{ |
||||
|
if (*str=='"') |
||||
|
cote = 1-cote; |
||||
|
if (!cote) |
||||
|
{ |
||||
|
s = str; |
||||
|
f = find; |
||||
|
while (*(f++) == *(s++)) |
||||
|
if (!*f) |
||||
|
return (pos); |
||||
|
} |
||||
|
str ++; |
||||
|
pos ++; |
||||
|
} |
||||
|
return (-1); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
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); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,52 @@ |
|||||
|
#include <stdio.h> |
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import <OpenGL/gl3.h> |
||||
|
|
||||
|
#include "mlx_int.h" |
||||
|
#include "mlx_new_window.h" |
||||
|
|
||||
|
int mlx_mouse_hide() |
||||
|
{ |
||||
|
// CGDisplayHideCursor(kCGDirectMainDisplay); |
||||
|
[NSCursor hide]; |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
int mlx_mouse_show() |
||||
|
{ |
||||
|
// CGDisplayShowCursor(kCGDirectMainDisplay); |
||||
|
[NSCursor unhide]; |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
int mlx_mouse_move(mlx_win_list_t *win, int x, int y) |
||||
|
{ |
||||
|
CGPoint point; |
||||
|
NSRect pos; |
||||
|
id thewin; |
||||
|
|
||||
|
thewin = [(id)(win->winid) win]; |
||||
|
pos = [thewin frame]; |
||||
|
// printf("got win pos %f %f\n", pos.origin.x, pos.origin.y); |
||||
|
point.x = pos.origin.x + x; |
||||
|
point.y = NSHeight([[thewin screen] frame]) - NSHeight([(id)(win->winid) frame]) - pos.origin.y + 1 + y; |
||||
|
CGWarpMouseCursorPosition(point); |
||||
|
CGAssociateMouseAndMouseCursorPosition(true); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_mouse_get_pos(mlx_win_list_t *win, int *x, int *y) |
||||
|
{ |
||||
|
CGPoint point; |
||||
|
id thewin; |
||||
|
NSRect pos; |
||||
|
|
||||
|
thewin = [(id)(win->winid) win]; |
||||
|
pos = [(id)(win->winid) frame]; |
||||
|
point = [thewin mouseLocationOutsideOfEventStream]; |
||||
|
*x = point.x; |
||||
|
*y = NSHeight(pos) - 1 - point.y; |
||||
|
return (0); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,198 @@ |
|||||
|
// mlx_new_image |
||||
|
// |
||||
|
// by Ol |
||||
|
// |
||||
|
|
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import <OpenGL/gl3.h> |
||||
|
|
||||
|
#include "mlx_int.h" |
||||
|
#include "mlx_new_window.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
void *mlx_new_image(mlx_ptr_t *mlx_ptr, int width, int height) |
||||
|
{ |
||||
|
mlx_img_list_t *newimg; |
||||
|
|
||||
|
// if (mlx_ptr->win_list == NULL) |
||||
|
// return (NULL); // need at leat one window created to have openGL context and create texture |
||||
|
if ((newimg = malloc(sizeof(*newimg))) == NULL) |
||||
|
return ((void *)0); |
||||
|
newimg->next = mlx_ptr->img_list; |
||||
|
mlx_ptr->img_list = newimg; |
||||
|
newimg->width = width; |
||||
|
newimg->height = height; |
||||
|
newimg->vertexes[0] = 0.0; newimg->vertexes[1] = 0.0; |
||||
|
newimg->vertexes[2] = width; newimg->vertexes[3] = 0.0; |
||||
|
newimg->vertexes[4] = width; newimg->vertexes[5] = -height; |
||||
|
newimg->vertexes[6] = 0.0; newimg->vertexes[7] = -height; |
||||
|
newimg->buffer = malloc(UNIQ_BPP*width*height); |
||||
|
bzero(newimg->buffer, UNIQ_BPP*width*height); |
||||
|
|
||||
|
return (newimg); |
||||
|
} |
||||
|
|
||||
|
mlx_img_ctx_t *add_img_to_ctx(mlx_img_list_t *img, mlx_win_list_t *win) |
||||
|
{ |
||||
|
mlx_img_ctx_t *imgctx; |
||||
|
|
||||
|
imgctx = win->img_list; |
||||
|
while (imgctx) |
||||
|
{ |
||||
|
if (imgctx->img == img) |
||||
|
return (imgctx); |
||||
|
imgctx = imgctx->next; |
||||
|
} |
||||
|
|
||||
|
imgctx = malloc(sizeof(*imgctx)); |
||||
|
imgctx->img = img; |
||||
|
imgctx->next = win->img_list; |
||||
|
win->img_list = imgctx; |
||||
|
|
||||
|
glGenTextures(1, &(imgctx->texture)); |
||||
|
glBindTexture(GL_TEXTURE_2D, imgctx->texture); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
||||
|
glTexImage2D( |
||||
|
GL_TEXTURE_2D, 0, /* target, level of detail */ |
||||
|
GL_RGBA8, /* internal format */ |
||||
|
img->width, img->height, 0, /* width, height, border */ |
||||
|
GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ |
||||
|
img->buffer /* pixels */ |
||||
|
); |
||||
|
|
||||
|
glGenBuffers(1, &(imgctx->vbuffer)); |
||||
|
glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); |
||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff |
||||
|
|
||||
|
return (imgctx); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_put_image_to_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, mlx_img_list_t *img_ptr, int x, int y) |
||||
|
{ |
||||
|
mlx_img_ctx_t *imgctx; |
||||
|
|
||||
|
if (!win_ptr->pixmgt) |
||||
|
return ; |
||||
|
|
||||
|
[(id)(win_ptr->winid) selectGLContext]; |
||||
|
imgctx = add_img_to_ctx(img_ptr, win_ptr); |
||||
|
|
||||
|
// update texture |
||||
|
glBindTexture(GL_TEXTURE_2D, imgctx->texture); |
||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img_ptr->width, img_ptr->height, 0, |
||||
|
GL_BGRA, GL_UNSIGNED_BYTE, img_ptr->buffer); |
||||
|
|
||||
|
[(id)(win_ptr->winid) mlx_gl_draw_img:img_ptr andCtx:imgctx andX:x andY:y]; |
||||
|
|
||||
|
win_ptr->nb_flush ++; |
||||
|
} |
||||
|
|
||||
|
// assume here 32bpp little endian |
||||
|
|
||||
|
char *mlx_get_data_addr(mlx_img_list_t *img_ptr, int *bits_per_pixel, int *size_line, int *endian) |
||||
|
{ |
||||
|
*bits_per_pixel = UNIQ_BPP*8; |
||||
|
*size_line = img_ptr->width*UNIQ_BPP; |
||||
|
*endian = 0; // little endian for now on mac-intel |
||||
|
return (img_ptr->buffer); |
||||
|
} |
||||
|
|
||||
|
unsigned int mlx_get_color_value(mlx_ptr_t *mlx_ptr, int color) |
||||
|
{ |
||||
|
return (color); |
||||
|
} |
||||
|
|
||||
|
int mlx_string_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color, unsigned char *string) |
||||
|
{ |
||||
|
mlx_img_ctx_t *imgctx; |
||||
|
int gX; |
||||
|
int gY; |
||||
|
|
||||
|
if (!win_ptr->pixmgt) |
||||
|
return(0); |
||||
|
|
||||
|
#ifdef STRINGPUTX11 |
||||
|
y -= (FONT_HEIGHT * 2)/3; |
||||
|
#endif |
||||
|
|
||||
|
[(id)(win_ptr->winid) selectGLContext]; |
||||
|
|
||||
|
imgctx = add_img_to_ctx(mlx_ptr->font, win_ptr); |
||||
|
|
||||
|
while (*string) |
||||
|
{ |
||||
|
if (*string >= 32 && *string <= 127) |
||||
|
{ |
||||
|
gX = (FONT_WIDTH+2)*(*string-32); |
||||
|
gY = 0; |
||||
|
// printf("put char %c pos %d %d\n", *string, gX, gY); |
||||
|
[(id)(win_ptr->winid) mlx_gl_draw_font:mlx_ptr->font andCtx:imgctx andX:x andY:y andColor:color glyphX:gX glyphY:gY]; |
||||
|
#ifdef STRINGPUTX11 |
||||
|
x += FONT_WIDTH/1.4; |
||||
|
#else |
||||
|
x += FONT_WIDTH; |
||||
|
#endif |
||||
|
} |
||||
|
string ++; |
||||
|
} |
||||
|
|
||||
|
win_ptr->nb_flush ++; |
||||
|
|
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_todel) |
||||
|
{ |
||||
|
mlx_img_ctx_t ctx_first; |
||||
|
mlx_img_ctx_t *ctx; |
||||
|
mlx_img_ctx_t *ctx_to_del; |
||||
|
mlx_img_list_t img_first; |
||||
|
mlx_img_list_t *img; |
||||
|
mlx_win_list_t *win; |
||||
|
|
||||
|
img_first.next = mlx_ptr->img_list; |
||||
|
img = &img_first; |
||||
|
while (img && img->next) |
||||
|
{ |
||||
|
if (img->next == img_todel) |
||||
|
img->next = img->next->next; |
||||
|
img = img->next; |
||||
|
} |
||||
|
mlx_ptr->img_list = img_first.next; |
||||
|
|
||||
|
|
||||
|
win = mlx_ptr->win_list; |
||||
|
while (win) |
||||
|
{ |
||||
|
ctx_first.next = win->img_list; |
||||
|
ctx = &ctx_first; |
||||
|
while (ctx && ctx->next) |
||||
|
{ |
||||
|
if (ctx->next->img == img_todel) |
||||
|
{ |
||||
|
[(id)(win->winid) selectGLContext]; |
||||
|
glDeleteBuffers(1, &(ctx->next->vbuffer)); |
||||
|
glDeleteTextures(1, &(ctx->next->texture)); |
||||
|
ctx_to_del = ctx->next; |
||||
|
ctx->next = ctx->next->next; |
||||
|
free(ctx_to_del); |
||||
|
} |
||||
|
ctx = ctx->next; |
||||
|
} |
||||
|
win->img_list = ctx_first.next; |
||||
|
win = win->next; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
free(img_todel->buffer); |
||||
|
free(img_todel); |
||||
|
|
||||
|
// printf("destroy image done.\n"); |
||||
|
return (0); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,57 @@ |
|||||
|
//
|
||||
|
// mlx_int.h for minilibx
|
||||
|
//
|
||||
|
// ol@staff.42.fr
|
||||
|
//
|
||||
|
// include opengl needed before mlx_int.h
|
||||
|
//
|
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import "mlx_int.h" |
||||
|
|
||||
|
@interface NSWindowEvent : NSWindow |
||||
|
{ |
||||
|
func_t event_funct[MAX_EVENT]; |
||||
|
void *(event_param[MAX_EVENT]); |
||||
|
int keyrepeat; |
||||
|
int keyflag; |
||||
|
int size_x; |
||||
|
int size_y; |
||||
|
} |
||||
|
- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr; |
||||
|
- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; |
||||
|
- (void) setKeyRepeat:(int)mode; |
||||
|
- (void) exposeNotification:(NSNotification *)note; |
||||
|
- (void) closeNotification:(NSNotification *)note; |
||||
|
@end |
||||
|
|
||||
|
|
||||
|
@interface MlxWin : NSOpenGLView |
||||
|
{ |
||||
|
NSWindowEvent *win; |
||||
|
NSOpenGLContext *ctx; |
||||
|
glsl_info_t glsl; |
||||
|
int openglwin; |
||||
|
|
||||
|
int size_x; |
||||
|
int size_y; |
||||
|
|
||||
|
int pixel_nb; |
||||
|
GLuint pixel_vbuffer; |
||||
|
GLuint pixel_texture; |
||||
|
unsigned int *pixtexbuff; |
||||
|
} |
||||
|
|
||||
|
- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs; |
||||
|
- (void) selectGLContext; |
||||
|
- (void) flushGLContext; |
||||
|
- (void) pixelPutColor: (int)color X:(int)x Y:(int)y; |
||||
|
- (void) mlx_gl_draw; |
||||
|
- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y; |
||||
|
- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy; |
||||
|
- (NSOpenGLContext *) ctx; |
||||
|
- (NSWindowEvent *) win; |
||||
|
- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; |
||||
|
- (void) setKeyRepeat:(int)mode; |
||||
|
- (void) ctxNeedsUpdate; |
||||
|
@end |
@ -0,0 +1,766 @@ |
|||||
|
// mlx_new_window.m |
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import <OpenGL/gl3.h> |
||||
|
#import <AppKit/NSOpenGLView.h> |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <math.h> |
||||
|
|
||||
|
#include "mlx_int.h" |
||||
|
#include "mlx_new_window.h" |
||||
|
|
||||
|
|
||||
|
NSOpenGLPixelFormatAttribute pfa_attrs[] = |
||||
|
{ |
||||
|
NSOpenGLPFADepthSize, 32, |
||||
|
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, |
||||
|
0 |
||||
|
}; |
||||
|
|
||||
|
static const GLfloat pixel_vertexes[8] = |
||||
|
{ |
||||
|
-1.0 , -1.0, |
||||
|
1.0, -1.0, |
||||
|
1.0, 1.0, |
||||
|
-1.0, 1.0 |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
int get_mouse_button(NSEventType eventtype) |
||||
|
{ |
||||
|
switch (eventtype) { |
||||
|
case NSEventTypeLeftMouseDown: |
||||
|
case NSEventTypeLeftMouseUp: |
||||
|
case NSEventTypeLeftMouseDragged: |
||||
|
return 1; |
||||
|
case NSEventTypeRightMouseDown: |
||||
|
case NSEventTypeRightMouseUp: |
||||
|
case NSEventTypeRightMouseDragged: |
||||
|
return 2; |
||||
|
case NSEventTypeOtherMouseDown: |
||||
|
case NSEventTypeOtherMouseUp: |
||||
|
case NSEventTypeOtherMouseDragged: |
||||
|
return 3; |
||||
|
default: |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// classes for window & events |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@implementation NSWindowEvent |
||||
|
|
||||
|
- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr |
||||
|
{ |
||||
|
int i; |
||||
|
|
||||
|
if ((self = [super initWithContentRect:rect |
||||
|
styleMask:winstyle |
||||
|
backing:bck |
||||
|
defer:dfr])) |
||||
|
{ |
||||
|
i = MAX_EVENT; |
||||
|
while (i--) |
||||
|
{ |
||||
|
event_funct[i] = NULL; |
||||
|
event_param[i] = NULL; |
||||
|
} |
||||
|
keyrepeat = 0; |
||||
|
keyflag = 0; |
||||
|
size_x = rect.size.width; |
||||
|
size_y = rect.size.height; |
||||
|
} |
||||
|
return (self); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param |
||||
|
{ |
||||
|
event_funct[event] = func; |
||||
|
event_param[event] = param; |
||||
|
if (event == 6 || event == 32) // motion notify && high precision motion notify |
||||
|
{ |
||||
|
if (func == NULL) |
||||
|
[self setAcceptsMouseMovedEvents:NO]; |
||||
|
else |
||||
|
[self setAcceptsMouseMovedEvents:YES]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) setKeyRepeat:(int)mode |
||||
|
{ |
||||
|
keyrepeat = mode; |
||||
|
} |
||||
|
|
||||
|
- (BOOL) acceptsFirstResponder |
||||
|
{ |
||||
|
return (YES); |
||||
|
} |
||||
|
|
||||
|
- (void) flagsChanged:(NSEvent *)theEvent |
||||
|
{ |
||||
|
unsigned int flag; |
||||
|
int the_key; |
||||
|
unsigned int val; |
||||
|
|
||||
|
flag = [theEvent modifierFlags]; |
||||
|
// printf("Key flag changed: %x => %x\n", keyflag, flag); |
||||
|
// printf("**mlx flag low part : %d - %x\n", flag&0xFFFF, flag&0xFFFF); |
||||
|
|
||||
|
if (!(val = (keyflag|flag)&(~(keyflag&flag)))) |
||||
|
return ; // no change - can happen when loosing focus on special key pressed, then re-pressed later |
||||
|
the_key = 1; |
||||
|
while (((val >> (the_key-1)) & 0x01)==0) |
||||
|
the_key ++; |
||||
|
if (flag > keyflag && event_funct[2] != NULL) |
||||
|
event_funct[2](0xFF+the_key, event_param[2]); |
||||
|
if (flag < keyflag && event_funct[3] != NULL) |
||||
|
event_funct[3](0xFF+the_key, event_param[3]); |
||||
|
/* |
||||
|
if (event_funct[2] != NULL) |
||||
|
{ |
||||
|
if (!(keyflag & NSAlphaShiftKeyMask) && (flag&NSAlphaShiftKeyMask)) event_funct[2](0xFF+1, event_param[2]); |
||||
|
if (!(keyflag & NSShiftKeyMask) && (flag&NSShiftKeyMask)) event_funct[2](0xFF+2, event_param[2]); |
||||
|
if (!(keyflag & NSControlKeyMask) && (flag&NSControlKeyMask)) event_funct[2](0xFF+3, event_param[2]); |
||||
|
if (!(keyflag & NSAlternateKeyMask) && (flag&NSAlternateKeyMask)) event_funct[2](0xFF+4, event_param[2]); |
||||
|
if (!(keyflag & NSCommandKeyMask) && (flag&NSCommandKeyMask)) event_funct[2](0xFF+5, event_param[2]); |
||||
|
if (!(keyflag & NSNumericPadKeyMask) && (flag&NSNumericPadKeyMask)) event_funct[2](0xFF+6, event_param[2]); |
||||
|
if (!(keyflag & NSHelpKeyMask) && (flag&NSHelpKeyMask)) event_funct[2](0xFF+7, event_param[2]); |
||||
|
if (!(keyflag & NSFunctionKeyMask) && (flag&NSFunctionKeyMask)) event_funct[2](0xFF+8, event_param[2]); |
||||
|
} |
||||
|
if (event_funct[3] != NULL) |
||||
|
{ |
||||
|
if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](NSShiftKeyMask, event_param[3]); |
||||
|
|
||||
|
if ((keyflag & NSAlphaShiftKeyMask) && !(flag&NSAlphaShiftKeyMask)) event_funct[3](0xFF+1, event_param[3]); |
||||
|
if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](0xFF+2, event_param[3]); |
||||
|
if ((keyflag & NSControlKeyMask) && !(flag&NSControlKeyMask)) event_funct[3](0xFF+3, event_param[3]); |
||||
|
if ((keyflag & NSAlternateKeyMask) && !(flag&NSAlternateKeyMask)) event_funct[3](0xFF+4, event_param[3]); |
||||
|
if ((keyflag & NSCommandKeyMask) && !(flag&NSCommandKeyMask)) event_funct[3](0xFF+5, event_param[3]); |
||||
|
if ((keyflag & NSNumericPadKeyMask) && !(flag&NSNumericPadKeyMask)) event_funct[3](0xFF+6, event_param[3]); |
||||
|
if ((keyflag & NSHelpKeyMask) && !(flag&NSHelpKeyMask)) event_funct[3](0xFF+7, event_param[3]); |
||||
|
if ((keyflag & NSFunctionKeyMask) && !(flag&NSFunctionKeyMask)) event_funct[3](0xFF+8, event_param[3]); |
||||
|
} |
||||
|
*/ |
||||
|
keyflag = flag; |
||||
|
} |
||||
|
|
||||
|
- (void) keyDown:(NSEvent *)theEvent |
||||
|
{ |
||||
|
if (keyrepeat==0 && [theEvent isARepeat]) |
||||
|
return ; |
||||
|
// printf("Key Down: %d\n", [theEvent keyCode]); |
||||
|
if (event_funct[2] != NULL) |
||||
|
event_funct[2]([theEvent keyCode], event_param[2]); |
||||
|
// else [super keyDown: theEvent]; |
||||
|
} |
||||
|
|
||||
|
- (void) keyUp:(NSEvent *)theEvent |
||||
|
{ |
||||
|
// printf("Key Up: %d\n", [theEvent keyCode]); |
||||
|
if (event_funct[3] != NULL) |
||||
|
event_funct[3]([theEvent keyCode], event_param[3]); |
||||
|
// else [super keyUp: theEvent]; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
- (void) mouseDown:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[4] != NULL) |
||||
|
event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); |
||||
|
} |
||||
|
|
||||
|
- (void) rightMouseDown:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[4] != NULL) |
||||
|
event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); |
||||
|
} |
||||
|
|
||||
|
- (void) otherMouseDown:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[4] != NULL) |
||||
|
event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); |
||||
|
} |
||||
|
|
||||
|
- (void) mouseUp:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[5] != NULL) |
||||
|
event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); |
||||
|
} |
||||
|
|
||||
|
- (void) rightMouseUp:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[5] != NULL) |
||||
|
event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); |
||||
|
} |
||||
|
|
||||
|
- (void) otherMouseUp:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
button = get_mouse_button([theEvent type]); |
||||
|
// printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); |
||||
|
if (event_funct[5] != NULL) |
||||
|
event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); |
||||
|
} |
||||
|
|
||||
|
- (void) mouseMoved:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
// printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); |
||||
|
if (event_funct[6] != NULL) |
||||
|
event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) mouseDragged:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
// printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); |
||||
|
if (event_funct[6] != NULL) |
||||
|
event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) rightMouseDragged:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
// printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); |
||||
|
if (event_funct[6] != NULL) |
||||
|
event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) otherMouseDragged:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
|
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
// printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); |
||||
|
if (event_funct[6] != NULL) |
||||
|
event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) scrollWheel:(NSEvent *)theEvent |
||||
|
{ |
||||
|
NSPoint thepoint; |
||||
|
int button; |
||||
|
float sens; |
||||
|
|
||||
|
if (event_funct[4] == NULL) |
||||
|
return ; |
||||
|
|
||||
|
button = 0; |
||||
|
thepoint = [theEvent locationInWindow]; |
||||
|
sens = [theEvent deltaY]; |
||||
|
if (sens > 0.2) |
||||
|
button = 4; |
||||
|
if (sens < -0.2) |
||||
|
button = 5; |
||||
|
sens = [theEvent deltaX]; |
||||
|
if (sens > 0.2) |
||||
|
button = 6; |
||||
|
if (sens < -0.2) |
||||
|
button = 7; |
||||
|
if (button != 0) |
||||
|
event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) exposeNotification:(NSNotification *)note |
||||
|
{ |
||||
|
// printf("Expose...\n"); |
||||
|
if (event_funct[12] != NULL) |
||||
|
event_funct[12](event_param[12]); |
||||
|
// printf("Expose done.\n"); |
||||
|
} |
||||
|
|
||||
|
- (void) closeNotification:(NSNotification *)note |
||||
|
{ |
||||
|
if (event_funct[17] != NULL) |
||||
|
event_funct[17](event_param[17]); |
||||
|
} |
||||
|
|
||||
|
- (void) deminiaturizeNotification:(NSNotification *)note |
||||
|
{ |
||||
|
// if (event_funct[??] != NULL) |
||||
|
// event_funct[??](event_param[??]); |
||||
|
[self exposeNotification:note]; |
||||
|
} |
||||
|
@end |
||||
|
|
||||
|
|
||||
|
@implementation MlxWin |
||||
|
|
||||
|
- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs |
||||
|
{ |
||||
|
NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; |
||||
|
|
||||
|
if ((self = [super initWithFrame:rect pixelFormat:pixFmt]) != nil) |
||||
|
{ |
||||
|
NSUInteger windowStyle = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; |
||||
|
|
||||
|
win = [[NSWindowEvent alloc] initWithContentRect:rect |
||||
|
styleMask:windowStyle |
||||
|
backing:NSBackingStoreBuffered // NSBackingStoreNonretained |
||||
|
defer:NO]; |
||||
|
[win setContentView:self]; |
||||
|
[win setTitle:title]; |
||||
|
[win setKeyRepeat:1]; |
||||
|
[win makeKeyAndOrderFront:self]; |
||||
|
|
||||
|
// printf("init ctx: current %p ", [NSOpenGLContext currentContext]); |
||||
|
|
||||
|
// ctx = [[NSOpenGLContext alloc] initWithFormat:pixFmt shareContext:[NSOpenGLContext currentContext]]; //other_context]; |
||||
|
// [ctx setView:self]; |
||||
|
// [ctx makeCurrentContext]; |
||||
|
|
||||
|
[[self openGLContext] makeCurrentContext]; |
||||
|
[[self openGLContext] setView:self]; |
||||
|
[self prepareOpenGL]; |
||||
|
|
||||
|
[self setNextKeyView:self]; |
||||
|
|
||||
|
// [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidExposeNotification" object:nil]; |
||||
|
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win]; |
||||
|
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win]; |
||||
|
[[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win]; |
||||
|
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctxNeedsUpdate:) |
||||
|
// name:NSViewGlobalFrameDidChangeNotification |
||||
|
// object:nil]; |
||||
|
|
||||
|
size_x = rect.size.width; |
||||
|
size_y = rect.size.height; |
||||
|
|
||||
|
glClearColor(0, 0, 0, 0); |
||||
|
glClear(GL_COLOR_BUFFER_BIT); |
||||
|
glFlush(); |
||||
|
|
||||
|
//[win makeKeyAndOrderFront:nil]; |
||||
|
// BOOL r = [win isKeyWindow]; |
||||
|
// if (r==YES) printf("keywindow ok\n"); else printf("keywindow KO\n"); |
||||
|
|
||||
|
// Window controller subclass to set title |
||||
|
// NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:win]; |
||||
|
// [windowController windowTitleForDocumentDisplayName:title]; |
||||
|
// [windowController showWindow:nil]; |
||||
|
// MlxWinController *mlxWinCont = [[MlxWinController alloc] initWin:win andTitle:title]; |
||||
|
|
||||
|
// after nswindowcontroller who will retake first responder |
||||
|
// BOOL r = [win makeFirstResponder:nil]; |
||||
|
// if (r==YES) printf("responder ok\n"); else printf("responder KO\n"); |
||||
|
|
||||
|
[pixFmt release]; |
||||
|
} |
||||
|
return (self); |
||||
|
} |
||||
|
|
||||
|
- (int) pixel_management |
||||
|
{ |
||||
|
bzero(&glsl, sizeof(glsl)); // so gldelete[shader/program] go silent on error. |
||||
|
|
||||
|
glDisable(GL_DEPTH_TEST); |
||||
|
glGenBuffers(1, &pixel_vbuffer); |
||||
|
glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); |
||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(pixel_vertexes), pixel_vertexes, GL_DYNAMIC_DRAW); // 4 points buff |
||||
|
// pixel_ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); |
||||
|
|
||||
|
glGenTextures(1, &pixel_texture); |
||||
|
glBindTexture(GL_TEXTURE_2D, pixel_texture); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
||||
|
pixtexbuff = malloc(sizeof(unsigned int)*size_x*size_y); |
||||
|
pixel_nb = size_x*size_y; |
||||
|
while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; |
||||
|
pixel_nb = 0; |
||||
|
glTexImage2D( |
||||
|
GL_TEXTURE_2D, 0, /* target, level of detail */ |
||||
|
GL_RGBA8, /* internal format */ |
||||
|
size_x, size_y, 0, /* width, height, border */ |
||||
|
GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ |
||||
|
pixtexbuff /* pixels */ |
||||
|
); |
||||
|
// printf("pix tex err? 0x%x\n", glGetError()); |
||||
|
|
||||
|
if (mlx_shaders(&glsl)) |
||||
|
return (0); |
||||
|
|
||||
|
glUseProgram(glsl.pixel_program); |
||||
|
glsl.loc_pixel_texture = glGetUniformLocation(glsl.pixel_program, "texture"); |
||||
|
//glsl.loc_pixel_winhalfsize = glGetUniformLocation(glsl.pixel_program, "winhalfsize"); |
||||
|
glsl.loc_pixel_position = glGetAttribLocation(glsl.pixel_program, "position"); |
||||
|
// printf("err? 0x%x\n", glGetError()); |
||||
|
|
||||
|
glUseProgram(glsl.image_program); |
||||
|
glsl.loc_image_texture = glGetUniformLocation(glsl.image_program, "texture"); |
||||
|
glsl.loc_image_pos = glGetUniformLocation(glsl.image_program, "imagepos"); |
||||
|
glsl.loc_image_size = glGetUniformLocation(glsl.image_program, "imagesize"); |
||||
|
glsl.loc_image_winhalfsize = glGetUniformLocation(glsl.image_program, "winhalfsize"); |
||||
|
glsl.loc_image_position = glGetAttribLocation(glsl.image_program, "position"); |
||||
|
// printf("err? 0x%x\n", glGetError()); |
||||
|
|
||||
|
glUseProgram(glsl.font_program); |
||||
|
glsl.loc_font_texture = glGetUniformLocation(glsl.font_program, "texture"); |
||||
|
glsl.loc_font_color = glGetUniformLocation(glsl.font_program, "color"); |
||||
|
glsl.loc_font_posinwin = glGetUniformLocation(glsl.font_program, "fontposinwin"); |
||||
|
glsl.loc_font_posinatlas = glGetUniformLocation(glsl.font_program, "fontposinatlas"); |
||||
|
glsl.loc_font_atlassize = glGetUniformLocation(glsl.font_program, "fontatlassize"); |
||||
|
glsl.loc_font_winhalfsize = glGetUniformLocation(glsl.font_program, "winhalfsize"); |
||||
|
glsl.loc_font_position = glGetAttribLocation(glsl.font_program, "position"); |
||||
|
// printf("err? 0x%x\n", glGetError()); |
||||
|
|
||||
|
glFlush(); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
- (void) ctxNeedsUpdate |
||||
|
{ |
||||
|
// printf("Context update\n"); |
||||
|
[ctx update]; |
||||
|
} |
||||
|
|
||||
|
- (void) selectGLContext |
||||
|
{ |
||||
|
if ([NSOpenGLContext currentContext] != [self openGLContext]) |
||||
|
{ |
||||
|
// printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]); |
||||
|
[[self openGLContext] makeCurrentContext]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
- (void) flushGLContext |
||||
|
{ |
||||
|
[[self openGLContext] flushBuffer]; |
||||
|
} |
||||
|
|
||||
|
- (NSOpenGLContext *) ctx |
||||
|
{ |
||||
|
return (ctx); |
||||
|
} |
||||
|
|
||||
|
- (NSWindowEvent *) win |
||||
|
{ |
||||
|
return (win); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) pixelPutColor: (int)color X:(int)x Y:(int)y |
||||
|
{ |
||||
|
pixel_nb ++; |
||||
|
|
||||
|
glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); |
||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)(&color)); |
||||
|
|
||||
|
if (pixel_nb >= MAX_PIXEL_NB) |
||||
|
[self mlx_gl_draw]; |
||||
|
} |
||||
|
|
||||
|
- (void) destroyPixelManagement |
||||
|
{ |
||||
|
free(pixtexbuff); |
||||
|
[self selectGLContext]; |
||||
|
glDeleteBuffers(1, &pixel_vbuffer); |
||||
|
glDeleteTextures(1, &pixel_texture); |
||||
|
glDeleteProgram(glsl.pixel_program); |
||||
|
glDeleteProgram(glsl.image_program); |
||||
|
glDeleteShader(glsl.pixel_vshader); |
||||
|
glDeleteShader(glsl.pixel_fshader); |
||||
|
glDeleteShader(glsl.image_vshader); |
||||
|
glDeleteShader(glsl.image_fshader); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) destroyMe |
||||
|
{ |
||||
|
[[NSNotificationCenter defaultCenter] removeObserver:win]; |
||||
|
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
||||
|
// [ctx release]; |
||||
|
[win close]; |
||||
|
[self release]; |
||||
|
} |
||||
|
|
||||
|
- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param |
||||
|
{ |
||||
|
[win setEvent:event andFunc:func andParam:param]; |
||||
|
} |
||||
|
|
||||
|
- (void) setKeyRepeat:(int)mode |
||||
|
{ |
||||
|
[win setKeyRepeat:mode]; |
||||
|
} |
||||
|
|
||||
|
- (void) clearWin |
||||
|
{ |
||||
|
glClearColor(0, 0, 0, 0); |
||||
|
glClear(GL_COLOR_BUFFER_BIT); |
||||
|
} |
||||
|
|
||||
|
- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y |
||||
|
{ |
||||
|
|
||||
|
if (pixel_nb >0) |
||||
|
[self mlx_gl_draw]; |
||||
|
|
||||
|
glUseProgram(glsl.image_program); |
||||
|
|
||||
|
glActiveTexture(GL_TEXTURE0); |
||||
|
glBindTexture(GL_TEXTURE_2D, imgctx->texture); |
||||
|
glUniform1i(glsl.loc_image_texture, 0); |
||||
|
|
||||
|
glUniform2f(glsl.loc_image_winhalfsize, size_x/2, size_y/2); |
||||
|
glUniform2f(glsl.loc_image_pos, x, size_y - y); |
||||
|
glUniform2f(glsl.loc_image_size, img->width, -img->height); |
||||
|
|
||||
|
glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); |
||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); |
||||
|
glEnableVertexAttribArray(0); |
||||
|
|
||||
|
glEnable(GL_BLEND); |
||||
|
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst |
||||
|
glBlendEquation(GL_FUNC_ADD); |
||||
|
|
||||
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
||||
|
glDisableVertexAttribArray(0); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy |
||||
|
{ |
||||
|
GLfloat color_tab[4]; |
||||
|
|
||||
|
if (pixel_nb >0) |
||||
|
[self mlx_gl_draw]; |
||||
|
|
||||
|
color_tab[0] = ((float)((color&0xFF0000)>>16))/255.0; |
||||
|
color_tab[1] = ((float)((color&0xFF00)>>8))/255.0; |
||||
|
color_tab[2] = ((float)((color&0xFF)>>0))/255.0; |
||||
|
color_tab[3] = 1.0; |
||||
|
glUseProgram(glsl.font_program); |
||||
|
|
||||
|
glActiveTexture(GL_TEXTURE0); |
||||
|
glBindTexture(GL_TEXTURE_2D, imgctx->texture); |
||||
|
glUniform1i(glsl.loc_font_texture, 0); |
||||
|
glUniform4fv(glsl.loc_font_color, 1, color_tab); |
||||
|
|
||||
|
glUniform2f(glsl.loc_font_winhalfsize, size_x/2, size_y/2); |
||||
|
glUniform2f(glsl.loc_font_posinwin, x, size_y - 1 - y); |
||||
|
glUniform2f(glsl.loc_font_posinatlas, gx, gy); |
||||
|
glUniform2f(glsl.loc_font_atlassize, img->width, img->height); |
||||
|
|
||||
|
glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); |
||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); |
||||
|
glEnableVertexAttribArray(0); |
||||
|
|
||||
|
glEnable(GL_BLEND); |
||||
|
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst |
||||
|
glBlendEquation(GL_FUNC_ADD); |
||||
|
|
||||
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
||||
|
glDisableVertexAttribArray(0); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
- (void) mlx_gl_draw |
||||
|
{ |
||||
|
if (pixel_nb <= 0) |
||||
|
return ; |
||||
|
|
||||
|
glUseProgram(glsl.pixel_program); |
||||
|
|
||||
|
glActiveTexture(GL_TEXTURE0); |
||||
|
glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); |
||||
|
glUniform1i(glsl.loc_pixel_texture, 0); |
||||
|
|
||||
|
glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); |
||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); |
||||
|
glEnableVertexAttribArray(0); |
||||
|
|
||||
|
glEnable(GL_BLEND); |
||||
|
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst |
||||
|
glBlendEquation(GL_FUNC_ADD); |
||||
|
|
||||
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
||||
|
glDisableVertexAttribArray(0); |
||||
|
|
||||
|
pixel_nb = size_x*size_y; |
||||
|
while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; |
||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size_x, size_y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixtexbuff); |
||||
|
pixel_nb = 0; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@end |
||||
|
|
||||
|
|
||||
|
// mlx API |
||||
|
|
||||
|
|
||||
|
void *mlx_new_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) |
||||
|
{ |
||||
|
mlx_win_list_t *newwin; |
||||
|
NSString *str; |
||||
|
|
||||
|
if ((newwin = malloc(sizeof(*newwin))) == NULL) |
||||
|
return ((void *)0); |
||||
|
newwin->img_list = NULL; |
||||
|
newwin->next = mlx_ptr->win_list; |
||||
|
newwin->nb_flush = 0; |
||||
|
newwin->pixmgt = 1; |
||||
|
mlx_ptr->win_list = newwin; |
||||
|
|
||||
|
NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); |
||||
|
str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; |
||||
|
newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs]; |
||||
|
if (newwin->winid) |
||||
|
if (![(id)(newwin->winid) pixel_management]) |
||||
|
{ |
||||
|
[(id)(newwin->winid) destroyPixelManagement]; |
||||
|
[(id)(newwin->winid) destroyMe]; |
||||
|
} |
||||
|
return ((void *)newwin); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_clear_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) selectGLContext]; |
||||
|
[(id)(win_ptr->winid) clearWin]; |
||||
|
win_ptr->nb_flush ++; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_expose_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) setEvent:12 andFunc:funct_ptr andParam:param]; |
||||
|
} |
||||
|
|
||||
|
void mlx_key_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) setEvent:3 andFunc:funct_ptr andParam:param]; |
||||
|
} |
||||
|
|
||||
|
void mlx_mouse_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) setEvent:4 andFunc:funct_ptr andParam:param]; |
||||
|
} |
||||
|
|
||||
|
void mlx_hook(mlx_win_list_t *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) setEvent:x_event andFunc:funct_ptr andParam:param]; |
||||
|
} |
||||
|
|
||||
|
int mlx_do_key_autorepeatoff(mlx_ptr_t *mlx_ptr) |
||||
|
{ |
||||
|
mlx_win_list_t *win; |
||||
|
|
||||
|
win = mlx_ptr->win_list; |
||||
|
while (win) |
||||
|
{ |
||||
|
[(id)(win->winid) setKeyRepeat:0]; |
||||
|
win = win->next; |
||||
|
} |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
int mlx_do_key_autorepeaton(mlx_ptr_t *mlx_ptr) |
||||
|
{ |
||||
|
mlx_win_list_t *win; |
||||
|
|
||||
|
win = mlx_ptr->win_list; |
||||
|
while (win) |
||||
|
{ |
||||
|
[(id)(win->winid) setKeyRepeat:1]; |
||||
|
win = win->next; |
||||
|
} |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_destroy_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_to_del) |
||||
|
{ |
||||
|
mlx_win_list_t first; |
||||
|
mlx_win_list_t *win; |
||||
|
mlx_img_ctx_t *ctx; |
||||
|
mlx_img_ctx_t *ctx2; |
||||
|
|
||||
|
first.next = mlx_ptr->win_list; |
||||
|
win = &first; |
||||
|
while (win && win->next) |
||||
|
{ |
||||
|
if (win->next == win_to_del) |
||||
|
win->next = win->next->next; |
||||
|
win = win->next; |
||||
|
} |
||||
|
mlx_ptr->win_list = first.next; |
||||
|
|
||||
|
if (win_to_del->pixmgt) |
||||
|
{ |
||||
|
[(id)(win_to_del->winid) selectGLContext]; |
||||
|
ctx = win_to_del->img_list; // should be null anyway if no pixel management |
||||
|
while (ctx) |
||||
|
{ |
||||
|
glDeleteBuffers(1, &(ctx->vbuffer)); |
||||
|
glDeleteTextures(1, &(ctx->texture)); |
||||
|
ctx2 = ctx; |
||||
|
ctx = ctx->next; |
||||
|
free(ctx2); |
||||
|
} |
||||
|
[(id)(win_to_del->winid) destroyPixelManagement]; |
||||
|
} |
||||
|
[(id)(win_to_del->winid) destroyMe]; |
||||
|
free(win_to_del); |
||||
|
|
||||
|
// printf("destroy window done.\n"); |
||||
|
mlx_do_sync(mlx_ptr); |
||||
|
return (0); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,21 @@ |
|||||
|
/*
|
||||
|
** |
||||
|
** mlx_opengl.h |
||||
|
** |
||||
|
** public include, use it after mlx.h |
||||
|
** designed only for minilibx_macos |
||||
|
** |
||||
|
*/ |
||||
|
|
||||
|
void *mlx_new_opengl_window(void *mlx_ptr, int size_x, int size_y, char *title); |
||||
|
|
||||
|
/* create an opengl window. put_image & pixel_put & string_put do not work there. */ |
||||
|
|
||||
|
int mlx_opengl_swap_buffers(void *win_ptr); |
||||
|
|
||||
|
/* the created window is double buffered. Use this funct to swap buffers */ |
||||
|
/* this funct will call glFlush(). Don't call it. */ |
||||
|
|
||||
|
int mlx_opengl_window_set_context(void *win_ptr); |
||||
|
|
||||
|
/* in case multiple opengl windows are present, change opengl active context */ |
@ -0,0 +1,57 @@ |
|||||
|
// mlx_opengl.m |
||||
|
|
||||
|
#import <Cocoa/Cocoa.h> |
||||
|
#import <OpenGL/gl3.h> |
||||
|
#import <AppKit/NSOpenGLView.h> |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
|
||||
|
#include "mlx_int.h" |
||||
|
#include "mlx_new_window.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
NSOpenGLPixelFormatAttribute pfa_attrs_opengl[] = |
||||
|
{ |
||||
|
NSOpenGLPFADepthSize, 32, |
||||
|
NSOpenGLPFADoubleBuffer, |
||||
|
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, |
||||
|
0 |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
void *mlx_new_opengl_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) |
||||
|
{ |
||||
|
mlx_win_list_t *newwin; |
||||
|
NSString *str; |
||||
|
|
||||
|
if ((newwin = malloc(sizeof(*newwin))) == NULL) |
||||
|
return ((void *)0); |
||||
|
newwin->img_list = NULL; |
||||
|
newwin->next = mlx_ptr->win_list; |
||||
|
newwin->nb_flush = 0; |
||||
|
newwin->pixmgt = 0; |
||||
|
mlx_ptr->win_list = newwin; |
||||
|
|
||||
|
NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); |
||||
|
str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; |
||||
|
newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs_opengl]; |
||||
|
|
||||
|
return ((void *)newwin); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_opengl_swap_buffers(mlx_win_list_t *win_ptr) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) flushGLContext]; |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
int mlx_opengl_window_set_context(mlx_win_list_t *win_ptr) |
||||
|
{ |
||||
|
[(id)(win_ptr->winid) selectGLContext]; |
||||
|
return (0); |
||||
|
} |
@ -0,0 +1,418 @@ |
|||||
|
|
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/mman.h> |
||||
|
#include <unistd.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <err.h> |
||||
|
#include <string.h> |
||||
|
#include <arpa/inet.h> |
||||
|
|
||||
|
#include "zlib.h" |
||||
|
|
||||
|
#include <OpenGL/gl3.h> |
||||
|
#include "mlx_int.h" |
||||
|
|
||||
|
|
||||
|
#define PNG_MAGIC_SIZE 8 |
||||
|
unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; |
||||
|
#define PNG_HDR_SIZE 13 |
||||
|
|
||||
|
#define Z_CHUNK 32768 |
||||
|
|
||||
|
#define ERR_MAGIC_SIZE 1 |
||||
|
#define ERR_MAGIC_WRONG 2 |
||||
|
#define ERR_STRUCT_INCOMPLETE 3 |
||||
|
#define ERR_STRUCT_HDR 4 |
||||
|
#define ERR_STRUCT_END 5 |
||||
|
#define ERR_STRUCT_CRC 6 |
||||
|
#define ERR_STRUCT_INCIMPL 7 |
||||
|
#define ERR_STRUCT_DAT 8 |
||||
|
#define ERR_STRUCT_MISSCHK 9 |
||||
|
#define ERR_ZLIB 10 |
||||
|
#define ERR_DATA_MISMATCH 11 |
||||
|
#define ERR_DATA_FILTER 12 |
||||
|
char *(mipng_err[]) = |
||||
|
{ |
||||
|
"No error", |
||||
|
"Not enough size for magic", |
||||
|
"Wrong magic", |
||||
|
"Incomplete chunk structure", |
||||
|
"Duplicate or incorrect header", |
||||
|
"Duplicate or incorrect end", |
||||
|
"Invalid CRC in chunk", |
||||
|
"Incorrect header or configuration not implemented", |
||||
|
"Non consecutive dat chunks", |
||||
|
"Missing header/dat/end chunk(s)", |
||||
|
"Zlib inflate error", |
||||
|
"Inflated data size mismatch", |
||||
|
"Unknown scanline filter" |
||||
|
}; |
||||
|
|
||||
|
typedef struct png_info_s |
||||
|
{ |
||||
|
unsigned int width; |
||||
|
unsigned int height; |
||||
|
int depth; |
||||
|
int color; |
||||
|
int interlace; |
||||
|
int bpp; |
||||
|
} png_info_t; |
||||
|
|
||||
|
|
||||
|
int mipng_is_type(unsigned char *ptr, char *type) |
||||
|
{ |
||||
|
if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) |
||||
|
return (1); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) |
||||
|
{ return (buff[pos]); } |
||||
|
unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) |
||||
|
{ return (buff[pos]+(unsigned int)a); } |
||||
|
unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) |
||||
|
{ return (buff[pos]+(unsigned int)b); } |
||||
|
unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) |
||||
|
{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } |
||||
|
unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) |
||||
|
{ |
||||
|
int p; |
||||
|
int result; |
||||
|
|
||||
|
p = a + b - c; |
||||
|
if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) |
||||
|
result = a; |
||||
|
else |
||||
|
if (abs(a - c) <= abs(a + b - c - c)) |
||||
|
result = b; |
||||
|
else |
||||
|
result = c; |
||||
|
return (buff[pos]+result); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = |
||||
|
{ |
||||
|
mipng_defilter_none, |
||||
|
mipng_defilter_sub, |
||||
|
mipng_defilter_up, |
||||
|
mipng_defilter_average, |
||||
|
mipng_defilter_paeth |
||||
|
}; |
||||
|
|
||||
|
// only work for mlx mac or img 32bpp
|
||||
|
int mipng_fill_img(mlx_img_list_t *img, unsigned char *buf, png_info_t *pi) |
||||
|
{ |
||||
|
unsigned int current_filter; |
||||
|
int ipos; |
||||
|
int bpos; |
||||
|
int ilen; |
||||
|
int iline; |
||||
|
int blen; |
||||
|
unsigned char tmp; |
||||
|
unsigned char *ibuf; |
||||
|
|
||||
|
ibuf = (unsigned char *)img->buffer; |
||||
|
iline = img->width * UNIQ_BPP; |
||||
|
ilen = img->width * img->height * UNIQ_BPP; |
||||
|
blen = img->width * img->height * pi->bpp + img->height; |
||||
|
ipos = 0; |
||||
|
bpos = 0; |
||||
|
while (ipos < ilen && bpos < blen) |
||||
|
{ |
||||
|
if ((ipos % iline) == 0) |
||||
|
{ |
||||
|
if ((current_filter = buf[bpos++]) > 4) |
||||
|
return (ERR_DATA_FILTER); |
||||
|
} |
||||
|
ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, |
||||
|
ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, |
||||
|
(ipos>=iline)?ibuf[ipos-iline]:0, |
||||
|
(ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); |
||||
|
ipos ++; |
||||
|
bpos ++; |
||||
|
if (pi->depth == 16) |
||||
|
bpos ++; |
||||
|
if (ipos % 4 == 3 && pi->color == 2) // no alpha
|
||||
|
img->buffer[ipos++] = 0xFF; |
||||
|
} |
||||
|
if (ipos != ilen || bpos != blen) |
||||
|
{ |
||||
|
// printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen);
|
||||
|
return (ERR_DATA_MISMATCH); |
||||
|
} |
||||
|
ipos = 0; |
||||
|
while (ipos < ilen) |
||||
|
{ |
||||
|
tmp = ibuf[ipos]; |
||||
|
ibuf[ipos] = ibuf[ipos+2]; |
||||
|
ibuf[ipos+2] = tmp; |
||||
|
ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; |
||||
|
ipos += UNIQ_BPP; |
||||
|
} |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mipng_data(mlx_img_list_t *img, unsigned char *dat, png_info_t *pi) |
||||
|
{ |
||||
|
unsigned int len; |
||||
|
int b_pos; |
||||
|
unsigned char *buffer; |
||||
|
int ret; |
||||
|
int z_ret; |
||||
|
unsigned z_have; |
||||
|
z_stream z_strm; |
||||
|
unsigned char z_out[Z_CHUNK]; |
||||
|
|
||||
|
b_pos = 0; |
||||
|
if (!(buffer = malloc((long long)img->width*(long long)img->height*(long long)pi->bpp + img->height))) |
||||
|
err(1, "Can't malloc"); |
||||
|
z_strm.zalloc = Z_NULL; |
||||
|
z_strm.zfree = Z_NULL; |
||||
|
z_strm.opaque = Z_NULL; |
||||
|
z_strm.avail_in = 0; |
||||
|
z_strm.next_in = Z_NULL; |
||||
|
z_ret = inflateInit(&z_strm); |
||||
|
if (z_ret != Z_OK) |
||||
|
return (ERR_ZLIB); |
||||
|
|
||||
|
while (mipng_is_type(dat, "IDAT")) |
||||
|
{ |
||||
|
len = *((unsigned int *)dat); |
||||
|
len = ntohl(len); |
||||
|
z_strm.avail_in = len; |
||||
|
z_strm.next_in = dat + 8; |
||||
|
z_strm.avail_out = 0; |
||||
|
while (z_strm.avail_out == 0) |
||||
|
{ |
||||
|
z_strm.avail_out = Z_CHUNK; |
||||
|
z_strm.next_out = z_out; |
||||
|
z_ret = inflate(&z_strm, Z_NO_FLUSH); |
||||
|
// printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out);
|
||||
|
if (z_ret != Z_OK && z_ret != Z_STREAM_END) |
||||
|
{ |
||||
|
inflateEnd(&z_strm); |
||||
|
return (ERR_ZLIB); |
||||
|
} |
||||
|
if (b_pos + Z_CHUNK - z_strm.avail_out > img->width*img->height*pi->bpp+img->height) |
||||
|
{ |
||||
|
inflateEnd(&z_strm); |
||||
|
return (ERR_DATA_MISMATCH); |
||||
|
} |
||||
|
bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); |
||||
|
b_pos += Z_CHUNK - z_strm.avail_out; |
||||
|
} |
||||
|
dat += len + 4 + 4 + 4; |
||||
|
} |
||||
|
inflateEnd(&z_strm); |
||||
|
if (b_pos != img->width*img->height*pi->bpp+img->height) |
||||
|
{ |
||||
|
// printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height);
|
||||
|
return (ERR_DATA_MISMATCH); |
||||
|
} |
||||
|
if ((ret = mipng_fill_img(img, buffer, pi))) |
||||
|
return (ret); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
int mipng_magic(unsigned char *ptr, int size) |
||||
|
{ |
||||
|
int i; |
||||
|
|
||||
|
if (size < PNG_MAGIC_SIZE) |
||||
|
return (ERR_MAGIC_SIZE); |
||||
|
i = 0; |
||||
|
while (i < PNG_MAGIC_SIZE) |
||||
|
if (*(ptr++) != magic[i++]) |
||||
|
return (ERR_MAGIC_WRONG); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; |
||||
|
|
||||
|
// From http://www.w3.org/TR/PNG/#D-CRCAppendix
|
||||
|
int mipng_crc(unsigned char *ptr, int len) |
||||
|
{ |
||||
|
unsigned int file_crc; |
||||
|
unsigned long crc; |
||||
|
int i; |
||||
|
|
||||
|
file_crc = *((unsigned int *)(ptr+4+4+len)); |
||||
|
file_crc = ntohl(file_crc); |
||||
|
|
||||
|
crc = 0xffffffffL; |
||||
|
i = 0; |
||||
|
while (i < len+4) |
||||
|
crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); |
||||
|
crc ^= 0xffffffffL; |
||||
|
|
||||
|
if (file_crc != crc) |
||||
|
return (1); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) |
||||
|
{ |
||||
|
unsigned int len; |
||||
|
int dat_state; |
||||
|
int end; |
||||
|
|
||||
|
dat_state = 0; |
||||
|
*hdr = NULL; |
||||
|
*dat = NULL; |
||||
|
end = 0; |
||||
|
while (size) |
||||
|
{ |
||||
|
if (size >= 4) // length present
|
||||
|
{ |
||||
|
len = *((unsigned int *)ptr); |
||||
|
len = ntohl(len); |
||||
|
if (size < 4 + 4 + 4 + len) |
||||
|
return (ERR_STRUCT_INCOMPLETE); |
||||
|
if (mipng_crc(ptr, len)) |
||||
|
return (ERR_STRUCT_CRC); |
||||
|
// printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7));
|
||||
|
if (mipng_is_type(ptr, "IHDR")) |
||||
|
{ |
||||
|
if (*hdr || len != PNG_HDR_SIZE) |
||||
|
return (ERR_STRUCT_HDR); |
||||
|
*hdr = ptr; |
||||
|
} |
||||
|
if (mipng_is_type(ptr, "IEND")) |
||||
|
{ |
||||
|
if (len != 0 || size != 4+4+4) |
||||
|
return (ERR_STRUCT_END); |
||||
|
end = 1; |
||||
|
} |
||||
|
if (mipng_is_type(ptr, "IDAT")) |
||||
|
{ |
||||
|
if (dat_state == 0) |
||||
|
{ |
||||
|
dat_state = 1; |
||||
|
*dat = ptr; |
||||
|
} |
||||
|
if (dat_state == 2) |
||||
|
return (ERR_STRUCT_DAT); |
||||
|
} |
||||
|
else |
||||
|
if (dat_state == 1) |
||||
|
dat_state = 2; |
||||
|
size -= 4+4+4+len; |
||||
|
ptr += 4+4+4+len; |
||||
|
} |
||||
|
else |
||||
|
return (ERR_STRUCT_INCOMPLETE); |
||||
|
} |
||||
|
if (*hdr == 0 || *dat == 0 || end == 0) |
||||
|
return (ERR_STRUCT_MISSCHK); |
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) |
||||
|
{ |
||||
|
unsigned int compress; |
||||
|
unsigned int filter; |
||||
|
|
||||
|
hdr += 8; |
||||
|
pi->width = ntohl(*((unsigned long *)hdr)); |
||||
|
pi->height = ntohl(*((unsigned long *)(hdr+4))); |
||||
|
pi->depth = *(hdr+8); |
||||
|
pi->color = *(hdr+9); |
||||
|
compress = *(hdr+10); |
||||
|
filter = *(hdr+11); |
||||
|
pi->interlace = *(hdr+12); |
||||
|
if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) |
||||
|
|| (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) |
||||
|
return (ERR_STRUCT_INCIMPL); |
||||
|
pi->bpp = pi->depth / 8; |
||||
|
if (pi->color == 2) |
||||
|
pi->bpp *= 3; |
||||
|
if (pi->color == 6) |
||||
|
pi->bpp *= 4; |
||||
|
// printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n",
|
||||
|
// pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp);
|
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
mlx_img_list_t *mlx_int_parse_png(mlx_ptr_t *xvar, unsigned char *fptr, int size) |
||||
|
{ |
||||
|
int err; |
||||
|
unsigned char *hdr; |
||||
|
unsigned char *dat; |
||||
|
png_info_t pi; |
||||
|
mlx_img_list_t *img; |
||||
|
|
||||
|
if ((err = mipng_magic(fptr, size))) |
||||
|
{ |
||||
|
warnx("mlx PNG error : %s", mipng_err[err]); |
||||
|
return ((mlx_img_list_t *)0); |
||||
|
} |
||||
|
fptr += PNG_MAGIC_SIZE; |
||||
|
size -= PNG_MAGIC_SIZE; |
||||
|
if ((err = mipng_structure(fptr, size, &hdr, &dat))) |
||||
|
{ |
||||
|
warnx("mlx PNG error : %s", mipng_err[err]); |
||||
|
return ((mlx_img_list_t *)0); |
||||
|
} |
||||
|
if ((err = mipng_verif_hdr(hdr, &pi))) |
||||
|
{ |
||||
|
warnx("mlx PNG error : %s", mipng_err[err]); |
||||
|
return ((mlx_img_list_t *)0); |
||||
|
} |
||||
|
if (!(img = mlx_new_image(xvar, pi.width, pi.height))) |
||||
|
{ |
||||
|
warnx("mlx PNG error : Can't create mlx image"); |
||||
|
return ((mlx_img_list_t *)0); |
||||
|
} |
||||
|
if ((err = mipng_data(img, dat, &pi))) |
||||
|
{ |
||||
|
mlx_destroy_image(xvar, img); |
||||
|
warnx("mlx PNG error : %s", mipng_err[err]); |
||||
|
return ((mlx_img_list_t *)0); |
||||
|
} |
||||
|
return (img); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
void *mlx_png_file_to_image(mlx_ptr_t *xvar, char *file, int *width, int *height) |
||||
|
{ |
||||
|
int fd; |
||||
|
int size; |
||||
|
unsigned char *ptr; |
||||
|
mlx_img_list_t *img; |
||||
|
|
||||
|
if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || |
||||
|
(ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) |
||||
|
{ |
||||
|
if (fd >= 0) |
||||
|
close(fd); |
||||
|
warnx("Can't map png file '%s'", file); |
||||
|
return ((void *)0); |
||||
|
} |
||||
|
if ((img = mlx_int_parse_png(xvar, ptr, size))) |
||||
|
{ |
||||
|
*width = img->width; |
||||
|
*height = img->height; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
*width = 0; |
||||
|
*height = 0; |
||||
|
} |
||||
|
munmap(ptr,size); |
||||
|
close(fd); |
||||
|
return (img); |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
|
||||
|
|
||||
|
|
||||
|
void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height); |
Binary file not shown.
@ -0,0 +1,763 @@ |
|||||
|
/*
|
||||
|
** This is a generated file with rgb2c.pl and rgb.txt from |
||||
|
** the XFree86 distribution. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
struct s_col_name mlx_col_name[] = |
||||
|
{ |
||||
|
{ "snow" , 0xfffafa }, |
||||
|
{ "ghost white" , 0xf8f8ff }, |
||||
|
{ "ghostwhite" , 0xf8f8ff }, |
||||
|
{ "white smoke" , 0xf5f5f5 }, |
||||
|
{ "whitesmoke" , 0xf5f5f5 }, |
||||
|
{ "gainsboro" , 0xdcdcdc }, |
||||
|
{ "floral white" , 0xfffaf0 }, |
||||
|
{ "floralwhite" , 0xfffaf0 }, |
||||
|
{ "old lace" , 0xfdf5e6 }, |
||||
|
{ "oldlace" , 0xfdf5e6 }, |
||||
|
{ "linen" , 0xfaf0e6 }, |
||||
|
{ "antique white" , 0xfaebd7 }, |
||||
|
{ "antiquewhite" , 0xfaebd7 }, |
||||
|
{ "papaya whip" , 0xffefd5 }, |
||||
|
{ "papayawhip" , 0xffefd5 }, |
||||
|
{ "blanched almond" , 0xffebcd }, |
||||
|
{ "blanchedalmond" , 0xffebcd }, |
||||
|
{ "bisque" , 0xffe4c4 }, |
||||
|
{ "peach puff" , 0xffdab9 }, |
||||
|
{ "peachpuff" , 0xffdab9 }, |
||||
|
{ "navajo white" , 0xffdead }, |
||||
|
{ "navajowhite" , 0xffdead }, |
||||
|
{ "moccasin" , 0xffe4b5 }, |
||||
|
{ "cornsilk" , 0xfff8dc }, |
||||
|
{ "ivory" , 0xfffff0 }, |
||||
|
{ "lemon chiffon" , 0xfffacd }, |
||||
|
{ "lemonchiffon" , 0xfffacd }, |
||||
|
{ "seashell" , 0xfff5ee }, |
||||
|
{ "honeydew" , 0xf0fff0 }, |
||||
|
{ "mint cream" , 0xf5fffa }, |
||||
|
{ "mintcream" , 0xf5fffa }, |
||||
|
{ "azure" , 0xf0ffff }, |
||||
|
{ "alice blue" , 0xf0f8ff }, |
||||
|
{ "aliceblue" , 0xf0f8ff }, |
||||
|
{ "lavender" , 0xe6e6fa }, |
||||
|
{ "lavender blush" , 0xfff0f5 }, |
||||
|
{ "lavenderblush" , 0xfff0f5 }, |
||||
|
{ "misty rose" , 0xffe4e1 }, |
||||
|
{ "mistyrose" , 0xffe4e1 }, |
||||
|
{ "white" , 0xffffff }, |
||||
|
{ "black" , 0x0 }, |
||||
|
{ "dark slate" , 0x2f4f4f }, |
||||
|
{ "darkslategray" , 0x2f4f4f }, |
||||
|
{ "dark slate" , 0x2f4f4f }, |
||||
|
{ "darkslategrey" , 0x2f4f4f }, |
||||
|
{ "dim gray" , 0x696969 }, |
||||
|
{ "dimgray" , 0x696969 }, |
||||
|
{ "dim grey" , 0x696969 }, |
||||
|
{ "dimgrey" , 0x696969 }, |
||||
|
{ "slate gray" , 0x708090 }, |
||||
|
{ "slategray" , 0x708090 }, |
||||
|
{ "slate grey" , 0x708090 }, |
||||
|
{ "slategrey" , 0x708090 }, |
||||
|
{ "light slate" , 0x778899 }, |
||||
|
{ "lightslategray" , 0x778899 }, |
||||
|
{ "light slate" , 0x778899 }, |
||||
|
{ "lightslategrey" , 0x778899 }, |
||||
|
{ "gray" , 0xbebebe }, |
||||
|
{ "grey" , 0xbebebe }, |
||||
|
{ "light grey" , 0xd3d3d3 }, |
||||
|
{ "lightgrey" , 0xd3d3d3 }, |
||||
|
{ "light gray" , 0xd3d3d3 }, |
||||
|
{ "lightgray" , 0xd3d3d3 }, |
||||
|
{ "midnight blue" , 0x191970 }, |
||||
|
{ "midnightblue" , 0x191970 }, |
||||
|
{ "navy" , 0x80 }, |
||||
|
{ "navy blue" , 0x80 }, |
||||
|
{ "navyblue" , 0x80 }, |
||||
|
{ "cornflower blue" , 0x6495ed }, |
||||
|
{ "cornflowerblue" , 0x6495ed }, |
||||
|
{ "dark slate" , 0x483d8b }, |
||||
|
{ "darkslateblue" , 0x483d8b }, |
||||
|
{ "slate blue" , 0x6a5acd }, |
||||
|
{ "slateblue" , 0x6a5acd }, |
||||
|
{ "medium slate" , 0x7b68ee }, |
||||
|
{ "mediumslateblue" , 0x7b68ee }, |
||||
|
{ "light slate" , 0x8470ff }, |
||||
|
{ "lightslateblue" , 0x8470ff }, |
||||
|
{ "medium blue" , 0xcd }, |
||||
|
{ "mediumblue" , 0xcd }, |
||||
|
{ "royal blue" , 0x4169e1 }, |
||||
|
{ "royalblue" , 0x4169e1 }, |
||||
|
{ "blue" , 0xff }, |
||||
|
{ "dodger blue" , 0x1e90ff }, |
||||
|
{ "dodgerblue" , 0x1e90ff }, |
||||
|
{ "deep sky" , 0xbfff }, |
||||
|
{ "deepskyblue" , 0xbfff }, |
||||
|
{ "sky blue" , 0x87ceeb }, |
||||
|
{ "skyblue" , 0x87ceeb }, |
||||
|
{ "light sky" , 0x87cefa }, |
||||
|
{ "lightskyblue" , 0x87cefa }, |
||||
|
{ "steel blue" , 0x4682b4 }, |
||||
|
{ "steelblue" , 0x4682b4 }, |
||||
|
{ "light steel" , 0xb0c4de }, |
||||
|
{ "lightsteelblue" , 0xb0c4de }, |
||||
|
{ "light blue" , 0xadd8e6 }, |
||||
|
{ "lightblue" , 0xadd8e6 }, |
||||
|
{ "powder blue" , 0xb0e0e6 }, |
||||
|
{ "powderblue" , 0xb0e0e6 }, |
||||
|
{ "pale turquoise" , 0xafeeee }, |
||||
|
{ "paleturquoise" , 0xafeeee }, |
||||
|
{ "dark turquoise" , 0xced1 }, |
||||
|
{ "darkturquoise" , 0xced1 }, |
||||
|
{ "medium turquoise" , 0x48d1cc }, |
||||
|
{ "mediumturquoise" , 0x48d1cc }, |
||||
|
{ "turquoise" , 0x40e0d0 }, |
||||
|
{ "cyan" , 0xffff }, |
||||
|
{ "light cyan" , 0xe0ffff }, |
||||
|
{ "lightcyan" , 0xe0ffff }, |
||||
|
{ "cadet blue" , 0x5f9ea0 }, |
||||
|
{ "cadetblue" , 0x5f9ea0 }, |
||||
|
{ "medium aquamarine" , 0x66cdaa }, |
||||
|
{ "mediumaquamarine" , 0x66cdaa }, |
||||
|
{ "aquamarine" , 0x7fffd4 }, |
||||
|
{ "dark green" , 0x6400 }, |
||||
|
{ "darkgreen" , 0x6400 }, |
||||
|
{ "dark olive" , 0x556b2f }, |
||||
|
{ "darkolivegreen" , 0x556b2f }, |
||||
|
{ "dark sea" , 0x8fbc8f }, |
||||
|
{ "darkseagreen" , 0x8fbc8f }, |
||||
|
{ "sea green" , 0x2e8b57 }, |
||||
|
{ "seagreen" , 0x2e8b57 }, |
||||
|
{ "medium sea" , 0x3cb371 }, |
||||
|
{ "mediumseagreen" , 0x3cb371 }, |
||||
|
{ "light sea" , 0x20b2aa }, |
||||
|
{ "lightseagreen" , 0x20b2aa }, |
||||
|
{ "pale green" , 0x98fb98 }, |
||||
|
{ "palegreen" , 0x98fb98 }, |
||||
|
{ "spring green" , 0xff7f }, |
||||
|
{ "springgreen" , 0xff7f }, |
||||
|
{ "lawn green" , 0x7cfc00 }, |
||||
|
{ "lawngreen" , 0x7cfc00 }, |
||||
|
{ "green" , 0xff00 }, |
||||
|
{ "chartreuse" , 0x7fff00 }, |
||||
|
{ "medium spring" , 0xfa9a }, |
||||
|
{ "mediumspringgreen" , 0xfa9a }, |
||||
|
{ "green yellow" , 0xadff2f }, |
||||
|
{ "greenyellow" , 0xadff2f }, |
||||
|
{ "lime green" , 0x32cd32 }, |
||||
|
{ "limegreen" , 0x32cd32 }, |
||||
|
{ "yellow green" , 0x9acd32 }, |
||||
|
{ "yellowgreen" , 0x9acd32 }, |
||||
|
{ "forest green" , 0x228b22 }, |
||||
|
{ "forestgreen" , 0x228b22 }, |
||||
|
{ "olive drab" , 0x6b8e23 }, |
||||
|
{ "olivedrab" , 0x6b8e23 }, |
||||
|
{ "dark khaki" , 0xbdb76b }, |
||||
|
{ "darkkhaki" , 0xbdb76b }, |
||||
|
{ "khaki" , 0xf0e68c }, |
||||
|
{ "pale goldenrod" , 0xeee8aa }, |
||||
|
{ "palegoldenrod" , 0xeee8aa }, |
||||
|
{ "light goldenrod" , 0xfafad2 }, |
||||
|
{ "lightgoldenrodyellow" , 0xfafad2 }, |
||||
|
{ "light yellow" , 0xffffe0 }, |
||||
|
{ "lightyellow" , 0xffffe0 }, |
||||
|
{ "yellow" , 0xffff00 }, |
||||
|
{ "gold" , 0xffd700 }, |
||||
|
{ "light goldenrod" , 0xeedd82 }, |
||||
|
{ "lightgoldenrod" , 0xeedd82 }, |
||||
|
{ "goldenrod" , 0xdaa520 }, |
||||
|
{ "dark goldenrod" , 0xb8860b }, |
||||
|
{ "darkgoldenrod" , 0xb8860b }, |
||||
|
{ "rosy brown" , 0xbc8f8f }, |
||||
|
{ "rosybrown" , 0xbc8f8f }, |
||||
|
{ "indian red" , 0xcd5c5c }, |
||||
|
{ "indianred" , 0xcd5c5c }, |
||||
|
{ "saddle brown" , 0x8b4513 }, |
||||
|
{ "saddlebrown" , 0x8b4513 }, |
||||
|
{ "sienna" , 0xa0522d }, |
||||
|
{ "peru" , 0xcd853f }, |
||||
|
{ "burlywood" , 0xdeb887 }, |
||||
|
{ "beige" , 0xf5f5dc }, |
||||
|
{ "wheat" , 0xf5deb3 }, |
||||
|
{ "sandy brown" , 0xf4a460 }, |
||||
|
{ "sandybrown" , 0xf4a460 }, |
||||
|
{ "tan" , 0xd2b48c }, |
||||
|
{ "chocolate" , 0xd2691e }, |
||||
|
{ "firebrick" , 0xb22222 }, |
||||
|
{ "brown" , 0xa52a2a }, |
||||
|
{ "dark salmon" , 0xe9967a }, |
||||
|
{ "darksalmon" , 0xe9967a }, |
||||
|
{ "salmon" , 0xfa8072 }, |
||||
|
{ "light salmon" , 0xffa07a }, |
||||
|
{ "lightsalmon" , 0xffa07a }, |
||||
|
{ "orange" , 0xffa500 }, |
||||
|
{ "dark orange" , 0xff8c00 }, |
||||
|
{ "darkorange" , 0xff8c00 }, |
||||
|
{ "coral" , 0xff7f50 }, |
||||
|
{ "light coral" , 0xf08080 }, |
||||
|
{ "lightcoral" , 0xf08080 }, |
||||
|
{ "tomato" , 0xff6347 }, |
||||
|
{ "orange red" , 0xff4500 }, |
||||
|
{ "orangered" , 0xff4500 }, |
||||
|
{ "red" , 0xff0000 }, |
||||
|
{ "hot pink" , 0xff69b4 }, |
||||
|
{ "hotpink" , 0xff69b4 }, |
||||
|
{ "deep pink" , 0xff1493 }, |
||||
|
{ "deeppink" , 0xff1493 }, |
||||
|
{ "pink" , 0xffc0cb }, |
||||
|
{ "light pink" , 0xffb6c1 }, |
||||
|
{ "lightpink" , 0xffb6c1 }, |
||||
|
{ "pale violet" , 0xdb7093 }, |
||||
|
{ "palevioletred" , 0xdb7093 }, |
||||
|
{ "maroon" , 0xb03060 }, |
||||
|
{ "medium violet" , 0xc71585 }, |
||||
|
{ "mediumvioletred" , 0xc71585 }, |
||||
|
{ "violet red" , 0xd02090 }, |
||||
|
{ "violetred" , 0xd02090 }, |
||||
|
{ "magenta" , 0xff00ff }, |
||||
|
{ "violet" , 0xee82ee }, |
||||
|
{ "plum" , 0xdda0dd }, |
||||
|
{ "orchid" , 0xda70d6 }, |
||||
|
{ "medium orchid" , 0xba55d3 }, |
||||
|
{ "mediumorchid" , 0xba55d3 }, |
||||
|
{ "dark orchid" , 0x9932cc }, |
||||
|
{ "darkorchid" , 0x9932cc }, |
||||
|
{ "dark violet" , 0x9400d3 }, |
||||
|
{ "darkviolet" , 0x9400d3 }, |
||||
|
{ "blue violet" , 0x8a2be2 }, |
||||
|
{ "blueviolet" , 0x8a2be2 }, |
||||
|
{ "purple" , 0xa020f0 }, |
||||
|
{ "medium purple" , 0x9370db }, |
||||
|
{ "mediumpurple" , 0x9370db }, |
||||
|
{ "thistle" , 0xd8bfd8 }, |
||||
|
{ "snow1" , 0xfffafa }, |
||||
|
{ "snow2" , 0xeee9e9 }, |
||||
|
{ "snow3" , 0xcdc9c9 }, |
||||
|
{ "snow4" , 0x8b8989 }, |
||||
|
{ "seashell1" , 0xfff5ee }, |
||||
|
{ "seashell2" , 0xeee5de }, |
||||
|
{ "seashell3" , 0xcdc5bf }, |
||||
|
{ "seashell4" , 0x8b8682 }, |
||||
|
{ "antiquewhite1" , 0xffefdb }, |
||||
|
{ "antiquewhite2" , 0xeedfcc }, |
||||
|
{ "antiquewhite3" , 0xcdc0b0 }, |
||||
|
{ "antiquewhite4" , 0x8b8378 }, |
||||
|
{ "bisque1" , 0xffe4c4 }, |
||||
|
{ "bisque2" , 0xeed5b7 }, |
||||
|
{ "bisque3" , 0xcdb79e }, |
||||
|
{ "bisque4" , 0x8b7d6b }, |
||||
|
{ "peachpuff1" , 0xffdab9 }, |
||||
|
{ "peachpuff2" , 0xeecbad }, |
||||
|
{ "peachpuff3" , 0xcdaf95 }, |
||||
|
{ "peachpuff4" , 0x8b7765 }, |
||||
|
{ "navajowhite1" , 0xffdead }, |
||||
|
{ "navajowhite2" , 0xeecfa1 }, |
||||
|
{ "navajowhite3" , 0xcdb38b }, |
||||
|
{ "navajowhite4" , 0x8b795e }, |
||||
|
{ "lemonchiffon1" , 0xfffacd }, |
||||
|
{ "lemonchiffon2" , 0xeee9bf }, |
||||
|
{ "lemonchiffon3" , 0xcdc9a5 }, |
||||
|
{ "lemonchiffon4" , 0x8b8970 }, |
||||
|
{ "cornsilk1" , 0xfff8dc }, |
||||
|
{ "cornsilk2" , 0xeee8cd }, |
||||
|
{ "cornsilk3" , 0xcdc8b1 }, |
||||
|
{ "cornsilk4" , 0x8b8878 }, |
||||
|
{ "ivory1" , 0xfffff0 }, |
||||
|
{ "ivory2" , 0xeeeee0 }, |
||||
|
{ "ivory3" , 0xcdcdc1 }, |
||||
|
{ "ivory4" , 0x8b8b83 }, |
||||
|
{ "honeydew1" , 0xf0fff0 }, |
||||
|
{ "honeydew2" , 0xe0eee0 }, |
||||
|
{ "honeydew3" , 0xc1cdc1 }, |
||||
|
{ "honeydew4" , 0x838b83 }, |
||||
|
{ "lavenderblush1" , 0xfff0f5 }, |
||||
|
{ "lavenderblush2" , 0xeee0e5 }, |
||||
|
{ "lavenderblush3" , 0xcdc1c5 }, |
||||
|
{ "lavenderblush4" , 0x8b8386 }, |
||||
|
{ "mistyrose1" , 0xffe4e1 }, |
||||
|
{ "mistyrose2" , 0xeed5d2 }, |
||||
|
{ "mistyrose3" , 0xcdb7b5 }, |
||||
|
{ "mistyrose4" , 0x8b7d7b }, |
||||
|
{ "azure1" , 0xf0ffff }, |
||||
|
{ "azure2" , 0xe0eeee }, |
||||
|
{ "azure3" , 0xc1cdcd }, |
||||
|
{ "azure4" , 0x838b8b }, |
||||
|
{ "slateblue1" , 0x836fff }, |
||||
|
{ "slateblue2" , 0x7a67ee }, |
||||
|
{ "slateblue3" , 0x6959cd }, |
||||
|
{ "slateblue4" , 0x473c8b }, |
||||
|
{ "royalblue1" , 0x4876ff }, |
||||
|
{ "royalblue2" , 0x436eee }, |
||||
|
{ "royalblue3" , 0x3a5fcd }, |
||||
|
{ "royalblue4" , 0x27408b }, |
||||
|
{ "blue1" , 0xff }, |
||||
|
{ "blue2" , 0xee }, |
||||
|
{ "blue3" , 0xcd }, |
||||
|
{ "blue4" , 0x8b }, |
||||
|
{ "dodgerblue1" , 0x1e90ff }, |
||||
|
{ "dodgerblue2" , 0x1c86ee }, |
||||
|
{ "dodgerblue3" , 0x1874cd }, |
||||
|
{ "dodgerblue4" , 0x104e8b }, |
||||
|
{ "steelblue1" , 0x63b8ff }, |
||||
|
{ "steelblue2" , 0x5cacee }, |
||||
|
{ "steelblue3" , 0x4f94cd }, |
||||
|
{ "steelblue4" , 0x36648b }, |
||||
|
{ "deepskyblue1" , 0xbfff }, |
||||
|
{ "deepskyblue2" , 0xb2ee }, |
||||
|
{ "deepskyblue3" , 0x9acd }, |
||||
|
{ "deepskyblue4" , 0x688b }, |
||||
|
{ "skyblue1" , 0x87ceff }, |
||||
|
{ "skyblue2" , 0x7ec0ee }, |
||||
|
{ "skyblue3" , 0x6ca6cd }, |
||||
|
{ "skyblue4" , 0x4a708b }, |
||||
|
{ "lightskyblue1" , 0xb0e2ff }, |
||||
|
{ "lightskyblue2" , 0xa4d3ee }, |
||||
|
{ "lightskyblue3" , 0x8db6cd }, |
||||
|
{ "lightskyblue4" , 0x607b8b }, |
||||
|
{ "slategray1" , 0xc6e2ff }, |
||||
|
{ "slategray2" , 0xb9d3ee }, |
||||
|
{ "slategray3" , 0x9fb6cd }, |
||||
|
{ "slategray4" , 0x6c7b8b }, |
||||
|
{ "lightsteelblue1" , 0xcae1ff }, |
||||
|
{ "lightsteelblue2" , 0xbcd2ee }, |
||||
|
{ "lightsteelblue3" , 0xa2b5cd }, |
||||
|
{ "lightsteelblue4" , 0x6e7b8b }, |
||||
|
{ "lightblue1" , 0xbfefff }, |
||||
|
{ "lightblue2" , 0xb2dfee }, |
||||
|
{ "lightblue3" , 0x9ac0cd }, |
||||
|
{ "lightblue4" , 0x68838b }, |
||||
|
{ "lightcyan1" , 0xe0ffff }, |
||||
|
{ "lightcyan2" , 0xd1eeee }, |
||||
|
{ "lightcyan3" , 0xb4cdcd }, |
||||
|
{ "lightcyan4" , 0x7a8b8b }, |
||||
|
{ "paleturquoise1" , 0xbbffff }, |
||||
|
{ "paleturquoise2" , 0xaeeeee }, |
||||
|
{ "paleturquoise3" , 0x96cdcd }, |
||||
|
{ "paleturquoise4" , 0x668b8b }, |
||||
|
{ "cadetblue1" , 0x98f5ff }, |
||||
|
{ "cadetblue2" , 0x8ee5ee }, |
||||
|
{ "cadetblue3" , 0x7ac5cd }, |
||||
|
{ "cadetblue4" , 0x53868b }, |
||||
|
{ "turquoise1" , 0xf5ff }, |
||||
|
{ "turquoise2" , 0xe5ee }, |
||||
|
{ "turquoise3" , 0xc5cd }, |
||||
|
{ "turquoise4" , 0x868b }, |
||||
|
{ "cyan1" , 0xffff }, |
||||
|
{ "cyan2" , 0xeeee }, |
||||
|
{ "cyan3" , 0xcdcd }, |
||||
|
{ "cyan4" , 0x8b8b }, |
||||
|
{ "darkslategray1" , 0x97ffff }, |
||||
|
{ "darkslategray2" , 0x8deeee }, |
||||
|
{ "darkslategray3" , 0x79cdcd }, |
||||
|
{ "darkslategray4" , 0x528b8b }, |
||||
|
{ "aquamarine1" , 0x7fffd4 }, |
||||
|
{ "aquamarine2" , 0x76eec6 }, |
||||
|
{ "aquamarine3" , 0x66cdaa }, |
||||
|
{ "aquamarine4" , 0x458b74 }, |
||||
|
{ "darkseagreen1" , 0xc1ffc1 }, |
||||
|
{ "darkseagreen2" , 0xb4eeb4 }, |
||||
|
{ "darkseagreen3" , 0x9bcd9b }, |
||||
|
{ "darkseagreen4" , 0x698b69 }, |
||||
|
{ "seagreen1" , 0x54ff9f }, |
||||
|
{ "seagreen2" , 0x4eee94 }, |
||||
|
{ "seagreen3" , 0x43cd80 }, |
||||
|
{ "seagreen4" , 0x2e8b57 }, |
||||
|
{ "palegreen1" , 0x9aff9a }, |
||||
|
{ "palegreen2" , 0x90ee90 }, |
||||
|
{ "palegreen3" , 0x7ccd7c }, |
||||
|
{ "palegreen4" , 0x548b54 }, |
||||
|
{ "springgreen1" , 0xff7f }, |
||||
|
{ "springgreen2" , 0xee76 }, |
||||
|
{ "springgreen3" , 0xcd66 }, |
||||
|
{ "springgreen4" , 0x8b45 }, |
||||
|
{ "green1" , 0xff00 }, |
||||
|
{ "green2" , 0xee00 }, |
||||
|
{ "green3" , 0xcd00 }, |
||||
|
{ "green4" , 0x8b00 }, |
||||
|
{ "chartreuse1" , 0x7fff00 }, |
||||
|
{ "chartreuse2" , 0x76ee00 }, |
||||
|
{ "chartreuse3" , 0x66cd00 }, |
||||
|
{ "chartreuse4" , 0x458b00 }, |
||||
|
{ "olivedrab1" , 0xc0ff3e }, |
||||
|
{ "olivedrab2" , 0xb3ee3a }, |
||||
|
{ "olivedrab3" , 0x9acd32 }, |
||||
|
{ "olivedrab4" , 0x698b22 }, |
||||
|
{ "darkolivegreen1" , 0xcaff70 }, |
||||
|
{ "darkolivegreen2" , 0xbcee68 }, |
||||
|
{ "darkolivegreen3" , 0xa2cd5a }, |
||||
|
{ "darkolivegreen4" , 0x6e8b3d }, |
||||
|
{ "khaki1" , 0xfff68f }, |
||||
|
{ "khaki2" , 0xeee685 }, |
||||
|
{ "khaki3" , 0xcdc673 }, |
||||
|
{ "khaki4" , 0x8b864e }, |
||||
|
{ "lightgoldenrod1" , 0xffec8b }, |
||||
|
{ "lightgoldenrod2" , 0xeedc82 }, |
||||
|
{ "lightgoldenrod3" , 0xcdbe70 }, |
||||
|
{ "lightgoldenrod4" , 0x8b814c }, |
||||
|
{ "lightyellow1" , 0xffffe0 }, |
||||
|
{ "lightyellow2" , 0xeeeed1 }, |
||||
|
{ "lightyellow3" , 0xcdcdb4 }, |
||||
|
{ "lightyellow4" , 0x8b8b7a }, |
||||
|
{ "yellow1" , 0xffff00 }, |
||||
|
{ "yellow2" , 0xeeee00 }, |
||||
|
{ "yellow3" , 0xcdcd00 }, |
||||
|
{ "yellow4" , 0x8b8b00 }, |
||||
|
{ "gold1" , 0xffd700 }, |
||||
|
{ "gold2" , 0xeec900 }, |
||||
|
{ "gold3" , 0xcdad00 }, |
||||
|
{ "gold4" , 0x8b7500 }, |
||||
|
{ "goldenrod1" , 0xffc125 }, |
||||
|
{ "goldenrod2" , 0xeeb422 }, |
||||
|
{ "goldenrod3" , 0xcd9b1d }, |
||||
|
{ "goldenrod4" , 0x8b6914 }, |
||||
|
{ "darkgoldenrod1" , 0xffb90f }, |
||||
|
{ "darkgoldenrod2" , 0xeead0e }, |
||||
|
{ "darkgoldenrod3" , 0xcd950c }, |
||||
|
{ "darkgoldenrod4" , 0x8b6508 }, |
||||
|
{ "rosybrown1" , 0xffc1c1 }, |
||||
|
{ "rosybrown2" , 0xeeb4b4 }, |
||||
|
{ "rosybrown3" , 0xcd9b9b }, |
||||
|
{ "rosybrown4" , 0x8b6969 }, |
||||
|
{ "indianred1" , 0xff6a6a }, |
||||
|
{ "indianred2" , 0xee6363 }, |
||||
|
{ "indianred3" , 0xcd5555 }, |
||||
|
{ "indianred4" , 0x8b3a3a }, |
||||
|
{ "sienna1" , 0xff8247 }, |
||||
|
{ "sienna2" , 0xee7942 }, |
||||
|
{ "sienna3" , 0xcd6839 }, |
||||
|
{ "sienna4" , 0x8b4726 }, |
||||
|
{ "burlywood1" , 0xffd39b }, |
||||
|
{ "burlywood2" , 0xeec591 }, |
||||
|
{ "burlywood3" , 0xcdaa7d }, |
||||
|
{ "burlywood4" , 0x8b7355 }, |
||||
|
{ "wheat1" , 0xffe7ba }, |
||||
|
{ "wheat2" , 0xeed8ae }, |
||||
|
{ "wheat3" , 0xcdba96 }, |
||||
|
{ "wheat4" , 0x8b7e66 }, |
||||
|
{ "tan1" , 0xffa54f }, |
||||
|
{ "tan2" , 0xee9a49 }, |
||||
|
{ "tan3" , 0xcd853f }, |
||||
|
{ "tan4" , 0x8b5a2b }, |
||||
|
{ "chocolate1" , 0xff7f24 }, |
||||
|
{ "chocolate2" , 0xee7621 }, |
||||
|
{ "chocolate3" , 0xcd661d }, |
||||
|
{ "chocolate4" , 0x8b4513 }, |
||||
|
{ "firebrick1" , 0xff3030 }, |
||||
|
{ "firebrick2" , 0xee2c2c }, |
||||
|
{ "firebrick3" , 0xcd2626 }, |
||||
|
{ "firebrick4" , 0x8b1a1a }, |
||||
|
{ "brown1" , 0xff4040 }, |
||||
|
{ "brown2" , 0xee3b3b }, |
||||
|
{ "brown3" , 0xcd3333 }, |
||||
|
{ "brown4" , 0x8b2323 }, |
||||
|
{ "salmon1" , 0xff8c69 }, |
||||
|
{ "salmon2" , 0xee8262 }, |
||||
|
{ "salmon3" , 0xcd7054 }, |
||||
|
{ "salmon4" , 0x8b4c39 }, |
||||
|
{ "lightsalmon1" , 0xffa07a }, |
||||
|
{ "lightsalmon2" , 0xee9572 }, |
||||
|
{ "lightsalmon3" , 0xcd8162 }, |
||||
|
{ "lightsalmon4" , 0x8b5742 }, |
||||
|
{ "orange1" , 0xffa500 }, |
||||
|
{ "orange2" , 0xee9a00 }, |
||||
|
{ "orange3" , 0xcd8500 }, |
||||
|
{ "orange4" , 0x8b5a00 }, |
||||
|
{ "darkorange1" , 0xff7f00 }, |
||||
|
{ "darkorange2" , 0xee7600 }, |
||||
|
{ "darkorange3" , 0xcd6600 }, |
||||
|
{ "darkorange4" , 0x8b4500 }, |
||||
|
{ "coral1" , 0xff7256 }, |
||||
|
{ "coral2" , 0xee6a50 }, |
||||
|
{ "coral3" , 0xcd5b45 }, |
||||
|
{ "coral4" , 0x8b3e2f }, |
||||
|
{ "tomato1" , 0xff6347 }, |
||||
|
{ "tomato2" , 0xee5c42 }, |
||||
|
{ "tomato3" , 0xcd4f39 }, |
||||
|
{ "tomato4" , 0x8b3626 }, |
||||
|
{ "orangered1" , 0xff4500 }, |
||||
|
{ "orangered2" , 0xee4000 }, |
||||
|
{ "orangered3" , 0xcd3700 }, |
||||
|
{ "orangered4" , 0x8b2500 }, |
||||
|
{ "red1" , 0xff0000 }, |
||||
|
{ "red2" , 0xee0000 }, |
||||
|
{ "red3" , 0xcd0000 }, |
||||
|
{ "red4" , 0x8b0000 }, |
||||
|
{ "deeppink1" , 0xff1493 }, |
||||
|
{ "deeppink2" , 0xee1289 }, |
||||
|
{ "deeppink3" , 0xcd1076 }, |
||||
|
{ "deeppink4" , 0x8b0a50 }, |
||||
|
{ "hotpink1" , 0xff6eb4 }, |
||||
|
{ "hotpink2" , 0xee6aa7 }, |
||||
|
{ "hotpink3" , 0xcd6090 }, |
||||
|
{ "hotpink4" , 0x8b3a62 }, |
||||
|
{ "pink1" , 0xffb5c5 }, |
||||
|
{ "pink2" , 0xeea9b8 }, |
||||
|
{ "pink3" , 0xcd919e }, |
||||
|
{ "pink4" , 0x8b636c }, |
||||
|
{ "lightpink1" , 0xffaeb9 }, |
||||
|
{ "lightpink2" , 0xeea2ad }, |
||||
|
{ "lightpink3" , 0xcd8c95 }, |
||||
|
{ "lightpink4" , 0x8b5f65 }, |
||||
|
{ "palevioletred1" , 0xff82ab }, |
||||
|
{ "palevioletred2" , 0xee799f }, |
||||
|
{ "palevioletred3" , 0xcd6889 }, |
||||
|
{ "palevioletred4" , 0x8b475d }, |
||||
|
{ "maroon1" , 0xff34b3 }, |
||||
|
{ "maroon2" , 0xee30a7 }, |
||||
|
{ "maroon3" , 0xcd2990 }, |
||||
|
{ "maroon4" , 0x8b1c62 }, |
||||
|
{ "violetred1" , 0xff3e96 }, |
||||
|
{ "violetred2" , 0xee3a8c }, |
||||
|
{ "violetred3" , 0xcd3278 }, |
||||
|
{ "violetred4" , 0x8b2252 }, |
||||
|
{ "magenta1" , 0xff00ff }, |
||||
|
{ "magenta2" , 0xee00ee }, |
||||
|
{ "magenta3" , 0xcd00cd }, |
||||
|
{ "magenta4" , 0x8b008b }, |
||||
|
{ "orchid1" , 0xff83fa }, |
||||
|
{ "orchid2" , 0xee7ae9 }, |
||||
|
{ "orchid3" , 0xcd69c9 }, |
||||
|
{ "orchid4" , 0x8b4789 }, |
||||
|
{ "plum1" , 0xffbbff }, |
||||
|
{ "plum2" , 0xeeaeee }, |
||||
|
{ "plum3" , 0xcd96cd }, |
||||
|
{ "plum4" , 0x8b668b }, |
||||
|
{ "mediumorchid1" , 0xe066ff }, |
||||
|
{ "mediumorchid2" , 0xd15fee }, |
||||
|
{ "mediumorchid3" , 0xb452cd }, |
||||
|
{ "mediumorchid4" , 0x7a378b }, |
||||
|
{ "darkorchid1" , 0xbf3eff }, |
||||
|
{ "darkorchid2" , 0xb23aee }, |
||||
|
{ "darkorchid3" , 0x9a32cd }, |
||||
|
{ "darkorchid4" , 0x68228b }, |
||||
|
{ "purple1" , 0x9b30ff }, |
||||
|
{ "purple2" , 0x912cee }, |
||||
|
{ "purple3" , 0x7d26cd }, |
||||
|
{ "purple4" , 0x551a8b }, |
||||
|
{ "mediumpurple1" , 0xab82ff }, |
||||
|
{ "mediumpurple2" , 0x9f79ee }, |
||||
|
{ "mediumpurple3" , 0x8968cd }, |
||||
|
{ "mediumpurple4" , 0x5d478b }, |
||||
|
{ "thistle1" , 0xffe1ff }, |
||||
|
{ "thistle2" , 0xeed2ee }, |
||||
|
{ "thistle3" , 0xcdb5cd }, |
||||
|
{ "thistle4" , 0x8b7b8b }, |
||||
|
{ "gray0" , 0x0 }, |
||||
|
{ "grey0" , 0x0 }, |
||||
|
{ "gray1" , 0x30303 }, |
||||
|
{ "grey1" , 0x30303 }, |
||||
|
{ "gray2" , 0x50505 }, |
||||
|
{ "grey2" , 0x50505 }, |
||||
|
{ "gray3" , 0x80808 }, |
||||
|
{ "grey3" , 0x80808 }, |
||||
|
{ "gray4" , 0xa0a0a }, |
||||
|
{ "grey4" , 0xa0a0a }, |
||||
|
{ "gray5" , 0xd0d0d }, |
||||
|
{ "grey5" , 0xd0d0d }, |
||||
|
{ "gray6" , 0xf0f0f }, |
||||
|
{ "grey6" , 0xf0f0f }, |
||||
|
{ "gray7" , 0x121212 }, |
||||
|
{ "grey7" , 0x121212 }, |
||||
|
{ "gray8" , 0x141414 }, |
||||
|
{ "grey8" , 0x141414 }, |
||||
|
{ "gray9" , 0x171717 }, |
||||
|
{ "grey9" , 0x171717 }, |
||||
|
{ "gray10" , 0x1a1a1a }, |
||||
|
{ "grey10" , 0x1a1a1a }, |
||||
|
{ "gray11" , 0x1c1c1c }, |
||||
|
{ "grey11" , 0x1c1c1c }, |
||||
|
{ "gray12" , 0x1f1f1f }, |
||||
|
{ "grey12" , 0x1f1f1f }, |
||||
|
{ "gray13" , 0x212121 }, |
||||
|
{ "grey13" , 0x212121 }, |
||||
|
{ "gray14" , 0x242424 }, |
||||
|
{ "grey14" , 0x242424 }, |
||||
|
{ "gray15" , 0x262626 }, |
||||
|
{ "grey15" , 0x262626 }, |
||||
|
{ "gray16" , 0x292929 }, |
||||
|
{ "grey16" , 0x292929 }, |
||||
|
{ "gray17" , 0x2b2b2b }, |
||||
|
{ "grey17" , 0x2b2b2b }, |
||||
|
{ "gray18" , 0x2e2e2e }, |
||||
|
{ "grey18" , 0x2e2e2e }, |
||||
|
{ "gray19" , 0x303030 }, |
||||
|
{ "grey19" , 0x303030 }, |
||||
|
{ "gray20" , 0x333333 }, |
||||
|
{ "grey20" , 0x333333 }, |
||||
|
{ "gray21" , 0x363636 }, |
||||
|
{ "grey21" , 0x363636 }, |
||||
|
{ "gray22" , 0x383838 }, |
||||
|
{ "grey22" , 0x383838 }, |
||||
|
{ "gray23" , 0x3b3b3b }, |
||||
|
{ "grey23" , 0x3b3b3b }, |
||||
|
{ "gray24" , 0x3d3d3d }, |
||||
|
{ "grey24" , 0x3d3d3d }, |
||||
|
{ "gray25" , 0x404040 }, |
||||
|
{ "grey25" , 0x404040 }, |
||||
|
{ "gray26" , 0x424242 }, |
||||
|
{ "grey26" , 0x424242 }, |
||||
|
{ "gray27" , 0x454545 }, |
||||
|
{ "grey27" , 0x454545 }, |
||||
|
{ "gray28" , 0x474747 }, |
||||
|
{ "grey28" , 0x474747 }, |
||||
|
{ "gray29" , 0x4a4a4a }, |
||||
|
{ "grey29" , 0x4a4a4a }, |
||||
|
{ "gray30" , 0x4d4d4d }, |
||||
|
{ "grey30" , 0x4d4d4d }, |
||||
|
{ "gray31" , 0x4f4f4f }, |
||||
|
{ "grey31" , 0x4f4f4f }, |
||||
|
{ "gray32" , 0x525252 }, |
||||
|
{ "grey32" , 0x525252 }, |
||||
|
{ "gray33" , 0x545454 }, |
||||
|
{ "grey33" , 0x545454 }, |
||||
|
{ "gray34" , 0x575757 }, |
||||
|
{ "grey34" , 0x575757 }, |
||||
|
{ "gray35" , 0x595959 }, |
||||
|
{ "grey35" , 0x595959 }, |
||||
|
{ "gray36" , 0x5c5c5c }, |
||||
|
{ "grey36" , 0x5c5c5c }, |
||||
|
{ "gray37" , 0x5e5e5e }, |
||||
|
{ "grey37" , 0x5e5e5e }, |
||||
|
{ "gray38" , 0x616161 }, |
||||
|
{ "grey38" , 0x616161 }, |
||||
|
{ "gray39" , 0x636363 }, |
||||
|
{ "grey39" , 0x636363 }, |
||||
|
{ "gray40" , 0x666666 }, |
||||
|
{ "grey40" , 0x666666 }, |
||||
|
{ "gray41" , 0x696969 }, |
||||
|
{ "grey41" , 0x696969 }, |
||||
|
{ "gray42" , 0x6b6b6b }, |
||||
|
{ "grey42" , 0x6b6b6b }, |
||||
|
{ "gray43" , 0x6e6e6e }, |
||||
|
{ "grey43" , 0x6e6e6e }, |
||||
|
{ "gray44" , 0x707070 }, |
||||
|
{ "grey44" , 0x707070 }, |
||||
|
{ "gray45" , 0x737373 }, |
||||
|
{ "grey45" , 0x737373 }, |
||||
|
{ "gray46" , 0x757575 }, |
||||
|
{ "grey46" , 0x757575 }, |
||||
|
{ "gray47" , 0x787878 }, |
||||
|
{ "grey47" , 0x787878 }, |
||||
|
{ "gray48" , 0x7a7a7a }, |
||||
|
{ "grey48" , 0x7a7a7a }, |
||||
|
{ "gray49" , 0x7d7d7d }, |
||||
|
{ "grey49" , 0x7d7d7d }, |
||||
|
{ "gray50" , 0x7f7f7f }, |
||||
|
{ "grey50" , 0x7f7f7f }, |
||||
|
{ "gray51" , 0x828282 }, |
||||
|
{ "grey51" , 0x828282 }, |
||||
|
{ "gray52" , 0x858585 }, |
||||
|
{ "grey52" , 0x858585 }, |
||||
|
{ "gray53" , 0x878787 }, |
||||
|
{ "grey53" , 0x878787 }, |
||||
|
{ "gray54" , 0x8a8a8a }, |
||||
|
{ "grey54" , 0x8a8a8a }, |
||||
|
{ "gray55" , 0x8c8c8c }, |
||||
|
{ "grey55" , 0x8c8c8c }, |
||||
|
{ "gray56" , 0x8f8f8f }, |
||||
|
{ "grey56" , 0x8f8f8f }, |
||||
|
{ "gray57" , 0x919191 }, |
||||
|
{ "grey57" , 0x919191 }, |
||||
|
{ "gray58" , 0x949494 }, |
||||
|
{ "grey58" , 0x949494 }, |
||||
|
{ "gray59" , 0x969696 }, |
||||
|
{ "grey59" , 0x969696 }, |
||||
|
{ "gray60" , 0x999999 }, |
||||
|
{ "grey60" , 0x999999 }, |
||||
|
{ "gray61" , 0x9c9c9c }, |
||||
|
{ "grey61" , 0x9c9c9c }, |
||||
|
{ "gray62" , 0x9e9e9e }, |
||||
|
{ "grey62" , 0x9e9e9e }, |
||||
|
{ "gray63" , 0xa1a1a1 }, |
||||
|
{ "grey63" , 0xa1a1a1 }, |
||||
|
{ "gray64" , 0xa3a3a3 }, |
||||
|
{ "grey64" , 0xa3a3a3 }, |
||||
|
{ "gray65" , 0xa6a6a6 }, |
||||
|
{ "grey65" , 0xa6a6a6 }, |
||||
|
{ "gray66" , 0xa8a8a8 }, |
||||
|
{ "grey66" , 0xa8a8a8 }, |
||||
|
{ "gray67" , 0xababab }, |
||||
|
{ "grey67" , 0xababab }, |
||||
|
{ "gray68" , 0xadadad }, |
||||
|
{ "grey68" , 0xadadad }, |
||||
|
{ "gray69" , 0xb0b0b0 }, |
||||
|
{ "grey69" , 0xb0b0b0 }, |
||||
|
{ "gray70" , 0xb3b3b3 }, |
||||
|
{ "grey70" , 0xb3b3b3 }, |
||||
|
{ "gray71" , 0xb5b5b5 }, |
||||
|
{ "grey71" , 0xb5b5b5 }, |
||||
|
{ "gray72" , 0xb8b8b8 }, |
||||
|
{ "grey72" , 0xb8b8b8 }, |
||||
|
{ "gray73" , 0xbababa }, |
||||
|
{ "grey73" , 0xbababa }, |
||||
|
{ "gray74" , 0xbdbdbd }, |
||||
|
{ "grey74" , 0xbdbdbd }, |
||||
|
{ "gray75" , 0xbfbfbf }, |
||||
|
{ "grey75" , 0xbfbfbf }, |
||||
|
{ "gray76" , 0xc2c2c2 }, |
||||
|
{ "grey76" , 0xc2c2c2 }, |
||||
|
{ "gray77" , 0xc4c4c4 }, |
||||
|
{ "grey77" , 0xc4c4c4 }, |
||||
|
{ "gray78" , 0xc7c7c7 }, |
||||
|
{ "grey78" , 0xc7c7c7 }, |
||||
|
{ "gray79" , 0xc9c9c9 }, |
||||
|
{ "grey79" , 0xc9c9c9 }, |
||||
|
{ "gray80" , 0xcccccc }, |
||||
|
{ "grey80" , 0xcccccc }, |
||||
|
{ "gray81" , 0xcfcfcf }, |
||||
|
{ "grey81" , 0xcfcfcf }, |
||||
|
{ "gray82" , 0xd1d1d1 }, |
||||
|
{ "grey82" , 0xd1d1d1 }, |
||||
|
{ "gray83" , 0xd4d4d4 }, |
||||
|
{ "grey83" , 0xd4d4d4 }, |
||||
|
{ "gray84" , 0xd6d6d6 }, |
||||
|
{ "grey84" , 0xd6d6d6 }, |
||||
|
{ "gray85" , 0xd9d9d9 }, |
||||
|
{ "grey85" , 0xd9d9d9 }, |
||||
|
{ "gray86" , 0xdbdbdb }, |
||||
|
{ "grey86" , 0xdbdbdb }, |
||||
|
{ "gray87" , 0xdedede }, |
||||
|
{ "grey87" , 0xdedede }, |
||||
|
{ "gray88" , 0xe0e0e0 }, |
||||
|
{ "grey88" , 0xe0e0e0 }, |
||||
|
{ "gray89" , 0xe3e3e3 }, |
||||
|
{ "grey89" , 0xe3e3e3 }, |
||||
|
{ "gray90" , 0xe5e5e5 }, |
||||
|
{ "grey90" , 0xe5e5e5 }, |
||||
|
{ "gray91" , 0xe8e8e8 }, |
||||
|
{ "grey91" , 0xe8e8e8 }, |
||||
|
{ "gray92" , 0xebebeb }, |
||||
|
{ "grey92" , 0xebebeb }, |
||||
|
{ "gray93" , 0xededed }, |
||||
|
{ "grey93" , 0xededed }, |
||||
|
{ "gray94" , 0xf0f0f0 }, |
||||
|
{ "grey94" , 0xf0f0f0 }, |
||||
|
{ "gray95" , 0xf2f2f2 }, |
||||
|
{ "grey95" , 0xf2f2f2 }, |
||||
|
{ "gray96" , 0xf5f5f5 }, |
||||
|
{ "grey96" , 0xf5f5f5 }, |
||||
|
{ "gray97" , 0xf7f7f7 }, |
||||
|
{ "grey97" , 0xf7f7f7 }, |
||||
|
{ "gray98" , 0xfafafa }, |
||||
|
{ "grey98" , 0xfafafa }, |
||||
|
{ "gray99" , 0xfcfcfc }, |
||||
|
{ "grey99" , 0xfcfcfc }, |
||||
|
{ "gray100" , 0xffffff }, |
||||
|
{ "grey100" , 0xffffff }, |
||||
|
{ "dark grey" , 0xa9a9a9 }, |
||||
|
{ "darkgrey" , 0xa9a9a9 }, |
||||
|
{ "dark gray" , 0xa9a9a9 }, |
||||
|
{ "darkgray" , 0xa9a9a9 }, |
||||
|
{ "dark blue" , 0x8b }, |
||||
|
{ "darkblue" , 0x8b }, |
||||
|
{ "dark cyan" , 0x8b8b }, |
||||
|
{ "darkcyan" , 0x8b8b }, |
||||
|
{ "dark magenta" , 0x8b008b }, |
||||
|
{ "darkmagenta" , 0x8b008b }, |
||||
|
{ "dark red" , 0x8b0000 }, |
||||
|
{ "darkred" , 0x8b0000 }, |
||||
|
{ "light green" , 0x90ee90 }, |
||||
|
{ "lightgreen" , 0x90ee90 }, |
||||
|
{ "none", -1 }, |
||||
|
{ 0, 0 } |
||||
|
}; |
@ -0,0 +1,240 @@ |
|||||
|
// mlx_shaders.c
|
||||
|
|
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include <OpenGL/gl3.h> |
||||
|
#include "mlx_int.h" |
||||
|
|
||||
|
|
||||
|
void display_log(GLuint object, void (*param_func)(), void (*getlog_func)()) |
||||
|
{ |
||||
|
GLint log_length; |
||||
|
char *log; |
||||
|
|
||||
|
param_func(object, GL_INFO_LOG_LENGTH, &log_length); |
||||
|
log = malloc(log_length); |
||||
|
getlog_func(object, log_length, NULL, log); |
||||
|
fprintf(stderr, "%s", log); |
||||
|
free(log); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_shaders_pixel(glsl_info_t *glsl) |
||||
|
{ |
||||
|
char *source; |
||||
|
int length; |
||||
|
GLint action_ok; |
||||
|
|
||||
|
glsl->pixel_vshader = glCreateShader(GL_VERTEX_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"attribute vec2 position;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
" gl_Position = vec4( position, 0.0, 1.0);" |
||||
|
" texcoord = vec2(position[0]+1.0, 1.0 - position[1]) / 2.0;" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->pixel_vshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->pixel_vshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->pixel_vshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile pixel vshader :\n"); |
||||
|
display_log(glsl->pixel_vshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->pixel_fshader = glCreateShader(GL_FRAGMENT_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"uniform sampler2D texture;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
" gl_FragColor = texture2D(texture, texcoord);" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->pixel_fshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->pixel_fshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->pixel_fshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile pixel fshader :\n"); |
||||
|
display_log(glsl->pixel_fshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->pixel_program = glCreateProgram(); |
||||
|
glAttachShader(glsl->pixel_program, glsl->pixel_vshader); |
||||
|
glAttachShader(glsl->pixel_program, glsl->pixel_fshader); |
||||
|
glLinkProgram(glsl->pixel_program); |
||||
|
|
||||
|
glGetProgramiv(glsl->pixel_program, GL_LINK_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to link pixel shader program:\n"); |
||||
|
display_log(glsl->pixel_program, glGetProgramiv, glGetProgramInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glFlush(); |
||||
|
|
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_shaders_image(glsl_info_t *glsl) |
||||
|
{ |
||||
|
char *source; |
||||
|
int length; |
||||
|
GLint action_ok; |
||||
|
|
||||
|
glsl->image_vshader = glCreateShader(GL_VERTEX_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"attribute vec2 position;" |
||||
|
"uniform vec2 winhalfsize;" |
||||
|
"uniform vec2 imagepos;" |
||||
|
"uniform vec2 imagesize;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
" texcoord = position / imagesize;" |
||||
|
" vec2 pos = position - winhalfsize + imagepos;" |
||||
|
" pos = pos / winhalfsize;" |
||||
|
" gl_Position = vec4( pos, 0.0, 1.0);" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->image_vshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->image_vshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->image_vshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile image vshader :\n"); |
||||
|
display_log(glsl->image_vshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->image_fshader = glCreateShader(GL_FRAGMENT_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"uniform sampler2D texture;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
" gl_FragColor = texture2D(texture, texcoord);" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->image_fshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->image_fshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->image_fshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile image fshader :\n"); |
||||
|
display_log(glsl->image_fshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->image_program = glCreateProgram(); |
||||
|
glAttachShader(glsl->image_program, glsl->image_vshader); |
||||
|
glAttachShader(glsl->image_program, glsl->image_fshader); |
||||
|
glLinkProgram(glsl->image_program); |
||||
|
|
||||
|
glGetProgramiv(glsl->image_program, GL_LINK_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to link image shader program:\n"); |
||||
|
display_log(glsl->image_program, glGetProgramiv, glGetProgramInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glFlush(); |
||||
|
|
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
int mlx_shaders_font(glsl_info_t *glsl) |
||||
|
{ |
||||
|
char *source; |
||||
|
int length; |
||||
|
GLint action_ok; |
||||
|
|
||||
|
glsl->font_vshader = glCreateShader(GL_VERTEX_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"attribute vec2 position;" |
||||
|
"uniform vec2 winhalfsize;" |
||||
|
"uniform vec2 fontposinwin;" |
||||
|
"uniform vec2 fontposinatlas;" |
||||
|
"uniform vec2 fontatlassize;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
#ifdef STRINGPUTX11 |
||||
|
" texcoord = (position * vec2(1.4, -1.4) + fontposinatlas ) / fontatlassize;" |
||||
|
#else |
||||
|
" texcoord = (position * vec2(1.0, -1.0) + fontposinatlas ) / fontatlassize;" |
||||
|
#endif |
||||
|
" vec2 pos = position - winhalfsize + fontposinwin;" |
||||
|
" pos = pos / winhalfsize;" |
||||
|
" gl_Position = vec4( pos, 0.0, 1.0);" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->font_vshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->font_vshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->font_vshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile font vshader :\n"); |
||||
|
display_log(glsl->font_vshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->font_fshader = glCreateShader(GL_FRAGMENT_SHADER); |
||||
|
source = strdup("#version 110 \n" |
||||
|
"uniform sampler2D texture;" |
||||
|
"uniform vec4 color;" |
||||
|
"varying vec2 texcoord;" |
||||
|
"void main()" |
||||
|
"{" |
||||
|
" gl_FragColor = color * texture2D(texture, texcoord);" |
||||
|
"}"); |
||||
|
length = strlen(source); |
||||
|
glShaderSource(glsl->font_fshader, 1, (const GLchar**)&source, &length); |
||||
|
glCompileShader(glsl->font_fshader); |
||||
|
free(source); |
||||
|
|
||||
|
glGetShaderiv(glsl->font_fshader, GL_COMPILE_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to compile font fshader :\n"); |
||||
|
display_log(glsl->font_fshader, glGetShaderiv, glGetShaderInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glsl->font_program = glCreateProgram(); |
||||
|
glAttachShader(glsl->font_program, glsl->font_vshader); |
||||
|
glAttachShader(glsl->font_program, glsl->font_fshader); |
||||
|
glLinkProgram(glsl->font_program); |
||||
|
|
||||
|
glGetProgramiv(glsl->font_program, GL_LINK_STATUS, &action_ok); |
||||
|
if (!action_ok) { |
||||
|
fprintf(stderr, "Failed to link font shader program:\n"); |
||||
|
display_log(glsl->font_program, glGetProgramiv, glGetProgramInfoLog); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
glFlush(); |
||||
|
|
||||
|
return (0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
int mlx_shaders(glsl_info_t *glsl) |
||||
|
{ |
||||
|
return (mlx_shaders_pixel(glsl) + mlx_shaders_image(glsl) + mlx_shaders_font(glsl)); |
||||
|
} |
Binary file not shown.
@ -0,0 +1,338 @@ |
|||||
|
// mlx xpm
|
||||
|
// by ol
|
||||
|
|
||||
|
#include <OpenGL/gl3.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/mman.h> |
||||
|
#include <unistd.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <string.h> |
||||
|
#include "mlx_int.h" |
||||
|
|
||||
|
typedef struct s_xpm_col |
||||
|
{ |
||||
|
int name; |
||||
|
int col; |
||||
|
} t_xpm_col; |
||||
|
|
||||
|
|
||||
|
struct s_col_name |
||||
|
{ |
||||
|
char *name; |
||||
|
int color; |
||||
|
}; |
||||
|
|
||||
|
//extern struct s_col_name mlx_col_name[];
|
||||
|
#include "mlx_rgb.c" |
||||
|
|
||||
|
|
||||
|
#define RETURN { if (colors) free(colors); if (tab) free(tab); \ |
||||
|
if (colors_direct) free(colors_direct); \ |
||||
|
if (img) mlx_destroy_image(xvar, img); \ |
||||
|
return ((void *)0); } |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
char *mlx_int_get_line(char *ptr,int *pos,int size) |
||||
|
{ |
||||
|
int pos2; |
||||
|
int pos3; |
||||
|
int pos4; |
||||
|
|
||||
|
if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) |
||||
|
return ((char *)0); |
||||
|
if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) |
||||
|
return ((char *)0); |
||||
|
*(ptr+*pos+pos2) = 0; |
||||
|
*(ptr+*pos+pos2+1+pos3) = 0; |
||||
|
pos4 = *pos+pos2+1; |
||||
|
*pos += pos2+pos3+2; |
||||
|
return (ptr+pos4); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int mlx_int_get_col_name(char *str,int size) |
||||
|
{ |
||||
|
int result; |
||||
|
|
||||
|
result = 0; |
||||
|
while (size--) |
||||
|
result = (result<<8)+*(str++); |
||||
|
return (result); |
||||
|
} |
||||
|
|
||||
|
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); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
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; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
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 ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1) |
||||
|
{ |
||||
|
if (!(clip_data = malloc(4*width*height)) || // ok, nice size ..
|
||||
|
!(clip_img = XCreateImage(xvar->display, xvar->visual, |
||||
|
1, XYPixmap, 0, clip_data, |
||||
|
width, height, 8, (width+7)/8)) ) |
||||
|
RETURN; |
||||
|
memset(clip_data, 0xFF, 4*width*height); |
||||
|
} |
||||
|
*/ |
||||
|
if (method) |
||||
|
colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; |
||||
|
// rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col;
|
||||
|
else |
||||
|
{ |
||||
|
colors[i].name = mlx_int_get_col_name(line,cpp); |
||||
|
colors[i].col = rgb_col; // rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col;
|
||||
|
} |
||||
|
free(tab); |
||||
|
tab = 0; |
||||
|
} |
||||
|
|
||||
|
if (!(img = mlx_new_image(xvar,width,height))) |
||||
|
RETURN; |
||||
|
//opp = img->bpp/8;
|
||||
|
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)
|
||||
|
// XPutPixel(clip_img, x, height-1-i, 0);
|
||||
|
// else
|
||||
|
if (col==-1) |
||||
|
col = 0xFF000000; |
||||
|
mlx_int_xpm_set_pixel(img, data, opp, col, x); |
||||
|
x ++; |
||||
|
} |
||||
|
// data += img->size_line;
|
||||
|
data += img->width*4; |
||||
|
} |
||||
|
/*
|
||||
|
if (clip_data) |
||||
|
{ |
||||
|
if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, |
||||
|
width, height, 1)) ) |
||||
|
RETURN; |
||||
|
img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); |
||||
|
XPutImage(xvar->display, clip_pix, img->gc, clip_img, |
||||
|
0, 0, 0, 0, width, height); |
||||
|
XFreeGC(xvar->display, img->gc); |
||||
|
xgcv.clip_mask = clip_pix; |
||||
|
xgcv.function = GXcopy; |
||||
|
xgcv.plane_mask = AllPlanes; |
||||
|
img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| |
||||
|
GCPlaneMask, &xgcv); |
||||
|
XSync(xvar->display, False); |
||||
|
XDestroyImage(clip_img); |
||||
|
} |
||||
|
*/ |
||||
|
if (colors) |
||||
|
free(colors); |
||||
|
if (colors_direct) |
||||
|
free(colors_direct); |
||||
|
return (img); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void mlx_int_file_get_rid_comment(char *ptr, int size) |
||||
|
{ |
||||
|
int com_begin; |
||||
|
int com_end; |
||||
|
|
||||
|
while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) |
||||
|
{ |
||||
|
com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); |
||||
|
memset(ptr+com_begin,' ',com_end+4); |
||||
|
} |
||||
|
while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) |
||||
|
{ |
||||
|
com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); |
||||
|
memset(ptr+com_begin,' ',com_end+3); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void *mlx_xpm_file_to_image(mlx_ptr_t *xvar,char *file,int *width,int *height) |
||||
|
{ |
||||
|
int fd; |
||||
|
int size; |
||||
|
char *ptr; |
||||
|
mlx_img_list_t *img; |
||||
|
|
||||
|
if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || |
||||
|
(ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== |
||||
|
(void *)MAP_FAILED) |
||||
|
{ |
||||
|
if (fd>=0) |
||||
|
close(fd); |
||||
|
return ((void *)0); |
||||
|
} |
||||
|
mlx_int_file_get_rid_comment(ptr, size); |
||||
|
if ((img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))) |
||||
|
{ |
||||
|
*width = img->width; |
||||
|
*height = img->height; |
||||
|
} |
||||
|
munmap(ptr,size); |
||||
|
close(fd); |
||||
|
return (img); |
||||
|
} |
||||
|
|
||||
|
void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height) |
||||
|
{ |
||||
|
mlx_img_list_t *img; |
||||
|
|
||||
|
if ((img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))) |
||||
|
{ |
||||
|
*width = img->width; |
||||
|
*height = img->height; |
||||
|
} |
||||
|
return (img); |
||||
|
} |
Binary file not shown.
Loading…
Reference in new issue