int imFileWriteImageInfo(imFile* ifile, int width, int height, int user_color_mode, int user_data_type) { assert(ifile); assert(ifile->is_new); imFileFormatBase* ifileformat = (imFileFormatBase*)ifile; if (!imImageCheckFormat(user_color_mode, user_data_type)) return IM_ERR_DATA; int error = ifileformat->iformat->CanWrite(ifile->compression, user_color_mode, user_data_type); if (error) return error; ifile->width = width; ifile->height = height; ifile->user_color_mode = user_color_mode; ifile->user_data_type = user_data_type; if (imColorModeSpace(user_color_mode) == IM_BINARY) { ifile->palette_count = 2; ifile->palette[0] = imColorEncode(0, 0, 0); ifile->palette[1] = imColorEncode(255, 255, 255); } return ifileformat->WriteImageInfo(); }
/*****************************************************************************\ im.ImageCheckFormat(width, color_mode) \*****************************************************************************/ static int imluaImageCheckFormat (lua_State *L) { int color_mode = luaL_checkinteger(L, 1); int data_type = luaL_checkinteger(L, 2); lua_pushboolean(L, imImageCheckFormat(color_mode, data_type)); return 1; }
int imFileReadImageInfo(imFile* ifile, int index, int *width, int *height, int *file_color_mode, int *file_data_type) { assert(ifile); assert(!ifile->is_new); imFileFormatBase* ifileformat = (imFileFormatBase*)ifile; if (index >= ifile->image_count) return IM_ERR_DATA; if (ifile->image_index != -1 && ifile->image_index == index) { if(width) *width = ifile->width; if(height) *height = ifile->height; if(file_color_mode) *file_color_mode = ifile->file_color_mode; if(file_data_type) *file_data_type = ifile->file_data_type; return IM_ERR_NONE; } ifile->convert_bpp = 0; ifile->switch_type = 0; int error = ifileformat->ReadImageInfo(index); if (error) return error; if (!imImageCheckFormat(ifile->file_color_mode, ifile->file_data_type)) return IM_ERR_DATA; if (imColorModeSpace(ifile->file_color_mode) == IM_BINARY) { ifile->palette_count = 2; ifile->palette[0] = imColorEncode(0, 0, 0); ifile->palette[1] = imColorEncode(255, 255, 255); } if (imColorModeSpace(ifile->file_color_mode) == IM_MAP) { if (iFileCheckPaletteGray(ifile)) ifile->file_color_mode = (ifile->file_color_mode & 0xFF00) | IM_GRAY; if (iFileCheckPaletteBinary(ifile)) ifile->file_color_mode = (ifile->file_color_mode & 0xFF00) | IM_BINARY; } if(width) *width = ifile->width; if(height) *height = ifile->height; if(file_color_mode) *file_color_mode = ifile->file_color_mode; if(file_data_type) *file_data_type = ifile->file_data_type; ifile->image_index = index; return IM_ERR_NONE; }
/*****************************************************************************\ im.ImageCreate(width, height, color_space, data_type) \*****************************************************************************/ static int imluaImageCreate (lua_State *L) { int width = luaL_checkint(L, 1); int height = luaL_checkint(L, 2); int color_space = luaL_checkint(L, 3); int data_type = luaL_checkint(L, 4); imImage *image; if (!imImageCheckFormat(color_space, data_type)) luaL_error(L, "invalid combination of color space and data type."); image = imImageCreate(width, height, color_space, data_type); imlua_pushimage(L, image); return 1; }
int imFileReadImageData(imFile* ifile, void* data, int convert2bitmap, int color_mode_flags) { assert(ifile); assert(!ifile->is_new); imFileFormatBase* ifileformat = (imFileFormatBase*)ifile; if (ifile->image_index == -1) return IM_ERR_DATA; ifile->user_color_mode = ifile->file_color_mode; ifile->user_data_type = ifile->file_data_type; if (convert2bitmap) { ifile->user_data_type = IM_BYTE; ifile->user_color_mode = imColorModeToBitmap(ifile->file_color_mode); } if (color_mode_flags != -1) { ifile->user_color_mode = imColorModeSpace(ifile->user_color_mode); ifile->user_color_mode |= color_mode_flags; } if (!imImageCheckFormat(ifile->user_color_mode, ifile->user_data_type)) return IM_ERR_DATA; if (!imFileCheckConversion(ifile)) return IM_ERR_DATA; imFileLineBufferInit(ifile); int ret = ifileformat->ReadImageData(data); // here we can NOT change the file_color_mode we already returned to the user // so just check for gray and binary consistency if (imColorModeSpace(ifile->file_color_mode) == IM_GRAY && ifile->file_data_type == IM_BYTE) iFileCheckConvertGray(ifile, (imbyte*)data); if (imColorModeSpace(ifile->file_color_mode) == IM_BINARY) iFileCheckConvertBinary(ifile, (imbyte*)data); return ret; }