static int bt1_cb(Ihandle* self) { imImage* image; int w, h; void* gldata; int ii = tabs_get_index(); IupGetIntInt(plot[ii], "DRAWSIZE", &w, &h); gldata = malloc(w*h*3); image = imImageCreate(w, h, IM_RGB, IM_BYTE); IupMglPlotPaintTo(plot[ii], "RGB", w, h, 0, gldata); imConvertPacking(gldata, image->data[0], w, h, 3, 3, IM_BYTE, 1); imProcessFlip(image, image); imFileImageSave("../mglplot.png", "PNG", image); free(gldata); imImageDestroy(image); (void)self; return IUP_DEFAULT; }
imImage* imImageCreateFromOpenGLData(int width, int height, int glformat, const void* gldata) { int color_space, has_alpha, depth; imImage* image; switch(glformat) { case GL_RGBA: color_space = IM_RGB; has_alpha = 1; depth = 4; break; case GL_RGB: color_space = IM_RGB; has_alpha = 0; depth = 3; break; case GL_LUMINANCE_ALPHA: color_space = IM_GRAY; depth = 2; has_alpha = 1; case GL_LUMINANCE: color_space = IM_GRAY; depth = 1; has_alpha = 0; break; default: return NULL; } image = imImageCreate(width, height, color_space, IM_BYTE); if (!image) return NULL; if (has_alpha) imImageAddAlpha(image); imConvertPacking(gldata, image->data[0], image->width, image->height, depth, depth, IM_BYTE, 1); return image; }
void* imImageGetOpenGLData(const imImage* image, int *format) { if (!imImageIsBitmap(image)) return NULL; int transp_count; imbyte* transp_index = (imbyte*)imImageGetAttribute(image, "TransparencyIndex", NULL, NULL); imbyte* transp_map = (imbyte*)imImageGetAttribute(image, "TransparencyMap", NULL, &transp_count); imbyte* transp_color = (imbyte*)imImageGetAttribute(image, "TransparencyColor", NULL, NULL); int glformat; switch(image->color_space) { case IM_MAP: if (image->has_alpha || transp_map || transp_index) glformat = GL_RGBA; else glformat = GL_RGB; break; case IM_RGB: if (image->has_alpha || transp_color) glformat = GL_RGBA; else glformat = GL_RGB; break; case IM_BINARY: default: /* IM_GRAY */ if (image->has_alpha || transp_map || transp_index) glformat = GL_LUMINANCE_ALPHA; else glformat = GL_LUMINANCE; break; } int gldepth; switch (glformat) { case GL_RGB: gldepth = 3; break; case GL_RGBA: gldepth = 4; break; case GL_LUMINANCE_ALPHA: gldepth = 2; break; default: /* GL_LUMINANCE */ gldepth = 1; break; } int size = image->count*gldepth; imImageSetAttribute(image, "GLDATA", IM_BYTE, size, NULL); imbyte* gldata = (imbyte*)imImageGetAttribute(image, "GLDATA", NULL, NULL); int depth = image->depth; if (image->has_alpha) depth++; /* copy data, including alpha */ if (image->color_space != IM_MAP) { imConvertPacking(image->data[0], gldata, image->width, image->height, depth, gldepth, IM_BYTE, 0); if (image->color_space == IM_BINARY) iImageMakeGray(gldata, gldepth, image->count); } else { /* copy map data */ memcpy(gldata, image->data[0], image->size); /* size does not include alpha */ /* expand MAP to RGB or RGBA */ imConvertMapToRGB(gldata, image->count, gldepth, 1, image->palette, image->palette_count); if (image->has_alpha) iImageGLCopyMapAlpha((imbyte*)image->data[1], gldata, gldepth, image->count); /* copy the alpha plane */ } /* set alpha based on attributes */ if (!image->has_alpha) { if (image->color_space == IM_RGB) { if (transp_color) iImageGLSetTranspColor(gldata, image->count, *(transp_color+0), *(transp_color+1), *(transp_color+2)); } else { if (transp_map) iImageGLSetTranspMap((imbyte*)image->data[0], gldata, image->count, transp_map, transp_count); else if (transp_index) iImageGLSetTranspIndex((imbyte*)image->data[0], gldata, gldepth, image->count, *transp_index); } } if (format) *format = glformat; return gldata; }