19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * transupp.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1997, 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 image transformation routines and other utility code 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * used by the jpegtran sample application. These are NOT part of the core 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * JPEG library. But we keep these routines separate from jpegtran.c to 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * ease the task of maintaining jpegtran-like programs that have other user 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * interfaces. 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Although this file really shouldn't have access to the library internals, 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * it's helpful to let it call jround_up() and jcopy_block_row(). 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h" 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "transupp.h" /* My own external interface */ 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if TRANSFORMS_SUPPORTED 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Lossless image transformation routines. These routines work on DCT 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * coefficient arrays and thus do not require any lossy decompression 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or recompression of the image. 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Thanks to Guido Vollbeding for the initial design and code of this feature. 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Horizontal flipping is done in-place, using a single top-to-bottom 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pass through the virtual source array. It will thus be much the 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * fastest option for images larger than main memory. 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The other routines require a set of destination virtual arrays, so they 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * need twice as much memory as jpegtran normally does. The destination 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * arrays are always written in normal scan order (top to bottom) because 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the virtual array manager expects this. The source arrays will be scanned 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in the corresponding order, which means multiple passes through the source 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * arrays for most of the transforms. That could result in much thrashing 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if the image is larger than main memory. 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Some notes about the operating environment of the individual transform 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * routines: 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Both the source and destination virtual arrays are allocated from the 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * source JPEG object, and therefore should be manipulated by calling the 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * source's memory manager. 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. The destination's component count should be used. It may be smaller 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * than the source's when forcing to grayscale. 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 3. Likewise the destination's sampling factors should be used. When 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * forcing to grayscale the destination's sampling factors will be all 1, 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and we may as well take that as the effective iMCU size. 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4. When "trim" is in effect, the destination's dimensions will be the 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * trimmed values but the source's will be untrimmed. 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 5. All the routines assume that the source and destination buffers are 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * padded out to a full iMCU boundary. This is true, although for the 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * source buffer it is an undocumented property of jdcoefct.c. 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Notes 2,3,4 boil down to this: generally we should use the destination's 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * dimensions and ignore the source's. 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays) 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Horizontal flip; done in-place, so no separate dest array is required */ 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_cols, comp_width, blk_x, blk_y; 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, k, offset_y; 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY buffer; 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR ptr1, ptr2; 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEF temp1, temp2; 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Horizontal mirroring of DCT blocks is accomplished by swapping 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pairs of blocks in-place. Within a DCT block, we perform horizontal 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * mirroring by changing the signs of odd-numbered columns. 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Partial iMCUs at the right edge are left untouched. 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_width = MCU_cols * compptr->h_samp_factor; 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (blk_y = 0; blk_y < compptr->height_in_blocks; 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project blk_y += compptr->v_samp_factor) { 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project buffer = (*srcinfo->mem->access_virt_barray) 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y, 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) { 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ptr1 = buffer[offset_y][blk_x]; 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ptr2 = buffer[offset_y][comp_width - blk_x - 1]; 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* this unrolled loop doesn't need to know which row it's on... */ 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (k = 0; k < DCTSIZE2; k += 2) { 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project temp1 = *ptr1; /* swap even column */ 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project temp2 = *ptr2; 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr1++ = temp2; 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr2++ = temp1; 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project temp1 = *ptr1; /* swap odd column with sign change */ 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project temp2 = *ptr2; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr1++ = -temp2; 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr2++ = -temp1; 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Vertical flip */ 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_y; 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKROW src_row_ptr, dst_row_ptr; 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We output into a separate array because we can't touch different 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rows of the source virtual array simultaneously. Otherwise, this 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is a pretty straightforward analog of horizontal flip. 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Within a DCT block, vertical mirroring is done by changing the signs 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of odd-numbered rows. 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Partial iMCUs at the bottom edge are copied verbatim. 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height = MCU_rows * compptr->v_samp_factor; 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Row is within the mirrorable area. */ 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor, 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, FALSE); 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Bottom-edge blocks will be copied verbatim. */ 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y, 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, FALSE); 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Row is within the mirrorable area. */ 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_row_ptr = dst_buffer[offset_y]; 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_x++) { 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_row_ptr[dst_blk_x]; 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_row_ptr[dst_blk_x]; 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i += 2) { 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy even row */ 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* copy odd row with sign change */ 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = - *src_ptr++; 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Just copy row verbatim. */ 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jcopy_block_row(src_buffer[offset_y], dst_buffer[offset_y], 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr->width_in_blocks); 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Transpose source into destination */ 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION dst_blk_x, dst_blk_y; 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_x, offset_y; 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Transposing pixels within a block just requires transposing the 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * DCT coefficients. 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Partial iMCUs at the edges require no special treatment; we simply 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * process all the available DCT blocks for every component. 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_x += compptr->h_samp_factor) { 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->h_samp_factor, FALSE); 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 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 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 90 degree rotation is equivalent to 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Transposing the image; 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Horizontal mirroring. 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These two steps are merged into a single processing routine. 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_x, offset_y; 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Because of the horizontal mirror step, we can't process partial iMCUs 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at the (output) right edge properly. They just get transposed and 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * not mirrored. 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_width = MCU_cols * compptr->h_samp_factor; 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_x += compptr->h_samp_factor) { 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->h_samp_factor, FALSE); 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_x < comp_width) { 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Block is within the mirrorable area. */ 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y] 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project [comp_width - dst_blk_x - offset_x - 1]; 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project i++; 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Edge blocks are transposed but not mirrored. */ 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 270 degree rotation is equivalent to 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Horizontal mirroring; 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Transposing the image. 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These two steps are merged into a single processing routine. 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_x, offset_y; 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Because of the horizontal mirror step, we can't process partial iMCUs 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at the (output) bottom edge properly. They just get transposed and 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * not mirrored. 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height = MCU_rows * compptr->v_samp_factor; 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_x += compptr->h_samp_factor) { 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->h_samp_factor, FALSE); 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Block is within the mirrorable area. */ 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x] 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project [comp_height - dst_blk_y - offset_y - 1]; 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) { 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j++; 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Edge blocks are transposed but not mirrored. */ 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 180 degree rotation is equivalent to 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Vertical mirroring; 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Horizontal mirroring. 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These two steps are merged into a single processing routine. 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_y; 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKROW src_row_ptr, dst_row_ptr; 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_width = MCU_cols * compptr->h_samp_factor; 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height = MCU_rows * compptr->v_samp_factor; 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Row is within the vertically mirrorable area. */ 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor, 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, FALSE); 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Bottom-edge rows are only mirrored horizontally. */ 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y, 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, FALSE); 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Row is within the mirrorable area. */ 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_row_ptr = dst_buffer[offset_y]; 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Process the blocks that can be mirrored both ways. */ 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_row_ptr[dst_blk_x]; 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_row_ptr[comp_width - dst_blk_x - 1]; 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i += 2) { 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* For even row, negate every odd column. */ 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j += 2) { 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = - *src_ptr++; 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* For odd row, negate every even column. */ 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j += 2) { 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = - *src_ptr++; 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Any remaining right-edge blocks are only mirrored vertically. */ 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_row_ptr[dst_blk_x]; 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_row_ptr[dst_blk_x]; 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i += 2) { 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = - *src_ptr++; 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Remaining rows are just mirrored horizontally. */ 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_row_ptr = dst_buffer[offset_y]; 4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_row_ptr = src_buffer[offset_y]; 4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Process the blocks that can be mirrored. */ 4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { 4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_row_ptr[dst_blk_x]; 4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_row_ptr[comp_width - dst_blk_x - 1]; 4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE2; i += 2) { 4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = - *src_ptr++; 4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Any remaining right-edge blocks are only copied. */ 4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { 4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_row_ptr[dst_blk_x]; 4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_row_ptr[dst_blk_x]; 4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE2; i++) 4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *dst_ptr++ = *src_ptr++; 4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdo_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays) 4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Transverse transpose is equivalent to 4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. 180 degree rotation; 4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Transposition; 4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or 4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Horizontal mirroring; 4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Transposition; 4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 3. Horizontal mirroring. 4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These steps are merged into a single processing routine. 4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; 4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, i, j, offset_x, offset_y; 4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JBLOCKARRAY src_buffer, dst_buffer; 4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOEFPTR src_ptr, dst_ptr; 4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); 4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); 4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_width = MCU_cols * compptr->h_samp_factor; 4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project comp_height = MCU_rows * compptr->v_samp_factor; 4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; 4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_y += compptr->v_samp_factor) { 4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_buffer = (*srcinfo->mem->access_virt_barray) 4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, 4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor, TRUE); 4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { 4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; 4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_blk_x += compptr->h_samp_factor) { 4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_buffer = (*srcinfo->mem->access_virt_barray) 4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, 4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->h_samp_factor, FALSE); 4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { 4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_y < comp_height) { 4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x] 4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project [comp_height - dst_blk_y - offset_y - 1]; 5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_x < comp_width) { 5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Block is within the mirrorable area. */ 5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y] 5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project [comp_width - dst_blk_x - offset_x - 1]; 5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) { 5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j++; 5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project i++; 5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) { 5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j++; 5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Right-edge blocks are mirrored in y only */ 5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; 5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) { 5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j++; 5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; 5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dst_blk_x < comp_width) { 5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Bottom-edge blocks are mirrored in x only */ 5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y] 5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project [comp_width - dst_blk_x - offset_x - 1]; 5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project i++; 5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; 5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* At lower right corner, just transpose, no mirroring */ 5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; 5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) 5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < DCTSIZE; j++) 5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; 5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Request any required workspace. 5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We allocate the workspace virtual arrays from the source decompression 5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * object, so that all the arrays (both the original data and the workspace) 5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * will be taken into account while making memory management decisions. 5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Hence, this routine must be called after jpeg_read_header (which reads 5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the image dimensions) and before jpeg_read_coefficients (which realizes 5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the source's virtual arrays). 5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjtransform_request_workspace (j_decompress_ptr srcinfo, 5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_transform_info *info) 5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *coef_arrays = NULL; 5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci; 5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->force_grayscale && 5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project srcinfo->jpeg_color_space == JCS_YCbCr && 5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project srcinfo->num_components == 3) { 5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We'll only process the first component */ 5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->num_components = 1; 5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Process all the components */ 5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->num_components = srcinfo->num_components; 5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (info->transform) { 5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_NONE: 5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_H: 5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Don't need a workspace array */ 5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_V: 5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_180: 5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Need workspace arrays having same dimensions as source image. 5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that we allocate arrays padded out to the next iMCU boundary, 5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * so that transform routines need not worry about missing edge blocks. 5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project coef_arrays = (jvirt_barray_ptr *) 5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, 5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(jvirt_barray_ptr) * info->num_components); 5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < info->num_components; ci++) { 6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = srcinfo->comp_info + ci; 6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) 6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, 6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) compptr->width_in_blocks, 6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) compptr->h_samp_factor), 6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) compptr->height_in_blocks, 6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) compptr->v_samp_factor), 6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->v_samp_factor); 6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSPOSE: 6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSVERSE: 6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_90: 6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_270: 6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Need workspace arrays having transposed dimensions. 6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that we allocate arrays padded out to the next iMCU boundary, 6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * so that transform routines need not worry about missing edge blocks. 6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project coef_arrays = (jvirt_barray_ptr *) 6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, 6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(jvirt_barray_ptr) * info->num_components); 6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < info->num_components; ci++) { 6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = srcinfo->comp_info + ci; 6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) 6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, 6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) compptr->height_in_blocks, 6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) compptr->v_samp_factor), 6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) compptr->width_in_blocks, 6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) compptr->h_samp_factor), 6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) compptr->h_samp_factor); 6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->workspace_coef_arrays = coef_arrays; 6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Transpose destination image parameters */ 6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 6409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttranspose_critical_parameters (j_compress_ptr dstinfo) 6419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int tblno, i, j, ci, itemp; 6439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 6449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JQUANT_TBL *qtblptr; 6459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION dtemp; 6469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project UINT16 qtemp; 6479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Transpose basic image dimensions */ 6499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dtemp = dstinfo->image_width; 6509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->image_width = dstinfo->image_height; 6519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->image_height = dtemp; 6529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Transpose sampling factors */ 6549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 6559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr = dstinfo->comp_info + ci; 6569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project itemp = compptr->h_samp_factor; 6579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr->h_samp_factor = compptr->v_samp_factor; 6589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr->v_samp_factor = itemp; 6599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Transpose quantization tables */ 6629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { 6639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qtblptr = dstinfo->quant_tbl_ptrs[tblno]; 6649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (qtblptr != NULL) { 6659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < DCTSIZE; i++) { 6669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (j = 0; j < i; j++) { 6679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qtemp = qtblptr->quantval[i*DCTSIZE+j]; 6689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i]; 6699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qtblptr->quantval[j*DCTSIZE+i] = qtemp; 6709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Trim off any partial iMCUs on the indicated destination edge */ 6789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 6809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttrim_right_edge (j_compress_ptr dstinfo) 6819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, max_h_samp_factor; 6839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_cols; 6849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We have to compute max_h_samp_factor ourselves, 6869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * because it hasn't been set yet in the destination 6879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (and we don't want to use the source's value). 6889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 6899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_h_samp_factor = 1; 6909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 6919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int h_samp_factor = dstinfo->comp_info[ci].h_samp_factor; 6929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_h_samp_factor = MAX(max_h_samp_factor, h_samp_factor); 6939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 6949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_cols = dstinfo->image_width / (max_h_samp_factor * DCTSIZE); 6959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (MCU_cols > 0) /* can't trim to 0 pixels */ 6969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->image_width = MCU_cols * (max_h_samp_factor * DCTSIZE); 6979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 7009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttrim_bottom_edge (j_compress_ptr dstinfo) 7019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 7029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, max_v_samp_factor; 7039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION MCU_rows; 7049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We have to compute max_v_samp_factor ourselves, 7069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * because it hasn't been set yet in the destination 7079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (and we don't want to use the source's value). 7089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 7099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_v_samp_factor = 1; 7109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < dstinfo->num_components; ci++) { 7119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int v_samp_factor = dstinfo->comp_info[ci].v_samp_factor; 7129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project max_v_samp_factor = MAX(max_v_samp_factor, v_samp_factor); 7139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MCU_rows = dstinfo->image_height / (max_v_samp_factor * DCTSIZE); 7159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (MCU_rows > 0) /* can't trim to 0 pixels */ 7169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->image_height = MCU_rows * (max_v_samp_factor * DCTSIZE); 7179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 7189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Adjust output image parameters as needed. 7219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 7229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This must be called after jpeg_copy_critical_parameters() 7239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and before jpeg_write_coefficients(). 7249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 7259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The return value is the set of virtual coefficient arrays to be written 7269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (either the ones allocated by jtransform_request_workspace, or the 7279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * original source data arrays). The caller will need to pass this value 7289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to jpeg_write_coefficients(). 7299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 7309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(jvirt_barray_ptr *) 7329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjtransform_adjust_parameters (j_decompress_ptr srcinfo, 7339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j_compress_ptr dstinfo, 7349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 7359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_transform_info *info) 7369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 7379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If force-to-grayscale is requested, adjust destination parameters */ 7389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->force_grayscale) { 7399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed 7409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * properly. Among other things, the target h_samp_factor & v_samp_factor 7419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * will get set to 1, which typically won't match the source. 7429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In fact we do this even if the source is already grayscale; that 7439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * provides an easy way of coercing a grayscale JPEG with funny sampling 7449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * factors to the customary 1,1. (Some decoders fail on other factors.) 7459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 7469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((dstinfo->jpeg_color_space == JCS_YCbCr && 7479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->num_components == 3) || 7489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (dstinfo->jpeg_color_space == JCS_GRAYSCALE && 7499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->num_components == 1)) { 7509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We have to preserve the source's quantization table number. */ 7519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no; 7529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE); 7539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no; 7549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 7559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Sorry, can't do it */ 7569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL); 7579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 7609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Correct the destination's image dimensions etc if necessary */ 7619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (info->transform) { 7629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_NONE: 7639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Nothing to do */ 7649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_H: 7669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) 7679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_right_edge(dstinfo); 7689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_V: 7709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) 7719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_bottom_edge(dstinfo); 7729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSPOSE: 7749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project transpose_critical_parameters(dstinfo); 7759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* transpose does NOT have to trim anything */ 7769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSVERSE: 7789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project transpose_critical_parameters(dstinfo); 7799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) { 7809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_right_edge(dstinfo); 7819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_bottom_edge(dstinfo); 7829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_90: 7859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project transpose_critical_parameters(dstinfo); 7869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) 7879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_right_edge(dstinfo); 7889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_180: 7909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) { 7919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_right_edge(dstinfo); 7929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_bottom_edge(dstinfo); 7939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 7949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 7959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_270: 7969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project transpose_critical_parameters(dstinfo); 7979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->trim) 7989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project trim_bottom_edge(dstinfo); 7999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 8019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Return the appropriate output data set */ 8039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (info->workspace_coef_arrays != NULL) 8049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return info->workspace_coef_arrays; 8059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return src_coef_arrays; 8069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 8079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Execute the actual transformation, if any. 8109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 8119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This must be called *after* jpeg_write_coefficients, because it depends 8129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * on jpeg_write_coefficients to have computed subsidiary values such as 8139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the per-component width and height fields in the destination object. 8149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 8159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that some transformations will modify the source data arrays! 8169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 8179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 8199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjtransform_execute_transformation (j_decompress_ptr srcinfo, 8209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j_compress_ptr dstinfo, 8219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *src_coef_arrays, 8229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_transform_info *info) 8239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 8249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays; 8259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (info->transform) { 8279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_NONE: 8289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_H: 8309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_flip_h(srcinfo, dstinfo, src_coef_arrays); 8319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_FLIP_V: 8339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_flip_v(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSPOSE: 8369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_transpose(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_TRANSVERSE: 8399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_transverse(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_90: 8429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_rot_90(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_180: 8459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_rot_180(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JXFORM_ROT_270: 8489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do_rot_270(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); 8499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 8509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 8519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 8529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* TRANSFORMS_SUPPORTED */ 8549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Setup decompression object to save desired markers in memory. 8579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This must be called before jpeg_read_header() to have the desired effect. 8589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 8599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 8619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option) 8629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 8639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef SAVE_MARKERS_SUPPORTED 8649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int m; 8659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Save comments except under NONE option */ 8679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (option != JCOPYOPT_NONE) { 8689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF); 8699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 8709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Save all types of APPn markers iff ALL option */ 8719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (option == JCOPYOPT_ALL) { 8729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (m = 0; m < 16; m++) 8739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF); 8749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 8759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* SAVE_MARKERS_SUPPORTED */ 8769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 8779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Copy markers saved in the given source object to the destination object. 8799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This should be called just after jpeg_start_compress() or 8809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_write_coefficients(). 8819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that those routines will have written the SOI, and also the 8829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * JFIF APP0 or Adobe APP14 markers if selected. 8839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 8849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 8869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, 8879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JCOPY_OPTION option) 8889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 8899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_saved_marker_ptr marker; 8909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 8919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* In the current implementation, we don't actually need to examine the 8929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * option flag here; we just copy everything that got saved. 8939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * But to avoid confusion, we do not output JFIF and Adobe APP14 markers 8949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if the encoder library already wrote one. 8959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 8969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { 8979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dstinfo->write_JFIF_header && 8989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project marker->marker == JPEG_APP0 && 8999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project marker->data_length >= 5 && 9009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[0]) == 0x4A && 9019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[1]) == 0x46 && 9029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[2]) == 0x49 && 9039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[3]) == 0x46 && 9049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[4]) == 0) 9059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project continue; /* reject duplicate JFIF */ 9069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (dstinfo->write_Adobe_marker && 9079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project marker->marker == JPEG_APP0+14 && 9089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project marker->data_length >= 5 && 9099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[0]) == 0x41 && 9109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[1]) == 0x64 && 9119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[2]) == 0x6F && 9129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[3]) == 0x62 && 9139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project GETJOCTET(marker->data[4]) == 0x65) 9149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project continue; /* reject duplicate Adobe */ 9159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_FAR_POINTERS 9169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We could use jpeg_write_marker if the data weren't FAR... */ 9179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project { 9189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int i; 9199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_write_m_header(dstinfo, marker->marker, marker->data_length); 9209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < marker->data_length; i++) 9219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_write_m_byte(dstinfo, marker->data[i]); 9229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 9239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 9249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_write_marker(dstinfo, marker->marker, 9259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project marker->data, marker->data_length); 9269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 9279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 9289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 929