// 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 ); }