lms-video/Gem/plugins/imageSGI/imageSGI.cpp
Santi Noreña e85d191b46 - Reestructuración de ficheros y directorios general
- merge v0.01 --> Añadido fileselector
- Añadidas fuentes de Gem y Pure Data
- pix2jpg incluído en Gem. Archivos de construcción de Gem modificados.
- Añadido fichero ompiling.txt con instrucciones de compilación
2013-02-04 18:00:17 +01:00

139 lines
3.4 KiB
C++

////////////////////////////////////////////////////////
//
// GEM - Graphics Environment for Multimedia
//
// zmoelnig@iem.kug.ac.at
//
// Implementation file
//
// Copyright (c) 1997-1999 Mark Danks.
// Copyright (c) Günther Geiger.
// Copyright (c) 2001-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
// For information on usage and redistribution, and for a DISCLAIMER OF ALL
// WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
//
/////////////////////////////////////////////////////////
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <string.h>
#include "imageSGI.h"
#include "Gem/RTE.h"
#include "sgiimage.h"
#include "plugins/PluginFactory.h"
using namespace gem::plugins;
REGISTER_IMAGELOADERFACTORY("SGI", imageSGI);
/////////////////////////////////////////////////////////
//
// imageSGI
//
/////////////////////////////////////////////////////////
// Constructor
//
/////////////////////////////////////////////////////////
imageSGI :: imageSGI(void)
{
//post("imageSGI");
}
imageSGI :: ~imageSGI(void)
{
//post("~imageSGI");
}
/////////////////////////////////////////////////////////
// really open the file ! (OS dependent)
//
/////////////////////////////////////////////////////////
bool imageSGI :: load(std::string filename, imageStruct&result, gem::Properties&props)
{
int32 xsize, ysize, csize;
if (!sizeofimage(filename.c_str(), &xsize, &ysize, &csize) )
return(NULL);
::verbose(2, "reading '%s' with SGI", filename.c_str());
result.xsize=xsize;
result.ysize=ysize;
if (csize == 4 || csize == 3) {
result.setCsizeByFormat(GL_RGBA);
} else if (csize == 1) {
result.setCsizeByFormat(GL_LUMINANCE);
} else {
//error("GemImageLoad(SGI): unknown color components in SGI file: %s", filename.c_str());
return(false);
}
result.reallocate();
unsigned int32 *readData = longimagedata((char *)filename.c_str());
if (!readData) {
//error("GemImageLoad: error reading SGI image file: %s", filename.c_str());
return false;
}
unsigned char *src = reinterpret_cast<unsigned char*>(readData);
unsigned char *dst = &(result.data[0]);
const int yStride = result.xsize * result.csize;
// do RGBA data
if (csize == 4) {
while (ysize--) {
unsigned char *pixels = dst;
int count = xsize;
while(count--) {
pixels[chRed] = src[0];
pixels[chGreen] = src[1];
pixels[chBlue] = src[2];
pixels[chAlpha] = src[3];
pixels += 4;
src += 4;
}
dst += yStride;
}
}
else if (csize == 3) {
// do RGB data
while (ysize--) {
unsigned char *pixels = dst;
int count = xsize;
while(count--) {
pixels[chRed] = src[0];
pixels[chGreen] = src[1];
pixels[chBlue] = src[2];
pixels[chAlpha] = 255;;
pixels += 4;
src += 4;
}
dst += yStride;
}
} else {
// do grayscale
while (ysize--) {
unsigned char *pixels = dst;
int count = xsize;
while(count--) {
pixels[0] = src[0];
pixels++;
src += 4;
}
dst += yStride;
}
}
free(readData);
return true;
}
bool imageSGI::save(const imageStruct&image, const std::string&filename, const std::string&mimetype, const gem::Properties&props) {
return false;
}
float imageSGI::estimateSave(const imageStruct&img, const std::string&filename, const std::string&mimetype, const gem::Properties&props) {
return 0.;
}