00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "jinclude.h"
00020 #include "jpeglib.h"
00021 #include "jerror.h"
00022
00023 #ifndef HAVE_STDLIB_H
00024 extern void * malloc JPP((size_t size));
00025 extern void free JPP((void *ptr));
00026 #endif
00027
00028 #if 0
00029
00030
00031
00032 typedef struct {
00033 struct jpeg_destination_mgr pub;
00034
00035 FILE * outfile;
00036 JOCTET * buffer;
00037 } my_destination_mgr;
00038
00039 typedef my_destination_mgr * my_dest_ptr;
00040
00041 #define OUTPUT_BUF_SIZE 4096
00042
00043 #endif // 0
00044
00045
00046
00047 typedef struct {
00048 struct jpeg_destination_mgr pub;
00049
00050 unsigned char ** outbuffer;
00051 unsigned long * outsize;
00052 unsigned char * newbuffer;
00053 JOCTET * buffer;
00054 size_t bufsize;
00055 } my_mem_destination_mgr;
00056
00057 typedef my_mem_destination_mgr * my_mem_dest_ptr;
00058
00059
00060
00061
00062
00063
00064 METHODDEF(void)
00065 init_destination (j_compress_ptr cinfo)
00066 {
00067 my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
00068
00069
00070 dest->buffer = (JOCTET *)
00071 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00072 OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
00073
00074 dest->pub.next_output_byte = dest->buffer;
00075 dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
00076 }
00077
00078 METHODDEF(void)
00079 init_mem_destination (j_compress_ptr cinfo)
00080 {
00081
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 #if 0
00109 METHODDEF(boolean)
00110 empty_output_buffer (j_compress_ptr cinfo)
00111 {
00112 my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
00113
00114 if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) !=
00115 (size_t) OUTPUT_BUF_SIZE)
00116 ERREXIT(cinfo, JERR_FILE_WRITE);
00117
00118 dest->pub.next_output_byte = dest->buffer;
00119 dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
00120
00121 return TRUE;
00122 }
00123 #endif // 0
00124
00125 METHODDEF(boolean)
00126 empty_mem_output_buffer (j_compress_ptr cinfo)
00127 {
00128 size_t nextsize;
00129 JOCTET * nextbuffer;
00130 my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
00131
00132
00133 nextsize = dest->bufsize * 2;
00134 nextbuffer = malloc(nextsize);
00135
00136 if (nextbuffer == NULL)
00137 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
00138
00139 MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
00140
00141 if (dest->newbuffer != NULL)
00142 free(dest->newbuffer);
00143
00144 dest->newbuffer = nextbuffer;
00145
00146 dest->pub.next_output_byte = nextbuffer + dest->bufsize;
00147 dest->pub.free_in_buffer = dest->bufsize;
00148
00149 dest->buffer = nextbuffer;
00150 dest->bufsize = nextsize;
00151
00152 return TRUE;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 METHODDEF(void)
00166 term_destination (j_compress_ptr cinfo)
00167 {
00168 my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
00169 size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;
00170
00171
00172 if (datacount > 0) {
00173 if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount)
00174 ERREXIT(cinfo, JERR_FILE_WRITE);
00175 }
00176 fflush(dest->outfile);
00177
00178 if (ferror(dest->outfile))
00179 ERREXIT(cinfo, JERR_FILE_WRITE);
00180 }
00181
00182 METHODDEF(void)
00183 term_mem_destination (j_compress_ptr cinfo)
00184 {
00185 my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
00186
00187 *dest->outbuffer = dest->buffer;
00188 *dest->outsize = dest->bufsize - dest->pub.free_in_buffer;
00189 }
00190
00191
00192
00193
00194
00195
00196
00197 GLOBAL(void)
00198 jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
00199 {
00200 my_dest_ptr dest;
00201
00202
00203
00204
00205
00206
00207
00208 if (cinfo->dest == NULL) {
00209 cinfo->dest = (struct jpeg_destination_mgr *)
00210 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
00211 SIZEOF(my_destination_mgr));
00212 }
00213
00214 dest = (my_dest_ptr) cinfo->dest;
00215 dest->pub.init_destination = init_destination;
00216 dest->pub.empty_output_buffer = empty_output_buffer;
00217 dest->pub.term_destination = term_destination;
00218 dest->outfile = outfile;
00219 }
00220 #endif // 0
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 GLOBAL(void)
00234 jpeg_mem_dest (j_compress_ptr cinfo,
00235 unsigned char ** outbuffer, unsigned long * outsize)
00236 {
00237 my_mem_dest_ptr dest;
00238
00239 if (outbuffer == NULL || outsize == NULL)
00240 ERREXIT(cinfo, JERR_BUFFER_SIZE);
00241
00242
00243
00244
00245 if (cinfo->dest == NULL) {
00246 cinfo->dest = (struct jpeg_destination_mgr *)
00247 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
00248 SIZEOF(my_mem_destination_mgr));
00249 }
00250
00251 dest = (my_mem_dest_ptr) cinfo->dest;
00252 dest->pub.init_destination = init_mem_destination;
00253 dest->pub.empty_output_buffer = empty_mem_output_buffer;
00254 dest->pub.term_destination = term_mem_destination;
00255 dest->outbuffer = outbuffer;
00256 dest->outsize = outsize;
00257 dest->newbuffer = NULL;
00258
00259 if (*outbuffer == NULL || *outsize == 0) {
00260
00261 dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE);
00262 if (dest->newbuffer == NULL)
00263 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
00264 *outsize = OUTPUT_BUF_SIZE;
00265 }
00266
00267 dest->pub.next_output_byte = dest->buffer = *outbuffer;
00268 dest->pub.free_in_buffer = dest->bufsize = *outsize;
00269 }