You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
4.9 KiB
198 lines
4.9 KiB
// 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);
|
|
}
|
|
|