// Copyright (C) 2019 Davis E. King (davis@dlib.net), Nils Labugt
// License: Boost Software License See LICENSE.txt for the full license.
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include <iostream>
struct jpeg_loader_error_mgr
{
jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
};
void jpeg_loader_error_exit (j_common_ptr cinfo)
{
jpeg_loader_error_mgr* myerr = (jpeg_loader_error_mgr*) cinfo->err;
longjmp(myerr->setjmp_buffer, 1);
}
// This code doesn't really make a lot of sense. It's just calling all the libjpeg functions to make
// sure they can be compiled and linked.
int main()
{
std::cerr << "This program is just for build system testing. Don't actually run it." << std::endl;
abort();
FILE *fp = fopen("whatever.jpg", "rb" );
jpeg_decompress_struct cinfo;
jpeg_loader_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = jpeg_loader_error_exit;
setjmp(jerr.setjmp_buffer);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, fp);
if (false) {
unsigned char imgbuffer[1234];
jpeg_mem_src(&cinfo, imgbuffer, sizeof(imgbuffer));
}
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
unsigned long height_ = cinfo.output_height;
unsigned long width_ = cinfo.output_width;
unsigned long output_components_ = cinfo.output_components;
unsigned char* rows[123];
while (cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo, &rows[cinfo.output_scanline], 100);
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose( fp );
}