1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
#include "GmshConfig.h"
#include "gl2jpeg.h"
#undef EXTERN
#if !defined(HAVE_LIBJPEG)
void create_jpeg(FILE *outfile, PixelBuffer *buffer, int quality, int smoothing)
{
Msg::Error("This version of Gmsh was compiled without JPEG support");
}
#else
extern "C" {
#include <jpeglib.h>
#include <jerror.h>
}
static void my_output_message(j_common_ptr cinfo)
{
char buffer[JMSG_LENGTH_MAX];
(*cinfo->err->format_message)(cinfo, buffer);
Msg::Debug("%s", buffer);
}
void create_jpeg(FILE *outfile, PixelBuffer *buffer, int quality, int smoothing)
{
if(buffer->getFormat() != GL_RGB || buffer->getType() != GL_UNSIGNED_BYTE) {
Msg::Error("JPEG only implemented for GL_RGB and GL_UNSIGNED_BYTE");
return;
}
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
cinfo.err->output_message = my_output_message;
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = buffer->getWidth();
cinfo.image_height = buffer->getHeight();
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);
cinfo.optimize_coding = TRUE;
cinfo.smoothing_factor = smoothing;
jpeg_start_compress(&cinfo, TRUE);
unsigned char *pixels = (unsigned char *)buffer->getPixels();
JSAMPROW row_pointer[1];
int row_stride = cinfo.image_width * cinfo.input_components;
int i = cinfo.image_height - 1;
while(i >= 0) {
row_pointer[0] = &pixels[i * row_stride];
(void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
i--;
}
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
}
#endif
|