Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
jdpostct.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #define JPEG_INTERNALS
00020 #include "jinclude.h"
00021 #include "jpeglib.h"
00022 
00023 
00024 
00025 
00026 typedef struct {
00027   struct jpeg_d_post_controller pub; 
00028 
00029   
00030 
00031 
00032 
00033 
00034   jvirt_sarray_ptr whole_image; 
00035   JSAMPARRAY buffer;            
00036   JDIMENSION strip_height;      
00037   
00038   JDIMENSION starting_row;      
00039   JDIMENSION next_row;          
00040 } my_post_controller;
00041 
00042 typedef my_post_controller * my_post_ptr;
00043 
00044 
00045 
00046 METHODDEF(void) post_process_1pass
00047         JPP((j_decompress_ptr cinfo,
00048              JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00049              JDIMENSION in_row_groups_avail,
00050              JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00051              JDIMENSION out_rows_avail));
00052 #ifdef QUANT_2PASS_SUPPORTED
00053 METHODDEF(void) post_process_prepass
00054         JPP((j_decompress_ptr cinfo,
00055              JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00056              JDIMENSION in_row_groups_avail,
00057              JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00058              JDIMENSION out_rows_avail));
00059 METHODDEF(void) post_process_2pass
00060         JPP((j_decompress_ptr cinfo,
00061              JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00062              JDIMENSION in_row_groups_avail,
00063              JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00064              JDIMENSION out_rows_avail));
00065 #endif
00066 
00067 
00068 
00069 
00070 
00071 
00072 METHODDEF(void)
00073 start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
00074 {
00075   my_post_ptr post = (my_post_ptr) cinfo->post;
00076 
00077   switch (pass_mode) {
00078   case JBUF_PASS_THRU:
00079     if (cinfo->quantize_colors) {
00080       
00081       post->pub.post_process_data = post_process_1pass;
00082       
00083 
00084 
00085 
00086       if (post->buffer == NULL) {
00087         post->buffer = (*cinfo->mem->access_virt_sarray)
00088           ((j_common_ptr) cinfo, post->whole_image,
00089            (JDIMENSION) 0, post->strip_height, TRUE);
00090       }
00091     } else {
00092       
00093 
00094 
00095       post->pub.post_process_data = cinfo->upsample->upsample;
00096     }
00097     break;
00098 #ifdef QUANT_2PASS_SUPPORTED
00099   case JBUF_SAVE_AND_PASS:
00100     
00101     if (post->whole_image == NULL)
00102       ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00103     post->pub.post_process_data = post_process_prepass;
00104     break;
00105   case JBUF_CRANK_DEST:
00106     
00107     if (post->whole_image == NULL)
00108       ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00109     post->pub.post_process_data = post_process_2pass;
00110     break;
00111 #endif 
00112   default:
00113     ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00114     break;
00115   }
00116   post->starting_row = post->next_row = 0;
00117 }
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 METHODDEF(void)
00126 post_process_1pass (j_decompress_ptr cinfo,
00127                     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00128                     JDIMENSION in_row_groups_avail,
00129                     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00130                     JDIMENSION out_rows_avail)
00131 {
00132   my_post_ptr post = (my_post_ptr) cinfo->post;
00133   JDIMENSION num_rows, max_rows;
00134 
00135   
00136   
00137   max_rows = out_rows_avail - *out_row_ctr;
00138   if (max_rows > post->strip_height)
00139     max_rows = post->strip_height;
00140   num_rows = 0;
00141   (*cinfo->upsample->upsample) (cinfo,
00142                 input_buf, in_row_group_ctr, in_row_groups_avail,
00143                 post->buffer, &num_rows, max_rows);
00144   
00145   (*cinfo->cquantize->color_quantize) (cinfo,
00146                 post->buffer, output_buf + *out_row_ctr, (int) num_rows);
00147   *out_row_ctr += num_rows;
00148 }
00149 
00150 
00151 #ifdef QUANT_2PASS_SUPPORTED
00152 
00153 
00154 
00155 
00156 
00157 METHODDEF(void)
00158 post_process_prepass (j_decompress_ptr cinfo,
00159                       JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00160                       JDIMENSION in_row_groups_avail,
00161                       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00162                       JDIMENSION out_rows_avail)
00163 {
00164   my_post_ptr post = (my_post_ptr) cinfo->post;
00165   JDIMENSION old_next_row, num_rows;
00166 
00167   
00168   if (post->next_row == 0) {
00169     post->buffer = (*cinfo->mem->access_virt_sarray)
00170         ((j_common_ptr) cinfo, post->whole_image,
00171          post->starting_row, post->strip_height, TRUE);
00172   }
00173 
00174   
00175   old_next_row = post->next_row;
00176   (*cinfo->upsample->upsample) (cinfo,
00177                 input_buf, in_row_group_ctr, in_row_groups_avail,
00178                 post->buffer, &post->next_row, post->strip_height);
00179 
00180   
00181   
00182   if (post->next_row > old_next_row) {
00183     num_rows = post->next_row - old_next_row;
00184     (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
00185                                          (JSAMPARRAY) NULL, (int) num_rows);
00186     *out_row_ctr += num_rows;
00187   }
00188 
00189   
00190   if (post->next_row >= post->strip_height) {
00191     post->starting_row += post->strip_height;
00192     post->next_row = 0;
00193   }
00194 }
00195 
00196 
00197 
00198 
00199 
00200 
00201 METHODDEF(void)
00202 post_process_2pass (j_decompress_ptr cinfo,
00203                     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
00204                     JDIMENSION in_row_groups_avail,
00205                     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00206                     JDIMENSION out_rows_avail)
00207 {
00208   my_post_ptr post = (my_post_ptr) cinfo->post;
00209   JDIMENSION num_rows, max_rows;
00210 
00211   
00212   if (post->next_row == 0) {
00213     post->buffer = (*cinfo->mem->access_virt_sarray)
00214         ((j_common_ptr) cinfo, post->whole_image,
00215          post->starting_row, post->strip_height, FALSE);
00216   }
00217 
00218   
00219   num_rows = post->strip_height - post->next_row; 
00220   max_rows = out_rows_avail - *out_row_ctr; 
00221   if (num_rows > max_rows)
00222     num_rows = max_rows;
00223   
00224   max_rows = cinfo->output_height - post->starting_row;
00225   if (num_rows > max_rows)
00226     num_rows = max_rows;
00227 
00228   
00229   (*cinfo->cquantize->color_quantize) (cinfo,
00230                 post->buffer + post->next_row, output_buf + *out_row_ctr,
00231                 (int) num_rows);
00232   *out_row_ctr += num_rows;
00233 
00234   
00235   post->next_row += num_rows;
00236   if (post->next_row >= post->strip_height) {
00237     post->starting_row += post->strip_height;
00238     post->next_row = 0;
00239   }
00240 }
00241 
00242 #endif 
00243 
00244 
00245 
00246 
00247 
00248 
00249 GLOBAL(void)
00250 jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
00251 {
00252   my_post_ptr post;
00253 
00254   post = (my_post_ptr)
00255     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00256                                 SIZEOF(my_post_controller));
00257   cinfo->post = (struct jpeg_d_post_controller *) post;
00258   post->pub.start_pass = start_pass_dpost;
00259   post->whole_image = NULL;     
00260   post->buffer = NULL;          
00261 
00262   
00263   if (cinfo->quantize_colors) {
00264     
00265 
00266 
00267 
00268     post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
00269     if (need_full_buffer) {
00270       
00271       
00272 #ifdef QUANT_2PASS_SUPPORTED
00273       post->whole_image = (*cinfo->mem->request_virt_sarray)
00274         ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
00275          cinfo->output_width * cinfo->out_color_components,
00276          (JDIMENSION) jround_up((long) cinfo->output_height,
00277                                 (long) post->strip_height),
00278          post->strip_height);
00279 #else
00280       ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00281 #endif 
00282     } else {
00283       
00284       post->buffer = (*cinfo->mem->alloc_sarray)
00285         ((j_common_ptr) cinfo, JPOOL_IMAGE,
00286          cinfo->output_width * cinfo->out_color_components,
00287          post->strip_height);
00288     }
00289   }
00290 }