19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jdpostct.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1994-1996, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains the decompression postprocessing controller. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This controller manages the upsampling, color conversion, and color 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * quantization/reduction steps; specifically, it controls the buffering 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * between upsample/color conversion and color quantization/reduction. 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If no color quantization/reduction is required, then this module has no 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * work to do, and it just hands off to the upsample/color conversion code. 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * An integrated upsample/convert/quantize process would replace this module 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * entirely. 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h" 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private buffer controller object */ 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_d_post_controller pub; /* public fields */ 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Color quantization source buffer: this holds output data from 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the upsample/color conversion step to be passed to the quantizer. 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For two-pass color quantization, we need a full-image buffer; 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * for one-pass operation, a strip buffer is sufficient. 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION strip_height; /* buffer size in rows */ 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* for two-pass mode only: */ 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION starting_row; /* row # of first row in current strip */ 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION next_row; /* index of next row to fill/empty in strip */ 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} my_post_controller; 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef my_post_controller * my_post_ptr; 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Forward declarations */ 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) post_process_1pass 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JPP((j_decompress_ptr cinfo, 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail)); 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) post_process_prepass 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JPP((j_decompress_ptr cinfo, 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail)); 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) post_process_2pass 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JPP((j_decompress_ptr cinfo, 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail)); 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for a processing pass. 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_post_ptr post = (my_post_ptr) cinfo->post; 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (pass_mode) { 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_PASS_THRU: 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->quantize_colors) { 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Single-pass processing with color quantization. */ 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->pub.post_process_data = post_process_1pass; 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We could be doing buffered-image output before starting a 2-pass 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * color quantization; in that case, jinit_d_post_controller did not 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * allocate a strip buffer. Use the virtual-array buffer as workspace. 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->buffer == NULL) { 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer = (*cinfo->mem->access_virt_sarray) 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, post->whole_image, 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) 0, post->strip_height, TRUE); 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* For single-pass processing without color quantization, 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * I have no work to do; just call the upsampler directly. 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->pub.post_process_data = cinfo->upsample->upsample; 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_SAVE_AND_PASS: 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* First pass of 2-pass quantization */ 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->whole_image == NULL) 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->pub.post_process_data = post_process_prepass; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_CRANK_DEST: 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Second pass of 2-pass quantization */ 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->whole_image == NULL) 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->pub.post_process_data = post_process_2pass; 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* QUANT_2PASS_SUPPORTED */ 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->starting_row = post->next_row = 0; 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Process some data in the one-pass (strip buffer) case. 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is used for color precision reduction as well as one-pass quantization. 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpost_process_1pass (j_decompress_ptr cinfo, 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail) 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_post_ptr post = (my_post_ptr) cinfo->post; 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION num_rows, max_rows; 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fill the buffer, but not more than what we can dump out in one go. */ 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Note we rely on the upsampler to detect bottom of image. */ 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_rows = out_rows_avail - *out_row_ctr; 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (max_rows > post->strip_height) 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_rows = post->strip_height; 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = 0; 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->upsample->upsample) (cinfo, 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project input_buf, in_row_group_ctr, in_row_groups_avail, 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer, &num_rows, max_rows); 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Quantize and emit data. */ 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->cquantize->color_quantize) (cinfo, 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer, output_buf + *out_row_ctr, (int) num_rows); 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *out_row_ctr += num_rows; 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Process some data in the first pass of 2-pass quantization. 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpost_process_prepass (j_decompress_ptr cinfo, 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail) 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_post_ptr post = (my_post_ptr) cinfo->post; 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION old_next_row, num_rows; 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Reposition virtual buffer if at start of strip. */ 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->next_row == 0) { 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer = (*cinfo->mem->access_virt_sarray) 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, post->whole_image, 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->starting_row, post->strip_height, TRUE); 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Upsample some data (up to a strip height's worth). */ 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project old_next_row = post->next_row; 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->upsample->upsample) (cinfo, 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project input_buf, in_row_group_ctr, in_row_groups_avail, 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer, &post->next_row, post->strip_height); 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allow quantizer to scan new data. No data is emitted, */ 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* but we advance out_row_ctr so outer loop can tell when we're done. */ 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->next_row > old_next_row) { 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = post->next_row - old_next_row; 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JSAMPARRAY) NULL, (int) num_rows); 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *out_row_ctr += num_rows; 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Advance if we filled the strip. */ 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->next_row >= post->strip_height) { 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->starting_row += post->strip_height; 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->next_row = 0; 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Process some data in the second pass of 2-pass quantization. 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpost_process_2pass (j_decompress_ptr cinfo, 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_row_groups_avail, 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION out_rows_avail) 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_post_ptr post = (my_post_ptr) cinfo->post; 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION num_rows, max_rows; 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Reposition virtual buffer if at start of strip. */ 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->next_row == 0) { 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer = (*cinfo->mem->access_virt_sarray) 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, post->whole_image, 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->starting_row, post->strip_height, FALSE); 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Determine number of rows to emit. */ 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = post->strip_height - post->next_row; /* available in strip */ 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_rows > max_rows) 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = max_rows; 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We have to check bottom of image here, can't depend on upsampler. */ 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_rows = cinfo->output_height - post->starting_row; 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_rows > max_rows) 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_rows = max_rows; 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Quantize and emit data. */ 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->cquantize->color_quantize) (cinfo, 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer + post->next_row, output_buf + *out_row_ctr, 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (int) num_rows); 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *out_row_ctr += num_rows; 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Advance if we filled the strip. */ 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->next_row += num_rows; 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (post->next_row >= post->strip_height) { 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->starting_row += post->strip_height; 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->next_row = 0; 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* QUANT_2PASS_SUPPORTED */ 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize postprocessing controller. 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_post_ptr post; 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post = (my_post_ptr) 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(my_post_controller)); 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->post = (struct jpeg_d_post_controller *) post; 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->pub.start_pass = start_pass_dpost; 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->whole_image = NULL; /* flag for no virtual arrays */ 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer = NULL; /* flag for no strip buffer */ 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create the quantization buffer, if needed */ 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->quantize_colors) { 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* The buffer strip height is max_v_samp_factor, which is typically 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an efficient number of rows for upsampling to return. 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (In the presence of output rescaling, we might want to be smarter?) 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (need_full_buffer) { 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Two-pass color quantization: need full-image storage. */ 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We round up the number of rows to a multiple of the strip height. */ 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->whole_image = (*cinfo->mem->request_virt_sarray) 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->output_width * cinfo->out_color_components, 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) cinfo->output_height, 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) post->strip_height), 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->strip_height); 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* QUANT_2PASS_SUPPORTED */ 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* One-pass color quantization: just make a strip buffer. */ 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->buffer = (*cinfo->mem->alloc_sarray) 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->output_width * cinfo->out_color_components, 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project post->strip_height); 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 291