19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * example.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file illustrates how to use the IJG code as a subroutine library 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to read or write JPEG image files. You should look at this code in 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * conjunction with the documentation file libjpeg.doc. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This code will not do anything useful as-is, but it may be helpful as a 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * skeleton for constructing routines that call the JPEG library. 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We present these routines in the same coding style used in the JPEG code 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (ANSI function definitions, etc); but you are of course free to code your 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * routines in a different style if you prefer. 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <stdio.h> 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Include file for users of JPEG library. 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You will need to have included system headers that define at least 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the typedefs FILE and size_t before you can include jpeglib.h. 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (stdio.h is sufficient on ANSI-conforming systems.) 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You may also wish to include "jerror.h". 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * <setjmp.h> is used for the optional error recovery mechanism shown in 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the second part of the example. 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <setjmp.h> 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This half of the example shows how to feed data into the JPEG compressor. 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We present a minimal version that does not worry about refinements such 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * as error recovery (the JPEG code will just exit() if it gets an error). 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * IMAGE DATA FORMATS: 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The standard input image format is a rectangular array of pixels, with 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * each pixel having the same number of "component" values (color channels). 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you are working with color data, then the color values for each pixel 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * RGB color. 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For this example, we'll assume that this data structure matches the way 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * our application has stored the image in memory, so we can just pass a 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pointer to our image buffer. In particular, let's say that the image is 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * RGB color and is described by: 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern int image_height; /* Number of rows in image */ 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern int image_width; /* Number of columns in image */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Sample routine for JPEG compression. We assume that the target file name 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and a compression quality factor are passed in. 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_JPEG_file (char * filename, int quality) 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* This struct contains the JPEG compression parameters and pointers to 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * working space (which is allocated as needed by the JPEG library). 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It is possible to have several such structures, representing multiple 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * compression/decompression processes, in existence at once. We refer 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to any one struct (and its associated working data) as a "JPEG object". 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_compress_struct cinfo; 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* This struct represents a JPEG error handler. It is declared separately 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * because applications often want to supply a specialized error handler 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (see the second half of this file for an example). But here we just 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * take the easy way out and use the standard error handler, which will 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * print a message on stderr and call exit() if compression fails. 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that this struct must live as long as the main JPEG parameter 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * struct, to avoid dangling-pointer problems. 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_error_mgr jerr; 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* More stuff */ 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * outfile; /* target file */ 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int row_stride; /* physical row width in image buffer */ 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 1: allocate and initialize JPEG compression object */ 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We have to set up the error handler first, in case the initialization 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * step fails. (Unlikely, but it could happen if you are out of memory.) 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine fills in the contents of struct jerr, and returns jerr's 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * address which we place into the link field in cinfo. 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.err = jpeg_std_error(&jerr); 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now we can initialize the JPEG compression object. */ 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_create_compress(&cinfo); 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 2: specify data destination (eg, a file) */ 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Note: steps 2 and 3 can be done in either order. */ 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Here we use the library-supplied code to send compressed data to a 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * stdio stream. You can also write your own code to do something else. 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * requires it in order to write binary files. 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((outfile = fopen(filename, "wb")) == NULL) { 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "can't open %s\n", filename); 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(1); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_stdio_dest(&cinfo, outfile); 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 3: set parameters for compression */ 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* First we supply a description of the input image. 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Four fields of the cinfo struct must be filled in: 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.image_width = image_width; /* image width and height, in pixels */ 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.image_height = image_height; 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.input_components = 3; /* # of color components per pixel */ 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now use the library's routine to set default compression parameters. 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (You must set at least cinfo.in_color_space before calling this, 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * since the defaults depend on the source color space.) 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_defaults(&cinfo); 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now you can set any non-default parameters you wish to. 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here we just illustrate the use of quality (quantization table) scaling: 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 4: Start compressor */ 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* TRUE ensures that we will write a complete interchange-JPEG file. 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Pass TRUE unless you are very sure of what you're doing. 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_start_compress(&cinfo, TRUE); 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 5: while (scan lines remain to be written) */ 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* jpeg_write_scanlines(...); */ 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Here we use the library's state variable cinfo.next_scanline as the 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * loop counter, so that we don't have to keep track ourselves. 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To keep things simple, we pass one scanline per call; you can pass 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * more if you wish, though. 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (cinfo.next_scanline < cinfo.image_height) { 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* jpeg_write_scanlines expects an array of pointers to scanlines. 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here the array is only one element long, but you could pass 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * more than one scanline at a time if that's more convenient. 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 6: Finish compression */ 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_finish_compress(&cinfo); 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* After finish_compress, we can close the output file. */ 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(outfile); 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 7: release JPEG compression object */ 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* This is an important step since it will release a good deal of memory. */ 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_destroy_compress(&cinfo); 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* And we're done! */ 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * SOME FINE POINTS: 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In the above loop, we ignored the return value of jpeg_write_scanlines, 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which is the number of scanlines actually written. We could get away 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with this because we were only relying on the value of cinfo.next_scanline, 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which will be incremented correctly. If you maintain additional loop 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * variables then you should be careful to increment them properly. 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Actually, for output to a stdio stream you needn't worry, because 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * then jpeg_write_scanlines will write all the lines passed (or else exit 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with a fatal error). Partial writes can only occur if you use a data 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * destination module that can demand suspension of the compressor. 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (If you don't know what that's for, you don't need it.) 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If the compressor requires full-image buffers (for entropy-coding 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * optimization or a multi-scan JPEG file), it will create temporary 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * files for anything that doesn't fit within the maximum-memory setting. 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (Note that temp files are NOT needed if you use the default parameters.) 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * On some systems you may need to set up a signal handler to ensure that 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * temporary files are deleted if the program is interrupted. See libjpeg.doc. 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * files to be compatible with everyone else's. If you cannot readily read 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * your data in that order, you'll need an intermediate array to hold the 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * source data using the JPEG code's internal virtual-array mechanisms. 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This half of the example shows how to read data from the JPEG decompressor. 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It's a bit more refined than the above, in that we show: 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (a) how to modify the JPEG library's standard error-reporting behavior; 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (b) how to allocate workspace using the library's memory manager. 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Just to make this example a little different from the first one, we'll 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * assume that we do not intend to put the whole image into an in-memory 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * buffer, but to send it line-by-line someplace else. We need a one- 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * memory manager allocate it for us. This approach is actually quite useful 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * because we don't need to remember to deallocate the buffer separately: it 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * will go away automatically when the JPEG object is cleaned up. 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * ERROR HANDLING: 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The JPEG library's standard error handler (jerror.c) is divided into 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * several "methods" which you can override individually. This lets you 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * adjust the behavior without duplicating a lot of code, which you might 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * have to update with each future release. 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Our example here shows how to override the "error_exit" method so that 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * control is returned to the library's caller when a fatal error occurs, 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rather than calling exit() as the standard error_exit method does. 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We use C's setjmp/longjmp facility to return control. This means that the 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * routine which calls the JPEG library must first execute a setjmp() call to 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * establish the return point. We want the replacement error_exit to do a 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * longjmp(). But we need to make the setjmp buffer accessible to the 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * error_exit routine. To do this, we make a private extension of the 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * standard JPEG error handler object. (If we were using C++, we'd say we 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * were making a subclass of the regular error handler.) 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here's the extended error handler struct: 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstruct my_error_mgr { 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_error_mgr pub; /* "public" fields */ 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jmp_buf setjmp_buffer; /* for return to caller */ 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}; 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct my_error_mgr * my_error_ptr; 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here's the routine that will replace the standard error_exit method: 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectmy_error_exit (j_common_ptr cinfo) 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_error_ptr myerr = (my_error_ptr) cinfo->err; 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Always display the message. */ 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We could postpone this until after returning, if we chose. */ 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->err->output_message) (cinfo); 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Return control to the setjmp point */ 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project longjmp(myerr->setjmp_buffer, 1); 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Sample routine for JPEG decompression. We assume that the source file name 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is passed in. We want to return 1 on success, 0 on error. 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(int) 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_JPEG_file (char * filename) 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* This struct contains the JPEG decompression parameters and pointers to 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * working space (which is allocated as needed by the JPEG library). 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_decompress_struct cinfo; 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We use our private extension JPEG error handler. 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that this struct must live as long as the main JPEG parameter 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * struct, to avoid dangling-pointer problems. 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct my_error_mgr jerr; 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* More stuff */ 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * infile; /* source file */ 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY buffer; /* Output row buffer */ 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int row_stride; /* physical row width in output buffer */ 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* In this example we want to open the input file before doing anything else, 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * so that the setjmp() error recovery below can assume the file is open. 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * requires it in order to read binary files. 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((infile = fopen(filename, "rb")) == NULL) { 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "can't open %s\n", filename); 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 0; 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 1: allocate and initialize JPEG decompression object */ 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We set up the normal JPEG error routines, then override error_exit. */ 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.err = jpeg_std_error(&jerr.pub); 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jerr.pub.error_exit = my_error_exit; 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Establish the setjmp return context for my_error_exit to use. */ 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (setjmp(jerr.setjmp_buffer)) { 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If we get here, the JPEG code has signaled an error. 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We need to clean up the JPEG object, close the input file, and return. 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_destroy_decompress(&cinfo); 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(infile); 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 0; 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now we can initialize the JPEG decompression object. */ 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_create_decompress(&cinfo); 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 2: specify data source (eg, a file) */ 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_stdio_src(&cinfo, infile); 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 3: read file parameters with jpeg_read_header() */ 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_read_header(&cinfo, TRUE); 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We can ignore the return value from jpeg_read_header since 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (a) suspension is not possible with the stdio data source, and 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (b) we passed TRUE to reject a tables-only JPEG file as an error. 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * See libjpeg.doc for more info. 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 4: set parameters for decompression */ 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* In this example, we don't need to change any of the defaults set by 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_read_header(), so we do nothing here. 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 5: Start decompressor */ 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_start_decompress(&cinfo); 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We can ignore the return value since suspension is not possible 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with the stdio data source. 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We may need to do some setup of our own at this point before reading 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the data. After jpeg_start_decompress() we have the correct scaled 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * output image dimensions available, as well as the output colormap 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if we asked for color quantization. 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In this example, we need to make an output work buffer of the right size. 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* JSAMPLEs per row in output buffer */ 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_stride = cinfo.output_width * cinfo.output_components; 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Make a one-row-high sample array that will go away when done with image */ 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project buffer = (*cinfo.mem->alloc_sarray) 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 6: while (scan lines remain to be read) */ 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* jpeg_read_scanlines(...); */ 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Here we use the library's state variable cinfo.output_scanline as the 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * loop counter, so that we don't have to keep track ourselves. 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (cinfo.output_scanline < cinfo.output_height) { 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* jpeg_read_scanlines expects an array of pointers to scanlines. 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here the array is only one element long, but you could ask for 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * more than one scanline at a time if that's more convenient. 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_read_scanlines(&cinfo, buffer, 1); 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Assume put_scanline_someplace wants a pointer and sample count. */ 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project put_scanline_someplace(buffer[0], row_stride); 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 7: Finish decompression */ 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_finish_decompress(&cinfo); 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We can ignore the return value since suspension is not possible 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with the stdio data source. 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Step 8: Release JPEG decompression object */ 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* This is an important step since it will release a good deal of memory. */ 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_destroy_decompress(&cinfo); 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* After finish_decompress, we can close the input file. 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Here we postpone it until after no more JPEG errors are possible, 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * so as to simplify the setjmp error logic above. (Actually, I don't 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * think that jpeg_destroy can do an error exit, but why assume anything...) 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(infile); 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* At this point you may want to check to see whether any corrupt-data 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * warnings occurred (test whether jerr.pub.num_warnings is nonzero). 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* And we're done! */ 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 1; 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * SOME FINE POINTS: 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In the above code, we ignored the return value of jpeg_read_scanlines, 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which is the number of scanlines actually read. We could get away with 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this because we asked for only one line at a time and we weren't using 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a suspending data source. See libjpeg.doc for more info. 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we should have done it beforehand to ensure that the space would be 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * counted against the JPEG max_memory setting. In some systems the above 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * code would risk an out-of-memory error. However, in general we don't 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * know the output image dimensions before jpeg_start_decompress(), unless we 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * call jpeg_calc_output_dimensions(). See libjpeg.doc for more about this. 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Scanlines are returned in the same order as they appear in the JPEG file, 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which is standardly top-to-bottom. If you must emit data bottom-to-top, 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * you can use one of the virtual arrays provided by the JPEG memory manager 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to invert the data. See wrbmp.c for an example. 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * As with compression, some operating modes may require temporary files. 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * On some systems you may need to set up a signal handler to ensure that 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * temporary files are deleted if the program is interrupted. See libjpeg.doc. 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 434