int item_paste_action_cb(Ihandle* item_paste) { if (save_check(item_paste)) { Ihandle* canvas = IupGetDialogChild(item_paste, "CANVAS"); imImage* old_image = (imImage*)IupGetAttribute(canvas, "IMAGE"); Ihandle *clipboard = IupClipboard(); imImage* image = IupGetNativeHandleImage(IupGetAttribute(clipboard, "NATIVEIMAGE")); IupDestroy(clipboard); if (!image) { show_error("Invalid Clipboard Data", 1); return IUP_DEFAULT; } /* we are going to support only RGB images with no alpha */ imImageRemoveAlpha(image); if (image->color_space != IM_RGB) { imImage* new_image = imImageCreateBased(image, -1, -1, IM_RGB, -1); imConvertColorSpace(image, new_image); imImageDestroy(image); image = new_image; } /* create OpenGL compatible data */ imImageGetOpenGLData(image, NULL); imImageSetAttribString(image, "FileFormat", "JPEG"); IupSetAttribute(canvas, "DIRTY", "Yes"); IupSetAttribute(canvas, "IMAGE", (char*)image); IupSetAttribute(canvas, "FILENAME", NULL); IupSetAttribute(IupGetDialog(canvas), "TITLE", "Untitled - Simple Paint"); IupUpdate(canvas); if (old_image) imImageDestroy(old_image); } return IUP_DEFAULT; }
void set_new_image(Ihandle* canvas, imImage* image, const char* filename, int dirty) { imImage* old_image = (imImage*)IupGetAttribute(canvas, "IMAGE"); Ihandle* size_lbl = IupGetDialogChild(canvas, "SIZELABEL"); Ihandle* zoom_val = IupGetDialogChild(canvas, "ZOOMVAL"); if (filename) { IupSetStrAttribute(canvas, "FILENAME", filename); IupSetfAttribute(IupGetDialog(canvas), "TITLE", "%s - Simple Paint", str_filetitle(filename)); } else { IupSetAttribute(canvas, "FILENAME", NULL); IupSetAttribute(IupGetDialog(canvas), "TITLE", "Untitled - Simple Paint"); } /* we are going to support only RGB images with no alpha */ imImageRemoveAlpha(image); if (image->color_space != IM_RGB) { imImage* new_image = imImageCreateBased(image, -1, -1, IM_RGB, -1); imConvertColorSpace(image, new_image); imImageDestroy(image); image = new_image; } /* default file format */ const char* format = imImageGetAttribString(image, "FileFormat"); if (!format) imImageSetAttribString(image, "FileFormat", "JPEG"); IupSetAttribute(canvas, "DIRTY", dirty? "Yes": "No"); IupSetAttribute(canvas, "IMAGE", (char*)image); IupSetfAttribute(size_lbl, "TITLE", "%d x %d px", image->width, image->height); if (old_image) imImageDestroy(old_image); IupSetDouble(zoom_val, "VALUE", 0); zoom_update(canvas, 0); }
imImage* read_file(const char* filename) { int error; imImage* image = imFileImageLoadBitmap(filename, 0, &error); if (error) show_file_error(error); else { /* we are going to support only RGB images with no alpha */ imImageRemoveAlpha(image); if (image->color_space != IM_RGB) { imImage* new_image = imImageCreateBased(image, -1, -1, IM_RGB, -1); imConvertColorSpace(image, new_image); imImageDestroy(image); image = new_image; } /* create OpenGL compatible data */ imImageGetOpenGLData(image, NULL); } return image; }
int imConvertToBitmap(const imImage* src_image, imImage* dst_image, int cpx2real, float gamma, int absolute, int cast_mode) #endif { assert(src_image); assert(dst_image); if (!imImageMatchSize(src_image, dst_image) || !imImageIsBitmap(dst_image)) return IM_ERR_DATA; #ifdef IM_PROCESS int counter = imProcessCounterBegin("Building Bitmap"); #else int counter = imCounterBegin("Building Bitmap"); #endif int ret; if (src_image->data_type == IM_BYTE) { // NO data type conversion, only color mode conversion #ifdef IM_PROCESS ret = imProcessConvertColorSpace(src_image, dst_image); #else ret = imConvertColorSpace(src_image, dst_image); #endif } else { if (src_image->color_space == IM_RGB || src_image->color_space == IM_GRAY) { // data type conversion, but NO color mode conversion #ifdef IM_PROCESS ret = imProcessConvertDataType(src_image, dst_image, cpx2real, gamma, absolute, cast_mode); #else ret = imConvertDataType(src_image, dst_image, cpx2real, gamma, absolute, cast_mode); #endif } else { // data type conversion AND color mode conversion imImage* temp_image = imImageCreate(src_image->width, src_image->height, dst_image->color_space, src_image->data_type); if (!temp_image) ret = IM_ERR_MEM; else { // first convert color_mode in the bigger precision #ifdef IM_PROCESS ret = imProcessConvertColorSpace(src_image, temp_image); #else ret = imConvertColorSpace(src_image, temp_image); #endif if (ret == IM_ERR_NONE) { // second just convert data type #ifdef IM_PROCESS ret = imProcessConvertDataType(temp_image, dst_image, cpx2real, gamma, absolute, cast_mode); #else ret = imConvertDataType(temp_image, dst_image, cpx2real, gamma, absolute, cast_mode); #endif } imImageDestroy(temp_image); } } } #ifdef IM_PROCESS imProcessCounterEnd(counter); #else imCounterEnd(counter); #endif return ret; }