vrshoot
diff libs/libjpeg/jdatadst.c @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/libjpeg/jdatadst.c Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,151 @@ 1.4 +/* 1.5 + * jdatadst.c 1.6 + * 1.7 + * Copyright (C) 1994-1996, Thomas G. Lane. 1.8 + * This file is part of the Independent JPEG Group's software. 1.9 + * For conditions of distribution and use, see the accompanying README file. 1.10 + * 1.11 + * This file contains compression data destination routines for the case of 1.12 + * emitting JPEG data to a file (or any stdio stream). While these routines 1.13 + * are sufficient for most applications, some will want to use a different 1.14 + * destination manager. 1.15 + * IMPORTANT: we assume that fwrite() will correctly transcribe an array of 1.16 + * JOCTETs into 8-bit-wide elements on external storage. If char is wider 1.17 + * than 8 bits on your machine, you may need to do some tweaking. 1.18 + */ 1.19 + 1.20 +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ 1.21 +#include "jinclude.h" 1.22 +#include "jpeglib.h" 1.23 +#include "jerror.h" 1.24 + 1.25 + 1.26 +/* Expanded data destination object for stdio output */ 1.27 + 1.28 +typedef struct { 1.29 + struct jpeg_destination_mgr pub; /* public fields */ 1.30 + 1.31 + FILE * outfile; /* target stream */ 1.32 + JOCTET * buffer; /* start of buffer */ 1.33 +} my_destination_mgr; 1.34 + 1.35 +typedef my_destination_mgr * my_dest_ptr; 1.36 + 1.37 +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ 1.38 + 1.39 + 1.40 +/* 1.41 + * Initialize destination --- called by jpeg_start_compress 1.42 + * before any data is actually written. 1.43 + */ 1.44 + 1.45 +METHODDEF(void) 1.46 +init_destination (j_compress_ptr cinfo) 1.47 +{ 1.48 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 1.49 + 1.50 + /* Allocate the output buffer --- it will be released when done with image */ 1.51 + dest->buffer = (JOCTET *) 1.52 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 1.53 + OUTPUT_BUF_SIZE * SIZEOF(JOCTET)); 1.54 + 1.55 + dest->pub.next_output_byte = dest->buffer; 1.56 + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; 1.57 +} 1.58 + 1.59 + 1.60 +/* 1.61 + * Empty the output buffer --- called whenever buffer fills up. 1.62 + * 1.63 + * In typical applications, this should write the entire output buffer 1.64 + * (ignoring the current state of next_output_byte & free_in_buffer), 1.65 + * reset the pointer & count to the start of the buffer, and return TRUE 1.66 + * indicating that the buffer has been dumped. 1.67 + * 1.68 + * In applications that need to be able to suspend compression due to output 1.69 + * overrun, a FALSE return indicates that the buffer cannot be emptied now. 1.70 + * In this situation, the compressor will return to its caller (possibly with 1.71 + * an indication that it has not accepted all the supplied scanlines). The 1.72 + * application should resume compression after it has made more room in the 1.73 + * output buffer. Note that there are substantial restrictions on the use of 1.74 + * suspension --- see the documentation. 1.75 + * 1.76 + * When suspending, the compressor will back up to a convenient restart point 1.77 + * (typically the start of the current MCU). next_output_byte & free_in_buffer 1.78 + * indicate where the restart point will be if the current call returns FALSE. 1.79 + * Data beyond this point will be regenerated after resumption, so do not 1.80 + * write it out when emptying the buffer externally. 1.81 + */ 1.82 + 1.83 +METHODDEF(boolean) 1.84 +empty_output_buffer (j_compress_ptr cinfo) 1.85 +{ 1.86 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 1.87 + 1.88 + if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) != 1.89 + (size_t) OUTPUT_BUF_SIZE) 1.90 + ERREXIT(cinfo, JERR_FILE_WRITE); 1.91 + 1.92 + dest->pub.next_output_byte = dest->buffer; 1.93 + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; 1.94 + 1.95 + return TRUE; 1.96 +} 1.97 + 1.98 + 1.99 +/* 1.100 + * Terminate destination --- called by jpeg_finish_compress 1.101 + * after all data has been written. Usually needs to flush buffer. 1.102 + * 1.103 + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding 1.104 + * application must deal with any cleanup that should happen even 1.105 + * for error exit. 1.106 + */ 1.107 + 1.108 +METHODDEF(void) 1.109 +term_destination (j_compress_ptr cinfo) 1.110 +{ 1.111 + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; 1.112 + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; 1.113 + 1.114 + /* Write any data remaining in the buffer */ 1.115 + if (datacount > 0) { 1.116 + if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount) 1.117 + ERREXIT(cinfo, JERR_FILE_WRITE); 1.118 + } 1.119 + fflush(dest->outfile); 1.120 + /* Make sure we wrote the output file OK */ 1.121 + if (ferror(dest->outfile)) 1.122 + ERREXIT(cinfo, JERR_FILE_WRITE); 1.123 +} 1.124 + 1.125 + 1.126 +/* 1.127 + * Prepare for output to a stdio stream. 1.128 + * The caller must have already opened the stream, and is responsible 1.129 + * for closing it after finishing compression. 1.130 + */ 1.131 + 1.132 +GLOBAL(void) 1.133 +jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) 1.134 +{ 1.135 + my_dest_ptr dest; 1.136 + 1.137 + /* The destination object is made permanent so that multiple JPEG images 1.138 + * can be written to the same file without re-executing jpeg_stdio_dest. 1.139 + * This makes it dangerous to use this manager and a different destination 1.140 + * manager serially with the same JPEG object, because their private object 1.141 + * sizes may be different. Caveat programmer. 1.142 + */ 1.143 + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ 1.144 + cinfo->dest = (struct jpeg_destination_mgr *) 1.145 + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 1.146 + SIZEOF(my_destination_mgr)); 1.147 + } 1.148 + 1.149 + dest = (my_dest_ptr) cinfo->dest; 1.150 + dest->pub.init_destination = init_destination; 1.151 + dest->pub.empty_output_buffer = empty_output_buffer; 1.152 + dest->pub.term_destination = term_destination; 1.153 + dest->outfile = outfile; 1.154 +}