aboutsummaryrefslogtreecommitdiffstats
path: root/minilibx-bsd/mlx_new_image.c
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-04-15 16:19:44 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-04-15 16:19:44 +0200
commit46687fa2cef63e99a0ded077d88c3b19b20cc1ca (patch)
tree020590d4319b4bd0217cdf97750f3a8338d3069e /minilibx-bsd/mlx_new_image.c
parentAdded line to gitignore (diff)
download42-cub3d-46687fa2cef63e99a0ded077d88c3b19b20cc1ca.tar.gz
42-cub3d-46687fa2cef63e99a0ded077d88c3b19b20cc1ca.tar.bz2
42-cub3d-46687fa2cef63e99a0ded077d88c3b19b20cc1ca.tar.xz
42-cub3d-46687fa2cef63e99a0ded077d88c3b19b20cc1ca.tar.zst
42-cub3d-46687fa2cef63e99a0ded077d88c3b19b20cc1ca.zip
Now BSD compliant
Diffstat (limited to 'minilibx-bsd/mlx_new_image.c')
-rw-r--r--minilibx-bsd/mlx_new_image.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/minilibx-bsd/mlx_new_image.c b/minilibx-bsd/mlx_new_image.c
new file mode 100644
index 0000000..9967401
--- /dev/null
+++ b/minilibx-bsd/mlx_new_image.c
@@ -0,0 +1,155 @@
+/*
+** mlx_new_image.c for MiniLibX in raytraceur
+**
+** Made by Charlie Root
+** Login <ol@epitech.net>
+**
+** Started on Mon Aug 14 15:29:14 2000 Charlie Root
+** Last update Wed May 25 16:46:31 2011 Olivier Crouzet
+*/
+
+
+
+
+#include "mlx_int.h"
+
+/*
+** To handle X errors
+*/
+
+#define X_ShmAttach 1
+
+int mlx_X_error;
+
+int shm_att_pb(Display *d,XErrorEvent *ev)
+{
+ if (ev->request_code==146 && ev->minor_code==X_ShmAttach)
+ write(2,WARN_SHM_ATTACH,strlen(WARN_SHM_ATTACH));
+ mlx_X_error = 1;
+}
+
+
+/*
+** Data malloc : width+32 ( bitmap_pad=32 ), *4 = *32 / 8bit
+*/
+
+
+void *mlx_int_new_xshm_image(t_xvar *xvar,int width,int height,int format)
+{
+ t_img *img;
+ int (*save_handler)();
+
+ if (!(img = malloc(sizeof(*img))))
+ return ((void *)0);
+ bzero(img,sizeof(*img));
+ img->data = 0;
+ img->image = XShmCreateImage(xvar->display,xvar->visual,xvar->depth,
+ format,img->data,&(img->shm),width,height);
+ if (!img->image)
+ {
+ free(img);
+ return ((void *)0);
+ }
+ img->width = width;
+ img->height = height;
+ img->size_line = img->image->bytes_per_line;
+ img->bpp = img->image->bits_per_pixel;
+ img->format = format;
+ img->shm.shmid = shmget(IPC_PRIVATE,(width+32)*height*4,IPC_CREAT|0777);
+ if (img->shm.shmid==-1)
+ {
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ img->data = img->shm.shmaddr = img->image->data = shmat(img->shm.shmid,0,0);
+ if (img->data==(void *)-1)
+ {
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ img->shm.readOnly = False;
+ mlx_X_error = 0;
+ save_handler = XSetErrorHandler(shm_att_pb);
+ if (!XShmAttach(xvar->display,&(img->shm)) ||
+ 0&XSync(xvar->display,False) || mlx_X_error)
+ {
+ XSetErrorHandler(save_handler);
+ shmdt(img->data);
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ XDestroyImage(img->image);
+ free(img);
+ return ((void *)0);
+ }
+ XSetErrorHandler(save_handler);
+ shmctl(img->shm.shmid,IPC_RMID,0);
+ if (xvar->pshm_format==format)
+ {
+ img->pix = XShmCreatePixmap(xvar->display,xvar->root,img->shm.shmaddr,
+ &(img->shm),width,height,xvar->depth);
+ img->type = MLX_TYPE_SHM_PIXMAP;
+ }
+ else
+ {
+ img->pix = XCreatePixmap(xvar->display,xvar->root,
+ width,height,xvar->depth);
+ img->type = MLX_TYPE_SHM;
+ }
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+ return (img);
+}
+
+
+
+void *mlx_int_new_image(t_xvar *xvar,int width, int height,int format)
+{
+ t_img *img;
+
+ if (!(img = malloc(sizeof(*img))) ||
+ !(img->data = malloc((width+32)*height*4)))
+ return ((void *)0);
+ bzero(img->data,(width+32)*height*4);
+ img->image = XCreateImage(xvar->display,xvar->visual,xvar->depth,format,0,
+ img->data,width,height,32,0);
+ if (!img->image)
+ {
+ free(img->data);
+ free(img);
+ return ((void *)0);
+ }
+ img->gc = 0;
+ img->size_line = img->image->bytes_per_line;
+ img->bpp = img->image->bits_per_pixel;
+ img->width = width;
+ img->height = height;
+ img->pix = XCreatePixmap(xvar->display,xvar->root,width,height,xvar->depth);
+ img->format = format;
+ img->type = MLX_TYPE_XIMAGE;
+ if (xvar->do_flush)
+ XFlush(xvar->display);
+ return (img);
+}
+
+
+void *mlx_new_image(t_xvar *xvar,int width, int height)
+{
+ t_img *img;
+
+ if (xvar->use_xshm)
+ if (img = mlx_int_new_xshm_image(xvar,width,height,ZPixmap))
+ return (img);
+ return (mlx_int_new_image(xvar,width,height,ZPixmap));
+}
+
+void *mlx_new_image2(t_xvar *xvar,int width, int height)
+{
+ t_img *img;
+
+ if (xvar->use_xshm)
+ if (img = mlx_int_new_xshm_image(xvar,width,height,XYPixmap))
+ return (img);
+ return (mlx_int_new_image(xvar,width,height,XYPixmap));
+}