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; }
/*****************************************************************************\ im.ColorModeToBitmap(color_mode) \*****************************************************************************/ static int imluaColorModeToBitmap (lua_State *L) { lua_pushinteger(L, imColorModeToBitmap(luaL_checkinteger(L, 1))); return 1; }
int imLoadRGB(char *filename, unsigned char *red, unsigned char *green, unsigned char *blue) { int error; imFile* ifile = imFileOpen(filename, &error); if (!ifile) return error; int width, height, color_mode, data_type; error = imFileReadImageInfo(ifile, 0, &width, &height, &color_mode, &data_type); if (error) { imFileClose(ifile); return error; } if (iOldResolutionCB) { double xres = *(float*)imFileGetAttribute(ifile, "XResolution", NULL, NULL); double yres = *(float*)imFileGetAttribute(ifile, "YResolution", NULL, NULL); int res_unit = *(int*)imFileGetAttribute(ifile, "ResolutionUnit", NULL, NULL); iOldResolutionCB(filename, &xres, &yres, &res_unit); } if (iOldTiffImageDescCB) { char* img_desc = (char*)imFileGetAttribute(ifile, "Description", NULL, NULL); iOldTiffImageDescCB(filename, img_desc); } if (iOldGifTranspIndexCB) { unsigned char transp_index = *(unsigned char*)imFileGetAttribute(ifile, "TransparencyIndex", NULL, NULL); iOldGifTranspIndexCB(filename, &transp_index); } int count = width*height; void* data; if (green != red + count || blue != green + count) data = malloc(imImageDataSize(width, height, IM_RGB, IM_BYTE)); else data = red; if (!data) { imFileClose(ifile); return IM_ERR_MEM; } if (iOldCounterCB) imCounterSetCallback(filename, iOldFileCounter); error = imFileReadImageData(ifile, data, 1, 0); if (error) { if (data != red) free(data); imFileClose(ifile); return error; } if (imColorModeToBitmap(color_mode) != IM_RGB) { long palette[256]; int palette_count; imFileGetPalette(ifile, palette, &palette_count); iConvertMapToRGB((imbyte*)data, red, green, blue, count, palette, palette_count); } else if (data != red) { memcpy(red, data, count); memcpy(green, (unsigned char*)data+count, count); memcpy(blue, (unsigned char*)data+2*count, count); } imFileClose(ifile); if (data != red) free(data); return IM_ERR_NONE; }