Example #1
0
//--------------------------------------------------------------------------
// load source file for a shader
BOOL GL21loadShaderFile(
  const char* fileName,
  GLuint shader)
{
  FILE* sourceFile = mgOSFileOpen(fileName, "rb");
  if (sourceFile == NULL)
    return false;

  fseek(sourceFile, 0, SEEK_END);
  long fileSize = ftell(sourceFile);
  fseek(sourceFile, 0, SEEK_SET);

  // read shader source
  char* buffer = new char[fileSize+1];
  size_t readLen = fread(buffer, 1, fileSize, sourceFile);
  buffer[readLen] = '\0';
  fclose(sourceFile);

  const GLchar* strings[1];
  strings[0] = (GLchar *) buffer;
  // =-= skip any leading UTF-8 BOM
  glShaderSource(shader, 1, strings, NULL);

  // delete shader source
  delete buffer;

  return true;
}
Example #2
0
//--------------------------------------------------------------
// constructor
MinecraftRegion::MinecraftRegion(
  const char* regionDir,
  int regionX,
  int regionZ)
{
  memset(m_header, 0, sizeof(m_header));

  m_lock = mgOSLock::create();

  // create the region file name
  m_fileName.format("%s/r.%d.%d.mcr", (const char*) regionDir, regionX, regionZ);
  mgOSFixFileName(m_fileName);

  // open the file
  m_regionFile = mgOSFileOpen(m_fileName, "rb");
  if (m_regionFile == NULL)
  {
    mgDebug("could not open region file %s", (const char*) m_fileName);
    m_exists = false;
    return;
  }
  else m_exists = true;

  // read the header
  int count = fread(m_header, 1, sizeof(m_header), m_regionFile);
  if (count != sizeof(m_header))
  {
    mgDebug("Could not read region (%d, %d) header -- %d bytes read, %d expected", 
      regionX, regionZ, count, sizeof(m_header));
    m_exists = false;
  }
}
Example #3
0
//--------------------------------------------------------------
// parse a file
void mgXMLScanner::parseFile(
  const char* fileName)
{
  m_sourceFileName = fileName;
  mgOSFixFileName(m_sourceFileName);

  FILE* inFile = mgOSFileOpen(m_sourceFileName, "rb");
  if (inFile == NULL)
    throw new mgErrorMsg("xmlFileNotFound", "filename", "%s", (const char*) m_sourceFileName);

  char* buffer = new char[PARSE_BUFFER_SIZE];
  while (true)
  {
    size_t len = fread(buffer, 1, PARSE_BUFFER_SIZE, inFile);
    if (len <= 0)
      break;

    // parse buffer of file data
    parse((int) len, buffer);
  }
  delete buffer;
  fclose(inFile);

  // end of input
  parseEnd();
}
Example #4
0
//--------------------------------------------------------
// initialize target image
BOOL mgJPGWrite::outputStart(
  int width,                 // width of image
  int height)                // height of image
{
  m_outFile = mgOSFileOpen(m_fileName, "wb");
  if (m_outFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  m_CompInfo.err = jpeg_std_error(&m_CompErr);  // standard error handler
  m_CompErr.error_exit = ImageErrorExit;
  m_CompErr.output_message = ImageOutputMessage;

  // allocate and initialize JPEG compression object 
  jpeg_create_compress(&m_CompInfo);
  jpeg_stdio_dest(&m_CompInfo, m_outFile);

  m_CompInfo.in_color_space = JCS_RGB;
  jpeg_set_defaults(&m_CompInfo);
  m_CompInfo.in_color_space = JCS_RGB;
  m_CompInfo.input_components = 3;
  m_CompInfo.data_precision = 8;
  m_CompInfo.image_width = width;
  m_CompInfo.image_height = height;
  jpeg_default_colorspace(&m_CompInfo);

  // Start compressor, write complete file 
  jpeg_start_compress(&m_CompInfo, true);

  return true;
}
Example #5
0
//--------------------------------------------------------
// initialize target image
BOOL mgGIFWrite::outputStart(
  int width,                 // width of image
  int height)                // height of image
{
  m_outFile = mgOSFileOpen(m_fileName, "wb");
  if (m_outFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  // initialize error diffusion
  m_target = new BYTE[width];

  m_diffuse = new mgDiffuse(0, width);
  m_gifWrite = new mgGIFFileWrite;
  m_gifWrite->m_outFile = m_outFile;

  m_gifWrite->writeHeader(width, height);

  m_RGBline = new BYTE[width*3];

  // build standard color table
  DWORD alColors[6*6*6];
  int i = 0;
  for (int r = 0; r < 6; r++)
    for (int g = 0; g < 6; g++)
      for (int b = 0; b < 6; b++)
        alColors[i++] = ((r*51) << 16) | ((g*51) << 8) | (b*51);
  m_gifWrite->writeColorTable(alColors, 6*6*6);

  m_gifWrite->writeImageHeader(width, height);

  return true;
}
Example #6
0
//--------------------------------------------------------
// open a GIF file to be read
BOOL mgGIFRead::open(
  const char* fileName)   // name of file to open
{
  // if file name exists 
  m_inFile = mgOSFileOpen(fileName, "rb");
  if (m_inFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  // Figure out the input file format, and set up to read it. 
  m_srcMgr = jinit_read_gif(&m_CompInfo);
  m_srcMgr->input_file = m_inFile;

  // Read the input file header to obtain file size & colorspace. 
  (*m_srcMgr->start_input) (&m_CompInfo, m_srcMgr);
  (*m_CompInfo.mem->realize_virt_arrays) ((j_common_ptr) &m_CompInfo);

  m_width = m_CompInfo.image_width;
  m_height = m_CompInfo.image_height;

  m_RGBAline = new BYTE[m_CompInfo.image_width * 4];

  if (!m_writer->outputStart(m_CompInfo.image_width, m_CompInfo.image_height))
    return false;

  return true;
}
Example #7
0
//--------------------------------------------------------------
// save BGRA image data to a jpg file
void mgWriteBGRAtoJPGFile(
  const char* fileName,
  int width,
  int height,
  const BYTE* pData)
{
  FILE* pOutFile = mgOSFileOpen(fileName, "wb");
  if (pOutFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "filename", "%s", (const char*) fileName);

  struct jpeg_error_mgr compErr;    // error handler 
  struct jpeg_compress_struct compInfo;
  compInfo.err = jpeg_std_error(&compErr);  // standard error handler
  compErr.error_exit = ImageErrorExit;
  compErr.output_message = ImageOutputMessage;

  // allocate and initialize JPEG compression object 
  jpeg_create_compress(&compInfo);
  jpeg_stdio_dest(&compInfo, pOutFile);

  compInfo.in_color_space = JCS_RGB;
  jpeg_set_defaults(&compInfo);
  jpeg_set_quality(&compInfo, 99, true);

  compInfo.in_color_space = JCS_RGB;
  compInfo.input_components = 3;
  compInfo.data_precision = 8;
  compInfo.image_width = width;
  compInfo.image_height = height;
  jpeg_default_colorspace(&compInfo);

  // Start compressor, write complete file 
  jpeg_start_compress(&compInfo, TRUE);

  // read scanlines from the screen, top to bottom
  BYTE* line = new BYTE[width*3];
  const BYTE* pSource = pData;
  for (int i = 0; i < height; i++)
  {
    int targetOffset = 0;
    int sourceOffset = 0;
    for (int j = 0; j < width; j++)
    {
      line[targetOffset++] = pSource[sourceOffset+2];
      line[targetOffset++] = pSource[sourceOffset+1];
      line[targetOffset++] = pSource[sourceOffset+0];
      sourceOffset += 4;
    }
    jpeg_write_scanlines(&compInfo, &line, 1);
    pSource += width*4;
  }
  delete line;

  jpeg_finish_compress(&compInfo);
  jpeg_destroy_compress(&compInfo);

  fclose(pOutFile);
}
Example #8
0
//--------------------------------------------------------------
// return file handle (open if necessary)
FILE* MinecraftRegion::getFile()
{
  if (!m_exists)
    return NULL;

  if (m_regionFile != NULL)
    return m_regionFile;

  m_regionFile = mgOSFileOpen(m_fileName, "rb");
  if (m_regionFile == NULL)
    m_exists = false;

  return m_regionFile;
}
Example #9
0
//--------------------------------------------------------
// open a JPG file to be read
BOOL mgJPGRead::open(
  const char* fileName)   // name of file to open
{
  // if file name exists 
  m_inFile = mgOSFileOpen(fileName, "rb");
  if (m_inFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  jpeg_stdio_src(&m_CompInfo, m_inFile);

  // read the dimensions of the source image 
  jpeg_read_header(&m_CompInfo, true);
  
  // if there's been an error, return 
  if (// m_CompInfo.err->num_warnings > 0 || 
      m_CompInfo.image_width == 0 || m_CompInfo.image_height == 0)
    return false;
  
  m_RGBAline = new BYTE[m_CompInfo.image_width * 4];
  m_width = m_CompInfo.image_width;
  m_height = m_CompInfo.image_height;

  if (!m_writer->outputStart(m_CompInfo.image_width, m_CompInfo.image_height))
  {
    return false;
  }
  
  // set color map for output
  if (m_CompInfo.out_color_space != JCS_GRAYSCALE)
    m_CompInfo.out_color_space = JCS_RGB;
  m_CompInfo.quantize_colors = false;
  
  // start decompression
  jpeg_calc_output_dimensions(&m_CompInfo);
  jpeg_start_decompress(&m_CompInfo);

  return true;
}
Example #10
0
//--------------------------------------------------------
// open a BMP file to be read
BOOL mgBMPRead::open(
  const char* fileName)   // name of file to open
{
  // if file name exists 
  m_inFile = mgOSFileOpen(fileName, "rb");
  if (m_inFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  BitmapFileHeader fileHeader;
  fileHeader.bfType = readWord(m_inFile);
  fileHeader.bfSize = readDWord(m_inFile);
  fileHeader.bfReserved1 = readWord(m_inFile);
  fileHeader.bfReserved2 = readWord(m_inFile);
  fileHeader.bfOffBits = readDWord(m_inFile);
  if (fileHeader.bfType != 0x4D42)
    throw new mgErrorMsg("imgNotBmp", "filename", "%s", (const char*) fileName);

  BitmapInfoHeader infoHeader;
  infoHeader.biSize = readDWord(m_inFile);
  infoHeader.biWidth = (int) readDWord(m_inFile);
  infoHeader.biHeight = (int) readDWord(m_inFile);
  infoHeader.biPlanes = readWord(m_inFile);
  infoHeader.biBitCount = readWord(m_inFile);
  infoHeader.biCompression = readDWord(m_inFile);
  infoHeader.biSizeImage = readDWord(m_inFile);

  // handle uncompressed 24 and 32 bit images
  if (infoHeader.biCompression != BITMAP_COMPRESSION_RGB ||
      (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 32))
    throw new mgErrorMsg("imgBMPDepth", "filename", "%s", (const char*) fileName);

  m_width = infoHeader.biWidth;
  m_height = abs(infoHeader.biHeight);
  m_bitCount = infoHeader.biBitCount;
  m_reverse = infoHeader.biHeight > 0;

  // read the image data
  DWORD imageSize = m_height * m_width * m_bitCount/8;
  if (infoHeader.biSizeImage != 0 && infoHeader.biSizeImage != imageSize)
    throw new mgErrorMsg("imgBmpSize", "filename,calcSize,declSize", "%s,%d,%d", 
      (const char*) fileName, imageSize, infoHeader.biSizeImage);

  m_data = new BYTE[imageSize];
  fseek(m_inFile, fileHeader.bfOffBits, SEEK_SET);
  size_t bytesRead = fread(m_data, 1, imageSize, m_inFile);
  if (bytesRead != imageSize)
    throw new mgErrorMsg("imgBmpRead", "filename,size", "%s,%d", (const char*) fileName, imageSize);

  fclose(m_inFile);
  m_inFile = NULL;

  m_RGBAline = new BYTE[m_width * 4];
  m_y = 0;
  m_lineLen = m_width * m_bitCount/8;
  m_lineLen = 4*((m_lineLen+3)/4);

  if (!m_writer->outputStart(m_width, m_height))
    return false;

  return true;
}