Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*****************************************************************************\
 im.ColorModeToBitmap(color_mode)
\*****************************************************************************/
static int imluaColorModeToBitmap (lua_State *L)
{
  lua_pushinteger(L, imColorModeToBitmap(luaL_checkinteger(L, 1)));
  return 1;
}
Ejemplo n.º 3
0
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;
}