You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

88 lines
2.1 KiB

// This file is part of libigl, a simple c++ geometry processing library.
//
// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
// obtain one at http://mozilla.org/MPL/2.0/.
#include "render_to_tga.h"
#include "tga.h"
#include "../../opengl2/gl.h"
#include <cstdlib>
IGL_INLINE bool igl::opengl::render_to_tga(
const std::string tga_file,
const int width,
const int height,
const bool alpha)
{
size_t components = 3;
GLenum format = GL_BGR;
if(alpha)
{
format = GL_BGRA;
components = 4;
}
GLubyte * cmap = NULL;
// OpenGL by default tries to read data in multiples of 4, if our data is
// only RGB or BGR and the width is not divible by 4 then we need to alert
// opengl
if((width % 4) != 0 &&
(format == GL_RGB ||
format == GL_BGR))
{
glPixelStorei(GL_PACK_ALIGNMENT, 1);
}
GLubyte *pixels;
pixels = (unsigned char *) malloc (width * height * components);
glReadPixels(
0,
0,
width,
height,
format,
GL_UNSIGNED_BYTE,
pixels);
// set up generic image struct
gliGenericImage * genericImage;
genericImage = (gliGenericImage*) malloc(sizeof(gliGenericImage));
genericImage->width = width;
genericImage->height = height;
genericImage->format = format;
genericImage->components = components;
genericImage->pixels = pixels;
// CMAP is not supported, but we need to put something here
genericImage->cmapEntries = 0;
genericImage->cmapFormat = GL_BGR;
genericImage->cmap = cmap;
// write pixels to tga file
FILE * imgFile;
// "-" as output file name is code for write to stdout
if(tga_file.compare("-") == 0)
{
imgFile = stdout;
}else{
imgFile = fopen(tga_file.c_str(),"w");
if(NULL==imgFile)
{
printf("IOError: %s could not be opened...\n",tga_file.c_str());
free(genericImage);
return false;
}
}
writeTGA(genericImage,imgFile);
free(genericImage);
return fclose(imgFile) == 0;
}
#ifdef IGL_STATIC_LIBRARY
// Explicit template instantiation
#endif