mirror of
https://github.com/GRRLIB/GRRLIB.git
synced 2024-11-10 10:22:20 +00:00
libjpeg updated to version 9a.
This commit is contained in:
parent
874be27e61
commit
5b39aa8893
37 changed files with 2103 additions and 1081 deletions
|
@ -2,7 +2,7 @@
|
||||||
* cjpeg.c
|
* cjpeg.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -172,6 +172,10 @@ usage (void)
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n");
|
fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n");
|
||||||
#endif
|
#endif
|
||||||
|
#if JPEG_LIB_VERSION_MAJOR >= 9
|
||||||
|
fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n");
|
||||||
|
fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n");
|
||||||
|
#endif
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
#ifdef DCT_ISLOW_SUPPORTED
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
||||||
|
@ -310,10 +314,27 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
/* Force a monochrome JPEG file to be generated. */
|
/* Force a monochrome JPEG file to be generated. */
|
||||||
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
||||||
|
|
||||||
} else if (keymatch(arg, "rgb", 3)) {
|
} else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) {
|
||||||
/* Force an RGB JPEG file to be generated. */
|
/* Force an RGB JPEG file to be generated. */
|
||||||
|
#if JPEG_LIB_VERSION_MAJOR >= 9
|
||||||
|
/* Note: Entropy table assignment in jpeg_set_colorspace depends
|
||||||
|
* on color_transform.
|
||||||
|
*/
|
||||||
|
cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE;
|
||||||
|
#endif
|
||||||
jpeg_set_colorspace(cinfo, JCS_RGB);
|
jpeg_set_colorspace(cinfo, JCS_RGB);
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "bgycc", 5)) {
|
||||||
|
/* Force a big gamut YCC JPEG file to be generated. */
|
||||||
|
#if JPEG_LIB_VERSION_MAJOR >= 9 && \
|
||||||
|
(JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1)
|
||||||
|
jpeg_set_colorspace(cinfo, JCS_BG_YCC);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n",
|
||||||
|
progname);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
#endif
|
||||||
|
|
||||||
} else if (keymatch(arg, "maxmemory", 3)) {
|
} else if (keymatch(arg, "maxmemory", 3)) {
|
||||||
/* Maximum memory in Kb (or Mb with 'm'). */
|
/* Maximum memory in Kb (or Mb with 'm'). */
|
||||||
long lval;
|
long lval;
|
||||||
|
@ -328,7 +349,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
} else if (keymatch(arg, "nosmooth", 3)) {
|
} else if (keymatch(arg, "nosmooth", 3)) {
|
||||||
/* Suppress fancy downsampling */
|
/* Suppress fancy downsampling. */
|
||||||
cinfo->do_fancy_downsampling = FALSE;
|
cinfo->do_fancy_downsampling = FALSE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
||||||
|
@ -414,7 +435,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
/* Scale the image by a fraction M/N. */
|
/* Scale the image by a fraction M/N. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%d/%d",
|
if (sscanf(argv[argn], "%u/%u",
|
||||||
&cinfo->scale_num, &cinfo->scale_denom) != 2)
|
&cinfo->scale_num, &cinfo->scale_denom) != 2)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* djpeg.c
|
* djpeg.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2009 by Guido Vollbeding.
|
* Modified 2009-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -298,7 +298,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
} else if (keymatch(arg, "nosmooth", 3)) {
|
} else if (keymatch(arg, "nosmooth", 3)) {
|
||||||
/* Suppress fancy upsampling */
|
/* Suppress fancy upsampling. */
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
cinfo->do_fancy_upsampling = FALSE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "onepass", 3)) {
|
} else if (keymatch(arg, "onepass", 3)) {
|
||||||
|
@ -327,7 +327,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
||||||
/* Scale the output image by a fraction M/N. */
|
/* Scale the output image by a fraction M/N. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%d/%d",
|
if (sscanf(argv[argn], "%u/%u",
|
||||||
&cinfo->scale_num, &cinfo->scale_denom) < 1)
|
&cinfo->scale_num, &cinfo->scale_denom) < 1)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcapistd.c
|
* jcapistd.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -145,7 +146,7 @@ jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
|
||||||
(*cinfo->master->pass_startup) (cinfo);
|
(*cinfo->master->pass_startup) (cinfo);
|
||||||
|
|
||||||
/* Verify that at least one iMCU row has been passed. */
|
/* Verify that at least one iMCU row has been passed. */
|
||||||
lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
|
lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size;
|
||||||
if (num_lines < lines_per_iMCU_row)
|
if (num_lines < lines_per_iMCU_row)
|
||||||
ERREXIT(cinfo, JERR_BUFFER_SIZE);
|
ERREXIT(cinfo, JERR_BUFFER_SIZE);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* jcarith.c
|
* jcarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2011 by Guido Vollbeding.
|
* Developed 1997-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -362,7 +362,6 @@ METHODDEF(boolean)
|
||||||
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
JBLOCKROW block;
|
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int blkn, ci, tbl;
|
int blkn, ci, tbl;
|
||||||
int v, v2, m;
|
int v, v2, m;
|
||||||
|
@ -381,14 +380,13 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
/* Encode the MCU data blocks */
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
block = MCU_data[blkn];
|
|
||||||
ci = cinfo->MCU_membership[blkn];
|
ci = cinfo->MCU_membership[blkn];
|
||||||
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
||||||
|
|
||||||
/* Compute the DC value after the required point transform by Al.
|
/* Compute the DC value after the required point transform by Al.
|
||||||
* This is simply an arithmetic right shift.
|
* This is simply an arithmetic right shift.
|
||||||
*/
|
*/
|
||||||
m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
|
m = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
|
||||||
|
|
||||||
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
||||||
|
|
||||||
|
@ -453,11 +451,11 @@ METHODDEF(boolean)
|
||||||
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
const int * natural_order;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int tbl, k, ke;
|
int tbl, k, ke;
|
||||||
int v, v2, m;
|
int v, v2, m;
|
||||||
const int * natural_order;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
/* Emit restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
|
@ -479,7 +477,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
||||||
|
|
||||||
/* Establish EOB (end-of-block) index */
|
/* Establish EOB (end-of-block) index */
|
||||||
for (ke = cinfo->Se; ke > 0; ke--)
|
ke = cinfo->Se;
|
||||||
|
do {
|
||||||
/* We must apply the point transform by Al. For AC coefficients this
|
/* We must apply the point transform by Al. For AC coefficients this
|
||||||
* is an integer division with rounding towards 0. To do this portably
|
* is an integer division with rounding towards 0. To do this portably
|
||||||
* in C, we shift after obtaining the absolute value.
|
* in C, we shift after obtaining the absolute value.
|
||||||
|
@ -490,13 +489,14 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
v = -v;
|
v = -v;
|
||||||
if (v >>= cinfo->Al) break;
|
if (v >>= cinfo->Al) break;
|
||||||
}
|
}
|
||||||
|
} while (--ke);
|
||||||
|
|
||||||
/* Figure F.5: Encode_AC_Coefficients */
|
/* Figure F.5: Encode_AC_Coefficients */
|
||||||
for (k = cinfo->Ss; k <= ke; k++) {
|
for (k = cinfo->Ss - 1; k < ke;) {
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
arith_encode(cinfo, st, 0); /* EOB decision */
|
arith_encode(cinfo, st, 0); /* EOB decision */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if ((v = (*block)[natural_order[k]]) >= 0) {
|
if ((v = (*block)[natural_order[++k]]) >= 0) {
|
||||||
if (v >>= cinfo->Al) {
|
if (v >>= cinfo->Al) {
|
||||||
arith_encode(cinfo, st + 1, 1);
|
arith_encode(cinfo, st + 1, 1);
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 0);
|
arith_encode(cinfo, entropy->fixed_bin, 0);
|
||||||
|
@ -510,7 +510,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arith_encode(cinfo, st + 1, 0); st += 3; k++;
|
arith_encode(cinfo, st + 1, 0);
|
||||||
|
st += 3;
|
||||||
}
|
}
|
||||||
st += 2;
|
st += 2;
|
||||||
/* Figure F.8: Encoding the magnitude category of v */
|
/* Figure F.8: Encoding the magnitude category of v */
|
||||||
|
@ -537,9 +538,9 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
while (m >>= 1)
|
while (m >>= 1)
|
||||||
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
||||||
}
|
}
|
||||||
/* Encode EOB decision only if k <= cinfo->Se */
|
/* Encode EOB decision only if k < cinfo->Se */
|
||||||
if (k <= cinfo->Se) {
|
if (k < cinfo->Se) {
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
arith_encode(cinfo, st, 1);
|
arith_encode(cinfo, st, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,6 +550,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCU encoding for DC successive approximation refinement scan.
|
* MCU encoding for DC successive approximation refinement scan.
|
||||||
|
* Note: we assume such scans can be multi-component,
|
||||||
|
* although the spec is not very clear on the point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
|
@ -590,11 +593,11 @@ METHODDEF(boolean)
|
||||||
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
const int * natural_order;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int tbl, k, ke, kex;
|
int tbl, k, ke, kex;
|
||||||
int v;
|
int v;
|
||||||
const int * natural_order;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
/* Emit restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
|
@ -616,7 +619,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Section G.1.3.3: Encoding of AC coefficients */
|
/* Section G.1.3.3: Encoding of AC coefficients */
|
||||||
|
|
||||||
/* Establish EOB (end-of-block) index */
|
/* Establish EOB (end-of-block) index */
|
||||||
for (ke = cinfo->Se; ke > 0; ke--)
|
ke = cinfo->Se;
|
||||||
|
do {
|
||||||
/* We must apply the point transform by Al. For AC coefficients this
|
/* We must apply the point transform by Al. For AC coefficients this
|
||||||
* is an integer division with rounding towards 0. To do this portably
|
* is an integer division with rounding towards 0. To do this portably
|
||||||
* in C, we shift after obtaining the absolute value.
|
* in C, we shift after obtaining the absolute value.
|
||||||
|
@ -627,6 +631,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
v = -v;
|
v = -v;
|
||||||
if (v >>= cinfo->Al) break;
|
if (v >>= cinfo->Al) break;
|
||||||
}
|
}
|
||||||
|
} while (--ke);
|
||||||
|
|
||||||
/* Establish EOBx (previous stage end-of-block) index */
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
for (kex = ke; kex > 0; kex--)
|
for (kex = ke; kex > 0; kex--)
|
||||||
|
@ -638,12 +643,12 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Figure G.10: Encode_AC_Coefficients_SA */
|
/* Figure G.10: Encode_AC_Coefficients_SA */
|
||||||
for (k = cinfo->Ss; k <= ke; k++) {
|
for (k = cinfo->Ss - 1; k < ke;) {
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
if (k > kex)
|
if (k >= kex)
|
||||||
arith_encode(cinfo, st, 0); /* EOB decision */
|
arith_encode(cinfo, st, 0); /* EOB decision */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if ((v = (*block)[natural_order[k]]) >= 0) {
|
if ((v = (*block)[natural_order[++k]]) >= 0) {
|
||||||
if (v >>= cinfo->Al) {
|
if (v >>= cinfo->Al) {
|
||||||
if (v >> 1) /* previously nonzero coef */
|
if (v >> 1) /* previously nonzero coef */
|
||||||
arith_encode(cinfo, st + 2, (v & 1));
|
arith_encode(cinfo, st + 2, (v & 1));
|
||||||
|
@ -665,12 +670,13 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arith_encode(cinfo, st + 1, 0); st += 3; k++;
|
arith_encode(cinfo, st + 1, 0);
|
||||||
|
st += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Encode EOB decision only if k <= cinfo->Se */
|
/* Encode EOB decision only if k < cinfo->Se */
|
||||||
if (k <= cinfo->Se) {
|
if (k < cinfo->Se) {
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
arith_encode(cinfo, st, 1);
|
arith_encode(cinfo, st, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,12 +692,13 @@ METHODDEF(boolean)
|
||||||
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
jpeg_component_info * compptr;
|
const int * natural_order;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int blkn, ci, tbl, k, ke;
|
int tbl, k, ke;
|
||||||
int v, v2, m;
|
int v, v2, m;
|
||||||
const int * natural_order;
|
int blkn, ci;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
/* Emit restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
|
@ -922,7 +929,7 @@ jinit_arith_encoder (j_compress_ptr cinfo)
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(arith_entropy_encoder));
|
SIZEOF(arith_entropy_encoder));
|
||||||
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
entropy->pub.finish_pass = finish_pass;
|
entropy->pub.finish_pass = finish_pass;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jccolor.c
|
* jccolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2011 by Guido Vollbeding.
|
* Modified 2011-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -29,13 +29,25 @@ typedef my_color_converter * my_cconvert_ptr;
|
||||||
/**************** RGB -> YCbCr conversion: most common case **************/
|
/**************** RGB -> YCbCr conversion: most common case **************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* YCbCr is defined per CCIR 601-1, except that Cb and Cr are
|
* YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
|
||||||
* normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
|
* previously known as Recommendation CCIR 601-1, except that Cb and Cr
|
||||||
* The conversion equations to be implemented are therefore
|
* are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
|
||||||
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
|
* sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
|
||||||
* Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
|
* sYCC (standard luma-chroma-chroma color space with extended gamut)
|
||||||
* Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
|
* is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
|
||||||
* (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
|
* bg-sRGB and bg-sYCC (big gamut standard color spaces)
|
||||||
|
* are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
|
||||||
|
* Note that the derived conversion coefficients given in some of these
|
||||||
|
* documents are imprecise. The general conversion equations are
|
||||||
|
* Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
|
||||||
|
* Cb = 0.5 * (B - Y) / (1 - Kb)
|
||||||
|
* Cr = 0.5 * (R - Y) / (1 - Kr)
|
||||||
|
* With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
|
||||||
|
* from the 1953 FCC NTSC primaries and CIE Illuminant C),
|
||||||
|
* the conversion equations to be implemented are therefore
|
||||||
|
* Y = 0.299 * R + 0.587 * G + 0.114 * B
|
||||||
|
* Cb = -0.168735892 * R - 0.331264108 * G + 0.5 * B + CENTERJSAMPLE
|
||||||
|
* Cr = 0.5 * R - 0.418687589 * G - 0.081312411 * B + CENTERJSAMPLE
|
||||||
* Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
|
* Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
|
||||||
* rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
|
* rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
|
||||||
* negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
|
* negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
|
||||||
|
@ -49,9 +61,9 @@ typedef my_color_converter * my_cconvert_ptr;
|
||||||
* For even more speed, we avoid doing any multiplications in the inner loop
|
* For even more speed, we avoid doing any multiplications in the inner loop
|
||||||
* by precalculating the constants times R,G,B for all possible values.
|
* by precalculating the constants times R,G,B for all possible values.
|
||||||
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
|
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
|
||||||
* for 12-bit samples it is still acceptable. It's not very reasonable for
|
* for 9-bit to 12-bit samples it is still acceptable. It's not very
|
||||||
* 16-bit samples, but if you want lossless storage you shouldn't be changing
|
* reasonable for 16-bit samples, but if you want lossless storage you
|
||||||
* colorspace anyway.
|
* shouldn't be changing colorspace anyway.
|
||||||
* The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
|
* The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
|
||||||
* in the tables to save adding them separately in the inner loop.
|
* in the tables to save adding them separately in the inner loop.
|
||||||
*/
|
*/
|
||||||
|
@ -96,21 +108,21 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
(TABLE_SIZE * SIZEOF(INT32)));
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
|
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
|
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
||||||
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
|
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
||||||
rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
|
rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
|
||||||
rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
|
rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
|
||||||
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
||||||
* This ensures that the maximum output will round to MAXJSAMPLE
|
* This ensures that the maximum output will round to MAXJSAMPLE
|
||||||
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
||||||
*/
|
*/
|
||||||
rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
|
rgb_ycc_tab[i+B_CB_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
||||||
/* B=>Cb and R=>Cr tables are the same
|
/* B=>Cb and R=>Cr tables are the same
|
||||||
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
|
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
||||||
*/
|
*/
|
||||||
rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
|
rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
|
||||||
rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
|
rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,8 +145,8 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register int r, g, b;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
|
register int r, g, b;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2;
|
register JSAMPROW outptr0, outptr1, outptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
|
@ -150,7 +162,6 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
|
@ -168,6 +179,7 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,8 +201,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register int r, g, b;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
|
register int r, g, b;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
|
@ -198,17 +210,16 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
inptr = *input_buf++;
|
inptr = *input_buf++;
|
||||||
outptr = output_buf[0][output_row];
|
outptr = output_buf[0][output_row++];
|
||||||
output_row++;
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
/* Y */
|
/* Y */
|
||||||
outptr[col] = (JSAMPLE)
|
outptr[col] = (JSAMPLE)
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,8 +239,8 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register int r, g, b;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
|
register int r, g, b;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
|
@ -248,7 +259,6 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
||||||
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
||||||
/* K passes through as-is */
|
/* K passes through as-is */
|
||||||
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
||||||
inptr += 4;
|
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
|
@ -266,6 +276,49 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
|
inptr += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
|
* [R,G,B] to [R-G,G,B-G] conversion with modulo calculation
|
||||||
|
* (forward reversible color transform).
|
||||||
|
* This can be seen as an adaption of the general RGB->YCbCr
|
||||||
|
* conversion equation with Kr = Kb = 0, while replacing the
|
||||||
|
* normalization by modulo calculation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
rgb_rgb1_convert (j_compress_ptr cinfo,
|
||||||
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
|
JDIMENSION output_row, int num_rows)
|
||||||
|
{
|
||||||
|
register int r, g, b;
|
||||||
|
register JSAMPROW inptr;
|
||||||
|
register JSAMPROW outptr0, outptr1, outptr2;
|
||||||
|
register JDIMENSION col;
|
||||||
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr = *input_buf++;
|
||||||
|
outptr0 = output_buf[0][output_row];
|
||||||
|
outptr1 = output_buf[1][output_row];
|
||||||
|
outptr2 = output_buf[2][output_row];
|
||||||
|
output_row++;
|
||||||
|
for (col = 0; col < num_cols; col++) {
|
||||||
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
||||||
|
* (modulo) operator is equivalent to the bitmask operator AND.
|
||||||
|
*/
|
||||||
|
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
|
outptr1[col] = (JSAMPLE) g;
|
||||||
|
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,7 +327,7 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
||||||
/*
|
/*
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
* This version handles grayscale output with no conversion.
|
* This version handles grayscale output with no conversion.
|
||||||
* The source can be either plain grayscale or YCbCr (since Y == gray).
|
* The source can be either plain grayscale or YCC (since Y == gray).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
|
@ -282,16 +335,15 @@ grayscale_convert (j_compress_ptr cinfo,
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
|
int instride = cinfo->input_components;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
int instride = cinfo->input_components;
|
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
inptr = *input_buf++;
|
inptr = *input_buf++;
|
||||||
outptr = output_buf[0][output_row];
|
outptr = output_buf[0][output_row++];
|
||||||
output_row++;
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
||||||
inptr += instride;
|
inptr += instride;
|
||||||
|
@ -344,20 +396,20 @@ null_convert (j_compress_ptr cinfo,
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
|
int ci;
|
||||||
|
register int nc = cinfo->num_components;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
register int ci;
|
|
||||||
int nc = cinfo->num_components;
|
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
/* It seems fastest to make a separate pass for each component. */
|
/* It seems fastest to make a separate pass for each component. */
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < nc; ci++) {
|
||||||
inptr = *input_buf;
|
inptr = input_buf[0] + ci;
|
||||||
outptr = output_buf[ci][output_row];
|
outptr = output_buf[ci][output_row];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
|
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
||||||
inptr += nc;
|
inptr += nc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,7 +442,7 @@ jinit_color_converter (j_compress_ptr cinfo)
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_color_converter));
|
SIZEOF(my_color_converter));
|
||||||
cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
/* set start_pass to null method until we find out differently */
|
/* set start_pass to null method until we find out differently */
|
||||||
cconvert->pub.start_pass = null_method;
|
cconvert->pub.start_pass = null_method;
|
||||||
|
|
||||||
|
@ -402,11 +454,13 @@ jinit_color_converter (j_compress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
|
case JCS_BG_RGB:
|
||||||
if (cinfo->input_components != RGB_PIXELSIZE)
|
if (cinfo->input_components != RGB_PIXELSIZE)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
|
case JCS_BG_YCC:
|
||||||
if (cinfo->input_components != 3)
|
if (cinfo->input_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
break;
|
||||||
|
@ -423,40 +477,96 @@ jinit_color_converter (j_compress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Support color transform only for RGB colorspaces */
|
||||||
|
if (cinfo->color_transform &&
|
||||||
|
cinfo->jpeg_color_space != JCS_RGB &&
|
||||||
|
cinfo->jpeg_color_space != JCS_BG_RGB)
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
|
||||||
/* Check num_components, set conversion method based on requested space */
|
/* Check num_components, set conversion method based on requested space */
|
||||||
switch (cinfo->jpeg_color_space) {
|
switch (cinfo->jpeg_color_space) {
|
||||||
case JCS_GRAYSCALE:
|
case JCS_GRAYSCALE:
|
||||||
if (cinfo->num_components != 1)
|
if (cinfo->num_components != 1)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_GRAYSCALE ||
|
switch (cinfo->in_color_space) {
|
||||||
cinfo->in_color_space == JCS_YCbCr)
|
case JCS_GRAYSCALE:
|
||||||
|
case JCS_YCbCr:
|
||||||
|
case JCS_BG_YCC:
|
||||||
cconvert->pub.color_convert = grayscale_convert;
|
cconvert->pub.color_convert = grayscale_convert;
|
||||||
else if (cinfo->in_color_space == JCS_RGB) {
|
break;
|
||||||
|
case JCS_RGB:
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
cconvert->pub.start_pass = rgb_ycc_start;
|
||||||
cconvert->pub.color_convert = rgb_gray_convert;
|
cconvert->pub.color_convert = rgb_gray_convert;
|
||||||
} else
|
break;
|
||||||
|
default:
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
|
case JCS_BG_RGB:
|
||||||
if (cinfo->num_components != 3)
|
if (cinfo->num_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_RGB)
|
if (cinfo->in_color_space == cinfo->jpeg_color_space) {
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
switch (cinfo->color_transform) {
|
||||||
else
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb_rgb1_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
|
} else
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
if (cinfo->num_components != 3)
|
if (cinfo->num_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_RGB) {
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_RGB:
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
cconvert->pub.start_pass = rgb_ycc_start;
|
||||||
cconvert->pub.color_convert = rgb_ycc_convert;
|
cconvert->pub.color_convert = rgb_ycc_convert;
|
||||||
} else if (cinfo->in_color_space == JCS_YCbCr)
|
break;
|
||||||
|
case JCS_YCbCr:
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
else
|
break;
|
||||||
|
default:
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JCS_BG_YCC:
|
||||||
|
if (cinfo->num_components != 3)
|
||||||
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_RGB:
|
||||||
|
/* For conversion from normal RGB input to BG_YCC representation,
|
||||||
|
* the Cb/Cr values are first computed as usual, and then
|
||||||
|
* quantized further after DCT processing by a factor of
|
||||||
|
* 2 in reference to the nominal quantization factor.
|
||||||
|
*/
|
||||||
|
/* need quantization scale by factor of 2 after DCT */
|
||||||
|
cinfo->comp_info[1].component_needed = TRUE;
|
||||||
|
cinfo->comp_info[2].component_needed = TRUE;
|
||||||
|
/* compute normal YCC first */
|
||||||
|
cconvert->pub.start_pass = rgb_ycc_start;
|
||||||
|
cconvert->pub.color_convert = rgb_ycc_convert;
|
||||||
|
break;
|
||||||
|
case JCS_YCbCr:
|
||||||
|
/* need quantization scale by factor of 2 after DCT */
|
||||||
|
cinfo->comp_info[1].component_needed = TRUE;
|
||||||
|
cinfo->comp_info[2].component_needed = TRUE;
|
||||||
|
/*FALLTHROUGH*/
|
||||||
|
case JCS_BG_YCC:
|
||||||
|
/* Pass through for BG_YCC input */
|
||||||
|
cconvert->pub.color_convert = null_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
|
@ -471,13 +581,17 @@ jinit_color_converter (j_compress_ptr cinfo)
|
||||||
case JCS_YCCK:
|
case JCS_YCCK:
|
||||||
if (cinfo->num_components != 4)
|
if (cinfo->num_components != 4)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_CMYK) {
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_CMYK:
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
cconvert->pub.start_pass = rgb_ycc_start;
|
||||||
cconvert->pub.color_convert = cmyk_ycck_convert;
|
cconvert->pub.color_convert = cmyk_ycck_convert;
|
||||||
} else if (cinfo->in_color_space == JCS_YCCK)
|
break;
|
||||||
|
case JCS_YCCK:
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
else
|
break;
|
||||||
|
default:
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* allow null conversion of JCS_UNKNOWN */
|
default: /* allow null conversion of JCS_UNKNOWN */
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcdctmgr.c
|
* jcdctmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -25,22 +26,30 @@ typedef struct {
|
||||||
/* Pointer to the DCT routine actually in use */
|
/* Pointer to the DCT routine actually in use */
|
||||||
forward_DCT_method_ptr do_dct[MAX_COMPONENTS];
|
forward_DCT_method_ptr do_dct[MAX_COMPONENTS];
|
||||||
|
|
||||||
/* The actual post-DCT divisors --- not identical to the quant table
|
|
||||||
* entries, because of scaling (especially for an unnormalized DCT).
|
|
||||||
* Each table is given in normal array order.
|
|
||||||
*/
|
|
||||||
DCTELEM * divisors[NUM_QUANT_TBLS];
|
|
||||||
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
#ifdef DCT_FLOAT_SUPPORTED
|
||||||
/* Same as above for the floating-point case. */
|
/* Same as above for the floating-point case. */
|
||||||
float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];
|
float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];
|
||||||
FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
|
|
||||||
#endif
|
#endif
|
||||||
} my_fdct_controller;
|
} my_fdct_controller;
|
||||||
|
|
||||||
typedef my_fdct_controller * my_fdct_ptr;
|
typedef my_fdct_controller * my_fdct_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
/* The allocated post-DCT divisor tables -- big enough for any
|
||||||
|
* supported variant and not identical to the quant table entries,
|
||||||
|
* because of scaling (especially for an unnormalized DCT) --
|
||||||
|
* are pointed to by dct_table in the per-component comp_info
|
||||||
|
* structures. Each table is given in normal array order.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
DCTELEM int_array[DCTSIZE2];
|
||||||
|
#ifdef DCT_FLOAT_SUPPORTED
|
||||||
|
FAST_FLOAT float_array[DCTSIZE2];
|
||||||
|
#endif
|
||||||
|
} divisor_table;
|
||||||
|
|
||||||
|
|
||||||
/* The current scaled-DCT routines require ISLOW-style divisor tables,
|
/* The current scaled-DCT routines require ISLOW-style divisor tables,
|
||||||
* so be sure to compile that code if either ISLOW or SCALING is requested.
|
* so be sure to compile that code if either ISLOW or SCALING is requested.
|
||||||
*/
|
*/
|
||||||
|
@ -71,7 +80,7 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
/* This routine is heavily used, so it's worth coding it tightly. */
|
||||||
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
||||||
forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];
|
forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];
|
||||||
DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
|
DCTELEM * divisors = (DCTELEM *) compptr->dct_table;
|
||||||
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
||||||
JDIMENSION bi;
|
JDIMENSION bi;
|
||||||
|
|
||||||
|
@ -134,7 +143,7 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
/* This routine is heavily used, so it's worth coding it tightly. */
|
||||||
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
||||||
float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];
|
float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];
|
||||||
FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
|
FAST_FLOAT * divisors = (FAST_FLOAT *) compptr->dct_table;
|
||||||
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
||||||
JDIMENSION bi;
|
JDIMENSION bi;
|
||||||
|
|
||||||
|
@ -352,22 +361,17 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
|
||||||
cinfo->quant_tbl_ptrs[qtblno] == NULL)
|
cinfo->quant_tbl_ptrs[qtblno] == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
|
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
|
||||||
qtbl = cinfo->quant_tbl_ptrs[qtblno];
|
qtbl = cinfo->quant_tbl_ptrs[qtblno];
|
||||||
/* Compute divisors for this quant table */
|
/* Create divisor table from quant table */
|
||||||
/* We may do this more than once for same table, but it's not a big deal */
|
|
||||||
switch (method) {
|
switch (method) {
|
||||||
#ifdef PROVIDE_ISLOW_TABLES
|
#ifdef PROVIDE_ISLOW_TABLES
|
||||||
case JDCT_ISLOW:
|
case JDCT_ISLOW:
|
||||||
/* For LL&M IDCT method, divisors are equal to raw quantization
|
/* For LL&M IDCT method, divisors are equal to raw quantization
|
||||||
* coefficients multiplied by 8 (to counteract scaling).
|
* coefficients multiplied by 8 (to counteract scaling).
|
||||||
*/
|
*/
|
||||||
if (fdct->divisors[qtblno] == NULL) {
|
dtbl = (DCTELEM *) compptr->dct_table;
|
||||||
fdct->divisors[qtblno] = (DCTELEM *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
DCTSIZE2 * SIZEOF(DCTELEM));
|
|
||||||
}
|
|
||||||
dtbl = fdct->divisors[qtblno];
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
for (i = 0; i < DCTSIZE2; i++) {
|
||||||
dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
|
dtbl[i] =
|
||||||
|
((DCTELEM) qtbl->quantval[i]) << (compptr->component_needed ? 4 : 3);
|
||||||
}
|
}
|
||||||
fdct->pub.forward_DCT[ci] = forward_DCT;
|
fdct->pub.forward_DCT[ci] = forward_DCT;
|
||||||
break;
|
break;
|
||||||
|
@ -395,17 +399,12 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
|
||||||
};
|
};
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
if (fdct->divisors[qtblno] == NULL) {
|
dtbl = (DCTELEM *) compptr->dct_table;
|
||||||
fdct->divisors[qtblno] = (DCTELEM *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
DCTSIZE2 * SIZEOF(DCTELEM));
|
|
||||||
}
|
|
||||||
dtbl = fdct->divisors[qtblno];
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
for (i = 0; i < DCTSIZE2; i++) {
|
||||||
dtbl[i] = (DCTELEM)
|
dtbl[i] = (DCTELEM)
|
||||||
DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
|
DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
|
||||||
(INT32) aanscales[i]),
|
(INT32) aanscales[i]),
|
||||||
CONST_BITS-3);
|
compptr->component_needed ? CONST_BITS-4 : CONST_BITS-3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fdct->pub.forward_DCT[ci] = forward_DCT;
|
fdct->pub.forward_DCT[ci] = forward_DCT;
|
||||||
|
@ -422,25 +421,20 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
|
||||||
* What's actually stored is 1/divisor so that the inner loop can
|
* What's actually stored is 1/divisor so that the inner loop can
|
||||||
* use a multiplication rather than a division.
|
* use a multiplication rather than a division.
|
||||||
*/
|
*/
|
||||||
FAST_FLOAT * fdtbl;
|
FAST_FLOAT * fdtbl = (FAST_FLOAT *) compptr->dct_table;
|
||||||
int row, col;
|
int row, col;
|
||||||
static const double aanscalefactor[DCTSIZE] = {
|
static const double aanscalefactor[DCTSIZE] = {
|
||||||
1.0, 1.387039845, 1.306562965, 1.175875602,
|
1.0, 1.387039845, 1.306562965, 1.175875602,
|
||||||
1.0, 0.785694958, 0.541196100, 0.275899379
|
1.0, 0.785694958, 0.541196100, 0.275899379
|
||||||
};
|
};
|
||||||
|
|
||||||
if (fdct->float_divisors[qtblno] == NULL) {
|
|
||||||
fdct->float_divisors[qtblno] = (FAST_FLOAT *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
DCTSIZE2 * SIZEOF(FAST_FLOAT));
|
|
||||||
}
|
|
||||||
fdtbl = fdct->float_divisors[qtblno];
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (row = 0; row < DCTSIZE; row++) {
|
for (row = 0; row < DCTSIZE; row++) {
|
||||||
for (col = 0; col < DCTSIZE; col++) {
|
for (col = 0; col < DCTSIZE; col++) {
|
||||||
fdtbl[i] = (FAST_FLOAT)
|
fdtbl[i] = (FAST_FLOAT)
|
||||||
(1.0 / (((double) qtbl->quantval[i] *
|
(1.0 / ((double) qtbl->quantval[i] *
|
||||||
aanscalefactor[row] * aanscalefactor[col] * 8.0)));
|
aanscalefactor[row] * aanscalefactor[col] *
|
||||||
|
(compptr->component_needed ? 16.0 : 8.0)));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -464,19 +458,20 @@ GLOBAL(void)
|
||||||
jinit_forward_dct (j_compress_ptr cinfo)
|
jinit_forward_dct (j_compress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_fdct_ptr fdct;
|
my_fdct_ptr fdct;
|
||||||
int i;
|
int ci;
|
||||||
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
fdct = (my_fdct_ptr)
|
fdct = (my_fdct_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_fdct_controller));
|
SIZEOF(my_fdct_controller));
|
||||||
cinfo->fdct = (struct jpeg_forward_dct *) fdct;
|
cinfo->fdct = &fdct->pub;
|
||||||
fdct->pub.start_pass = start_pass_fdctmgr;
|
fdct->pub.start_pass = start_pass_fdctmgr;
|
||||||
|
|
||||||
/* Mark divisor tables unallocated */
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
for (i = 0; i < NUM_QUANT_TBLS; i++) {
|
ci++, compptr++) {
|
||||||
fdct->divisors[i] = NULL;
|
/* Allocate a divisor table for each component */
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
compptr->dct_table =
|
||||||
fdct->float_divisors[i] = NULL;
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
#endif
|
SIZEOF(divisor_table));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jchuff.c
|
* jchuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2009 by Guido Vollbeding.
|
* Modified 2006-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -308,24 +308,27 @@ emit_bits_s (working_state * state, unsigned int code, int size)
|
||||||
/* Emit some bits; return TRUE if successful, FALSE if must suspend */
|
/* Emit some bits; return TRUE if successful, FALSE if must suspend */
|
||||||
{
|
{
|
||||||
/* This routine is heavily used, so it's worth coding tightly. */
|
/* This routine is heavily used, so it's worth coding tightly. */
|
||||||
register INT32 put_buffer = (INT32) code;
|
register INT32 put_buffer;
|
||||||
register int put_bits = state->cur.put_bits;
|
register int put_bits;
|
||||||
|
|
||||||
/* if size is 0, caller used an invalid Huffman table entry */
|
/* if size is 0, caller used an invalid Huffman table entry */
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
|
ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
|
||||||
|
|
||||||
put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
|
/* mask off any extra bits in code */
|
||||||
|
put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
|
||||||
put_bits += size; /* new number of bits in buffer */
|
|
||||||
|
/* new number of bits in buffer */
|
||||||
|
put_bits = size + state->cur.put_bits;
|
||||||
|
|
||||||
put_buffer <<= 24 - put_bits; /* align incoming bits */
|
put_buffer <<= 24 - put_bits; /* align incoming bits */
|
||||||
|
|
||||||
put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
|
/* and merge with old buffer contents */
|
||||||
|
put_buffer |= state->cur.put_buffer;
|
||||||
|
|
||||||
while (put_bits >= 8) {
|
while (put_bits >= 8) {
|
||||||
int c = (int) ((put_buffer >> 16) & 0xFF);
|
int c = (int) ((put_buffer >> 16) & 0xFF);
|
||||||
|
|
||||||
emit_byte_s(state, c, return FALSE);
|
emit_byte_s(state, c, return FALSE);
|
||||||
if (c == 0xFF) { /* need to stuff a zero byte? */
|
if (c == 0xFF) { /* need to stuff a zero byte? */
|
||||||
emit_byte_s(state, 0, return FALSE);
|
emit_byte_s(state, 0, return FALSE);
|
||||||
|
@ -347,8 +350,8 @@ emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
|
||||||
/* Emit some bits, unless we are in gather mode */
|
/* Emit some bits, unless we are in gather mode */
|
||||||
{
|
{
|
||||||
/* This routine is heavily used, so it's worth coding tightly. */
|
/* This routine is heavily used, so it's worth coding tightly. */
|
||||||
register INT32 put_buffer = (INT32) code;
|
register INT32 put_buffer;
|
||||||
register int put_bits = entropy->saved.put_bits;
|
register int put_bits;
|
||||||
|
|
||||||
/* if size is 0, caller used an invalid Huffman table entry */
|
/* if size is 0, caller used an invalid Huffman table entry */
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
|
@ -357,9 +360,11 @@ emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
|
||||||
if (entropy->gather_statistics)
|
if (entropy->gather_statistics)
|
||||||
return; /* do nothing if we're only getting stats */
|
return; /* do nothing if we're only getting stats */
|
||||||
|
|
||||||
put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
|
/* mask off any extra bits in code */
|
||||||
|
put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
|
||||||
put_bits += size; /* new number of bits in buffer */
|
|
||||||
|
/* new number of bits in buffer */
|
||||||
|
put_bits = size + entropy->saved.put_bits;
|
||||||
|
|
||||||
put_buffer <<= 24 - put_bits; /* align incoming bits */
|
put_buffer <<= 24 - put_bits; /* align incoming bits */
|
||||||
|
|
||||||
|
@ -543,10 +548,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int temp, temp2;
|
register int temp, temp2;
|
||||||
register int nbits;
|
register int nbits;
|
||||||
int blkn, ci;
|
int blkn, ci, tbl;
|
||||||
int Al = cinfo->Al;
|
|
||||||
JBLOCKROW block;
|
|
||||||
jpeg_component_info * compptr;
|
|
||||||
ISHIFT_TEMPS
|
ISHIFT_TEMPS
|
||||||
|
|
||||||
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
||||||
|
@ -559,28 +561,27 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
/* Encode the MCU data blocks */
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
block = MCU_data[blkn];
|
|
||||||
ci = cinfo->MCU_membership[blkn];
|
ci = cinfo->MCU_membership[blkn];
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
||||||
|
|
||||||
/* Compute the DC value after the required point transform by Al.
|
/* Compute the DC value after the required point transform by Al.
|
||||||
* This is simply an arithmetic right shift.
|
* This is simply an arithmetic right shift.
|
||||||
*/
|
*/
|
||||||
temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
|
temp = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
|
||||||
|
|
||||||
/* DC differences are figured on the point-transformed values. */
|
/* DC differences are figured on the point-transformed values. */
|
||||||
temp = temp2 - entropy->saved.last_dc_val[ci];
|
temp2 = temp - entropy->saved.last_dc_val[ci];
|
||||||
entropy->saved.last_dc_val[ci] = temp2;
|
entropy->saved.last_dc_val[ci] = temp;
|
||||||
|
|
||||||
/* Encode the DC coefficient difference per section G.1.2.1 */
|
/* Encode the DC coefficient difference per section G.1.2.1 */
|
||||||
temp2 = temp;
|
temp = temp2;
|
||||||
if (temp < 0) {
|
if (temp < 0) {
|
||||||
temp = -temp; /* temp is abs value of input */
|
temp = -temp; /* temp is abs value of input */
|
||||||
/* For a negative input, want temp2 = bitwise complement of abs(input) */
|
/* For a negative input, want temp2 = bitwise complement of abs(input) */
|
||||||
/* This code assumes we are on a two's complement machine */
|
/* This code assumes we are on a two's complement machine */
|
||||||
temp2--;
|
temp2--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the number of bits needed for the magnitude of the coefficient */
|
/* Find the number of bits needed for the magnitude of the coefficient */
|
||||||
nbits = 0;
|
nbits = 0;
|
||||||
while (temp) {
|
while (temp) {
|
||||||
|
@ -592,10 +593,10 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
if (nbits > MAX_COEF_BITS+1)
|
if (nbits > MAX_COEF_BITS+1)
|
||||||
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
|
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
|
||||||
|
|
||||||
/* Count/emit the Huffman-coded symbol for the number of bits */
|
/* Count/emit the Huffman-coded symbol for the number of bits */
|
||||||
emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits);
|
emit_dc_symbol(entropy, tbl, nbits);
|
||||||
|
|
||||||
/* Emit that number of bits of the value, if positive, */
|
/* Emit that number of bits of the value, if positive, */
|
||||||
/* or the complement of its magnitude, if negative. */
|
/* or the complement of its magnitude, if negative. */
|
||||||
if (nbits) /* emit_bits rejects calls with size 0 */
|
if (nbits) /* emit_bits rejects calls with size 0 */
|
||||||
|
@ -628,12 +629,12 @@ METHODDEF(boolean)
|
||||||
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
|
const int * natural_order;
|
||||||
|
JBLOCKROW block;
|
||||||
register int temp, temp2;
|
register int temp, temp2;
|
||||||
register int nbits;
|
register int nbits;
|
||||||
register int r, k;
|
register int r, k;
|
||||||
int Se, Al;
|
int Se, Al;
|
||||||
const int * natural_order;
|
|
||||||
JBLOCKROW block;
|
|
||||||
|
|
||||||
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
||||||
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
|
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
|
||||||
|
@ -731,18 +732,15 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCU encoding for DC successive approximation refinement scan.
|
* MCU encoding for DC successive approximation refinement scan.
|
||||||
* Note: we assume such scans can be multi-component, although the spec
|
* Note: we assume such scans can be multi-component,
|
||||||
* is not very clear on the point.
|
* although the spec is not very clear on the point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int temp;
|
int Al, blkn;
|
||||||
int blkn;
|
|
||||||
int Al = cinfo->Al;
|
|
||||||
JBLOCKROW block;
|
|
||||||
|
|
||||||
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
||||||
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
|
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
|
||||||
|
@ -752,13 +750,12 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
if (entropy->restarts_to_go == 0)
|
if (entropy->restarts_to_go == 0)
|
||||||
emit_restart_e(entropy, entropy->next_restart_num);
|
emit_restart_e(entropy, entropy->next_restart_num);
|
||||||
|
|
||||||
|
Al = cinfo->Al;
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
/* Encode the MCU data blocks */
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
block = MCU_data[blkn];
|
|
||||||
|
|
||||||
/* We simply emit the Al'th bit of the DC coefficient value. */
|
/* We simply emit the Al'th bit of the DC coefficient value. */
|
||||||
temp = (*block)[0];
|
emit_bits_e(entropy, (unsigned int) (MCU_data[blkn][0][0] >> Al), 1);
|
||||||
emit_bits_e(entropy, (unsigned int) (temp >> Al), 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cinfo->dest->next_output_byte = entropy->next_output_byte;
|
cinfo->dest->next_output_byte = entropy->next_output_byte;
|
||||||
|
@ -786,14 +783,14 @@ METHODDEF(boolean)
|
||||||
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
|
const int * natural_order;
|
||||||
|
JBLOCKROW block;
|
||||||
register int temp;
|
register int temp;
|
||||||
register int r, k;
|
register int r, k;
|
||||||
|
int Se, Al;
|
||||||
int EOB;
|
int EOB;
|
||||||
char *BR_buffer;
|
char *BR_buffer;
|
||||||
unsigned int BR;
|
unsigned int BR;
|
||||||
int Se, Al;
|
|
||||||
const int * natural_order;
|
|
||||||
JBLOCKROW block;
|
|
||||||
int absvalues[DCTSIZE2];
|
int absvalues[DCTSIZE2];
|
||||||
|
|
||||||
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
entropy->next_output_byte = cinfo->dest->next_output_byte;
|
||||||
|
@ -918,7 +915,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
|
||||||
{
|
{
|
||||||
register int temp, temp2;
|
register int temp, temp2;
|
||||||
register int nbits;
|
register int nbits;
|
||||||
register int k, r, i;
|
register int r, k;
|
||||||
int Se = state->cinfo->lim_Se;
|
int Se = state->cinfo->lim_Se;
|
||||||
const int * natural_order = state->cinfo->natural_order;
|
const int * natural_order = state->cinfo->natural_order;
|
||||||
|
|
||||||
|
@ -960,7 +957,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
|
||||||
r = 0; /* r = run length of zeros */
|
r = 0; /* r = run length of zeros */
|
||||||
|
|
||||||
for (k = 1; k <= Se; k++) {
|
for (k = 1; k <= Se; k++) {
|
||||||
if ((temp = block[natural_order[k]]) == 0) {
|
if ((temp2 = block[natural_order[k]]) == 0) {
|
||||||
r++;
|
r++;
|
||||||
} else {
|
} else {
|
||||||
/* if run length > 15, must emit special run-length-16 codes (0xF0) */
|
/* if run length > 15, must emit special run-length-16 codes (0xF0) */
|
||||||
|
@ -970,7 +967,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
|
||||||
r -= 16;
|
r -= 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
temp2 = temp;
|
temp = temp2;
|
||||||
if (temp < 0) {
|
if (temp < 0) {
|
||||||
temp = -temp; /* temp is abs value of input */
|
temp = -temp; /* temp is abs value of input */
|
||||||
/* This code assumes we are on a two's complement machine */
|
/* This code assumes we are on a two's complement machine */
|
||||||
|
@ -986,8 +983,8 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
|
||||||
ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
|
ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
|
||||||
|
|
||||||
/* Emit Huffman symbol for run length / number of bits */
|
/* Emit Huffman symbol for run length / number of bits */
|
||||||
i = (r << 4) + nbits;
|
temp = (r << 4) + nbits;
|
||||||
if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i]))
|
if (! emit_bits_s(state, actbl->ehufco[temp], actbl->ehufsi[temp]))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Emit that number of bits of the value, if positive, */
|
/* Emit that number of bits of the value, if positive, */
|
||||||
|
@ -1124,16 +1121,16 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
|
||||||
{
|
{
|
||||||
register int temp;
|
register int temp;
|
||||||
register int nbits;
|
register int nbits;
|
||||||
register int k, r;
|
register int r, k;
|
||||||
int Se = cinfo->lim_Se;
|
int Se = cinfo->lim_Se;
|
||||||
const int * natural_order = cinfo->natural_order;
|
const int * natural_order = cinfo->natural_order;
|
||||||
|
|
||||||
/* Encode the DC coefficient difference per section F.1.2.1 */
|
/* Encode the DC coefficient difference per section F.1.2.1 */
|
||||||
|
|
||||||
temp = block[0] - last_dc_val;
|
temp = block[0] - last_dc_val;
|
||||||
if (temp < 0)
|
if (temp < 0)
|
||||||
temp = -temp;
|
temp = -temp;
|
||||||
|
|
||||||
/* Find the number of bits needed for the magnitude of the coefficient */
|
/* Find the number of bits needed for the magnitude of the coefficient */
|
||||||
nbits = 0;
|
nbits = 0;
|
||||||
while (temp) {
|
while (temp) {
|
||||||
|
@ -1148,11 +1145,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
|
||||||
|
|
||||||
/* Count the Huffman symbol for the number of bits */
|
/* Count the Huffman symbol for the number of bits */
|
||||||
dc_counts[nbits]++;
|
dc_counts[nbits]++;
|
||||||
|
|
||||||
/* Encode the AC coefficients per section F.1.2.2 */
|
/* Encode the AC coefficients per section F.1.2.2 */
|
||||||
|
|
||||||
r = 0; /* r = run length of zeros */
|
r = 0; /* r = run length of zeros */
|
||||||
|
|
||||||
for (k = 1; k <= Se; k++) {
|
for (k = 1; k <= Se; k++) {
|
||||||
if ((temp = block[natural_order[k]]) == 0) {
|
if ((temp = block[natural_order[k]]) == 0) {
|
||||||
r++;
|
r++;
|
||||||
|
@ -1162,11 +1159,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
|
||||||
ac_counts[0xF0]++;
|
ac_counts[0xF0]++;
|
||||||
r -= 16;
|
r -= 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the number of bits needed for the magnitude of the coefficient */
|
/* Find the number of bits needed for the magnitude of the coefficient */
|
||||||
if (temp < 0)
|
if (temp < 0)
|
||||||
temp = -temp;
|
temp = -temp;
|
||||||
|
|
||||||
/* Find the number of bits needed for the magnitude of the coefficient */
|
/* Find the number of bits needed for the magnitude of the coefficient */
|
||||||
nbits = 1; /* there must be at least one 1 bit */
|
nbits = 1; /* there must be at least one 1 bit */
|
||||||
while ((temp >>= 1))
|
while ((temp >>= 1))
|
||||||
|
@ -1174,10 +1171,10 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
|
||||||
/* Check for out-of-range coefficient values */
|
/* Check for out-of-range coefficient values */
|
||||||
if (nbits > MAX_COEF_BITS)
|
if (nbits > MAX_COEF_BITS)
|
||||||
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
|
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
|
||||||
|
|
||||||
/* Count Huffman symbol for run length / number of bits */
|
/* Count Huffman symbol for run length / number of bits */
|
||||||
ac_counts[(r << 4) + nbits]++;
|
ac_counts[(r << 4) + nbits]++;
|
||||||
|
|
||||||
r = 0;
|
r = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1562,7 +1559,7 @@ jinit_huff_encoder (j_compress_ptr cinfo)
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(huff_entropy_encoder));
|
SIZEOF(huff_entropy_encoder));
|
||||||
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff;
|
entropy->pub.start_pass = start_pass_huff;
|
||||||
|
|
||||||
/* Mark tables unallocated */
|
/* Mark tables unallocated */
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcinit.c
|
* jcinit.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -29,6 +30,24 @@
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jinit_compress_master (j_compress_ptr cinfo)
|
jinit_compress_master (j_compress_ptr cinfo)
|
||||||
{
|
{
|
||||||
|
long samplesperrow;
|
||||||
|
JDIMENSION jd_samplesperrow;
|
||||||
|
|
||||||
|
/* For now, precision must match compiled-in value... */
|
||||||
|
if (cinfo->data_precision != BITS_IN_JSAMPLE)
|
||||||
|
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
||||||
|
|
||||||
|
/* Sanity check on image dimensions */
|
||||||
|
if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
|
||||||
|
cinfo->input_components <= 0)
|
||||||
|
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
||||||
|
|
||||||
|
/* Width of an input scanline must be representable as JDIMENSION. */
|
||||||
|
samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
|
||||||
|
jd_samplesperrow = (JDIMENSION) samplesperrow;
|
||||||
|
if ((long) jd_samplesperrow != samplesperrow)
|
||||||
|
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
||||||
|
|
||||||
/* Initialize master control (includes parameter checking/processing) */
|
/* Initialize master control (includes parameter checking/processing) */
|
||||||
jinit_c_master_control(cinfo, FALSE /* full compression */);
|
jinit_c_master_control(cinfo, FALSE /* full compression */);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcmainct.c
|
* jcmainct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2003-2012 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -68,32 +69,32 @@ METHODDEF(void) process_data_buffer_main
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
|
start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
/* Do nothing in raw-data mode. */
|
/* Do nothing in raw-data mode. */
|
||||||
if (cinfo->raw_data_in)
|
if (cinfo->raw_data_in)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
main->cur_iMCU_row = 0; /* initialize counters */
|
mainp->cur_iMCU_row = 0; /* initialize counters */
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
main->suspended = FALSE;
|
mainp->suspended = FALSE;
|
||||||
main->pass_mode = pass_mode; /* save mode for use by process_data */
|
mainp->pass_mode = pass_mode; /* save mode for use by process_data */
|
||||||
|
|
||||||
switch (pass_mode) {
|
switch (pass_mode) {
|
||||||
case JBUF_PASS_THRU:
|
case JBUF_PASS_THRU:
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
||||||
if (main->whole_image[0] != NULL)
|
if (mainp->whole_image[0] != NULL)
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
#endif
|
#endif
|
||||||
main->pub.process_data = process_data_simple_main;
|
mainp->pub.process_data = process_data_simple_main;
|
||||||
break;
|
break;
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
||||||
case JBUF_SAVE_SOURCE:
|
case JBUF_SAVE_SOURCE:
|
||||||
case JBUF_CRANK_DEST:
|
case JBUF_CRANK_DEST:
|
||||||
case JBUF_SAVE_AND_PASS:
|
case JBUF_SAVE_AND_PASS:
|
||||||
if (main->whole_image[0] == NULL)
|
if (mainp->whole_image[0] == NULL)
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
main->pub.process_data = process_data_buffer_main;
|
mainp->pub.process_data = process_data_buffer_main;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
@ -114,46 +115,46 @@ process_data_simple_main (j_compress_ptr cinfo,
|
||||||
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
||||||
JDIMENSION in_rows_avail)
|
JDIMENSION in_rows_avail)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
||||||
/* Read input data if we haven't filled the main buffer yet */
|
/* Read input data if we haven't filled the main buffer yet */
|
||||||
if (main->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
||||||
(*cinfo->prep->pre_process_data) (cinfo,
|
(*cinfo->prep->pre_process_data) (cinfo,
|
||||||
input_buf, in_row_ctr, in_rows_avail,
|
input_buf, in_row_ctr, in_rows_avail,
|
||||||
main->buffer, &main->rowgroup_ctr,
|
mainp->buffer, &mainp->rowgroup_ctr,
|
||||||
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
|
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
|
||||||
|
|
||||||
/* If we don't have a full iMCU row buffered, return to application for
|
/* If we don't have a full iMCU row buffered, return to application for
|
||||||
* more data. Note that preprocessor will always pad to fill the iMCU row
|
* more data. Note that preprocessor will always pad to fill the iMCU row
|
||||||
* at the bottom of the image.
|
* at the bottom of the image.
|
||||||
*/
|
*/
|
||||||
if (main->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
if (mainp->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Send the completed row to the compressor */
|
/* Send the completed row to the compressor */
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
|
if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
|
||||||
/* If compressor did not consume the whole row, then we must need to
|
/* If compressor did not consume the whole row, then we must need to
|
||||||
* suspend processing and return to the application. In this situation
|
* suspend processing and return to the application. In this situation
|
||||||
* we pretend we didn't yet consume the last input row; otherwise, if
|
* we pretend we didn't yet consume the last input row; otherwise, if
|
||||||
* it happened to be the last row of the image, the application would
|
* it happened to be the last row of the image, the application would
|
||||||
* think we were done.
|
* think we were done.
|
||||||
*/
|
*/
|
||||||
if (! main->suspended) {
|
if (! mainp->suspended) {
|
||||||
(*in_row_ctr)--;
|
(*in_row_ctr)--;
|
||||||
main->suspended = TRUE;
|
mainp->suspended = TRUE;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* We did finish the row. Undo our little suspension hack if a previous
|
/* We did finish the row. Undo our little suspension hack if a previous
|
||||||
* call suspended; then mark the main buffer empty.
|
* call suspended; then mark the main buffer empty.
|
||||||
*/
|
*/
|
||||||
if (main->suspended) {
|
if (mainp->suspended) {
|
||||||
(*in_row_ctr)++;
|
(*in_row_ctr)++;
|
||||||
main->suspended = FALSE;
|
mainp->suspended = FALSE;
|
||||||
}
|
}
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
main->cur_iMCU_row++;
|
mainp->cur_iMCU_row++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,25 +171,27 @@ process_data_buffer_main (j_compress_ptr cinfo,
|
||||||
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
||||||
JDIMENSION in_rows_avail)
|
JDIMENSION in_rows_avail)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
int ci;
|
int ci;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
|
boolean writing = (mainp->pass_mode != JBUF_CRANK_DEST);
|
||||||
|
|
||||||
while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
||||||
/* Realign the virtual buffers if at the start of an iMCU row. */
|
/* Realign the virtual buffers if at the start of an iMCU row. */
|
||||||
if (main->rowgroup_ctr == 0) {
|
if (mainp->rowgroup_ctr == 0) {
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
|
mainp->buffer[ci] = (*cinfo->mem->access_virt_sarray)
|
||||||
((j_common_ptr) cinfo, main->whole_image[ci],
|
((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row *
|
||||||
main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
|
((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)),
|
||||||
(JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
|
(JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size),
|
||||||
|
writing);
|
||||||
}
|
}
|
||||||
/* In a read pass, pretend we just read some source data. */
|
/* In a read pass, pretend we just read some source data. */
|
||||||
if (! writing) {
|
if (! writing) {
|
||||||
*in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
|
*in_row_ctr += (JDIMENSION)
|
||||||
main->rowgroup_ctr = DCTSIZE;
|
(cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size);
|
||||||
|
mainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,40 +200,40 @@ process_data_buffer_main (j_compress_ptr cinfo,
|
||||||
if (writing) {
|
if (writing) {
|
||||||
(*cinfo->prep->pre_process_data) (cinfo,
|
(*cinfo->prep->pre_process_data) (cinfo,
|
||||||
input_buf, in_row_ctr, in_rows_avail,
|
input_buf, in_row_ctr, in_rows_avail,
|
||||||
main->buffer, &main->rowgroup_ctr,
|
mainp->buffer, &mainp->rowgroup_ctr,
|
||||||
(JDIMENSION) DCTSIZE);
|
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
|
||||||
/* Return to application if we need more data to fill the iMCU row. */
|
/* Return to application if we need more data to fill the iMCU row. */
|
||||||
if (main->rowgroup_ctr < DCTSIZE)
|
if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emit data, unless this is a sink-only pass. */
|
/* Emit data, unless this is a sink-only pass. */
|
||||||
if (main->pass_mode != JBUF_SAVE_SOURCE) {
|
if (mainp->pass_mode != JBUF_SAVE_SOURCE) {
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
|
if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
|
||||||
/* If compressor did not consume the whole row, then we must need to
|
/* If compressor did not consume the whole row, then we must need to
|
||||||
* suspend processing and return to the application. In this situation
|
* suspend processing and return to the application. In this situation
|
||||||
* we pretend we didn't yet consume the last input row; otherwise, if
|
* we pretend we didn't yet consume the last input row; otherwise, if
|
||||||
* it happened to be the last row of the image, the application would
|
* it happened to be the last row of the image, the application would
|
||||||
* think we were done.
|
* think we were done.
|
||||||
*/
|
*/
|
||||||
if (! main->suspended) {
|
if (! mainp->suspended) {
|
||||||
(*in_row_ctr)--;
|
(*in_row_ctr)--;
|
||||||
main->suspended = TRUE;
|
mainp->suspended = TRUE;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* We did finish the row. Undo our little suspension hack if a previous
|
/* We did finish the row. Undo our little suspension hack if a previous
|
||||||
* call suspended; then mark the main buffer empty.
|
* call suspended; then mark the main buffer empty.
|
||||||
*/
|
*/
|
||||||
if (main->suspended) {
|
if (mainp->suspended) {
|
||||||
(*in_row_ctr)++;
|
(*in_row_ctr)++;
|
||||||
main->suspended = FALSE;
|
mainp->suspended = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If get here, we are done with this iMCU row. Mark buffer empty. */
|
/* If get here, we are done with this iMCU row. Mark buffer empty. */
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
main->cur_iMCU_row++;
|
mainp->cur_iMCU_row++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,15 +247,15 @@ process_data_buffer_main (j_compress_ptr cinfo,
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
{
|
{
|
||||||
my_main_ptr main;
|
my_main_ptr mainp;
|
||||||
int ci;
|
int ci;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
main = (my_main_ptr)
|
mainp = (my_main_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_main_controller));
|
SIZEOF(my_main_controller));
|
||||||
cinfo->main = (struct jpeg_c_main_controller *) main;
|
cinfo->main = &mainp->pub;
|
||||||
main->pub.start_pass = start_pass_main;
|
mainp->pub.start_pass = start_pass_main;
|
||||||
|
|
||||||
/* We don't need to create a buffer in raw-data mode. */
|
/* We don't need to create a buffer in raw-data mode. */
|
||||||
if (cinfo->raw_data_in)
|
if (cinfo->raw_data_in)
|
||||||
|
@ -267,11 +270,12 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
/* Note we pad the bottom to a multiple of the iMCU height */
|
/* Note we pad the bottom to a multiple of the iMCU height */
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
|
mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
|
||||||
compptr->width_in_blocks * compptr->DCT_h_scaled_size,
|
compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
|
||||||
(JDIMENSION) jround_up((long) compptr->height_in_blocks,
|
((JDIMENSION) jround_up((long) compptr->height_in_blocks,
|
||||||
(long) compptr->v_samp_factor) * DCTSIZE,
|
(long) compptr->v_samp_factor)) *
|
||||||
|
((JDIMENSION) cinfo->min_DCT_v_scaled_size),
|
||||||
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -279,14 +283,14 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
||||||
main->whole_image[0] = NULL; /* flag for no virtual arrays */
|
mainp->whole_image[0] = NULL; /* flag for no virtual arrays */
|
||||||
#endif
|
#endif
|
||||||
/* Allocate a strip buffer for each component */
|
/* Allocate a strip buffer for each component */
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
main->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
compptr->width_in_blocks * compptr->DCT_h_scaled_size,
|
compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
|
||||||
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcmarker.c
|
* jcmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2010 by Guido Vollbeding.
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -19,24 +19,24 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_SOF1 = 0xc1,
|
M_SOF1 = 0xc1,
|
||||||
M_SOF2 = 0xc2,
|
M_SOF2 = 0xc2,
|
||||||
M_SOF3 = 0xc3,
|
M_SOF3 = 0xc3,
|
||||||
|
|
||||||
M_SOF5 = 0xc5,
|
M_SOF5 = 0xc5,
|
||||||
M_SOF6 = 0xc6,
|
M_SOF6 = 0xc6,
|
||||||
M_SOF7 = 0xc7,
|
M_SOF7 = 0xc7,
|
||||||
|
|
||||||
M_JPG = 0xc8,
|
M_JPG = 0xc8,
|
||||||
M_SOF9 = 0xc9,
|
M_SOF9 = 0xc9,
|
||||||
M_SOF10 = 0xca,
|
M_SOF10 = 0xca,
|
||||||
M_SOF11 = 0xcb,
|
M_SOF11 = 0xcb,
|
||||||
|
|
||||||
M_SOF13 = 0xcd,
|
M_SOF13 = 0xcd,
|
||||||
M_SOF14 = 0xce,
|
M_SOF14 = 0xce,
|
||||||
M_SOF15 = 0xcf,
|
M_SOF15 = 0xcf,
|
||||||
|
|
||||||
M_DHT = 0xc4,
|
M_DHT = 0xc4,
|
||||||
|
|
||||||
M_DAC = 0xcc,
|
M_DAC = 0xcc,
|
||||||
|
|
||||||
M_RST0 = 0xd0,
|
M_RST0 = 0xd0,
|
||||||
M_RST1 = 0xd1,
|
M_RST1 = 0xd1,
|
||||||
M_RST2 = 0xd2,
|
M_RST2 = 0xd2,
|
||||||
|
@ -45,7 +45,7 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_RST5 = 0xd5,
|
M_RST5 = 0xd5,
|
||||||
M_RST6 = 0xd6,
|
M_RST6 = 0xd6,
|
||||||
M_RST7 = 0xd7,
|
M_RST7 = 0xd7,
|
||||||
|
|
||||||
M_SOI = 0xd8,
|
M_SOI = 0xd8,
|
||||||
M_EOI = 0xd9,
|
M_EOI = 0xd9,
|
||||||
M_SOS = 0xda,
|
M_SOS = 0xda,
|
||||||
|
@ -54,7 +54,7 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_DRI = 0xdd,
|
M_DRI = 0xdd,
|
||||||
M_DHP = 0xde,
|
M_DHP = 0xde,
|
||||||
M_EXP = 0xdf,
|
M_EXP = 0xdf,
|
||||||
|
|
||||||
M_APP0 = 0xe0,
|
M_APP0 = 0xe0,
|
||||||
M_APP1 = 0xe1,
|
M_APP1 = 0xe1,
|
||||||
M_APP2 = 0xe2,
|
M_APP2 = 0xe2,
|
||||||
|
@ -71,13 +71,14 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_APP13 = 0xed,
|
M_APP13 = 0xed,
|
||||||
M_APP14 = 0xee,
|
M_APP14 = 0xee,
|
||||||
M_APP15 = 0xef,
|
M_APP15 = 0xef,
|
||||||
|
|
||||||
M_JPG0 = 0xf0,
|
M_JPG0 = 0xf0,
|
||||||
|
M_JPG8 = 0xf8,
|
||||||
M_JPG13 = 0xfd,
|
M_JPG13 = 0xfd,
|
||||||
M_COM = 0xfe,
|
M_COM = 0xfe,
|
||||||
|
|
||||||
M_TEM = 0x01,
|
M_TEM = 0x01,
|
||||||
|
|
||||||
M_ERROR = 0x100
|
M_ERROR = 0x100
|
||||||
} JPEG_MARKER;
|
} JPEG_MARKER;
|
||||||
|
|
||||||
|
@ -281,6 +282,37 @@ emit_dri (j_compress_ptr cinfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
emit_lse_ict (j_compress_ptr cinfo)
|
||||||
|
/* Emit an LSE inverse color transform specification marker */
|
||||||
|
{
|
||||||
|
/* Support only 1 transform */
|
||||||
|
if (cinfo->color_transform != JCT_SUBTRACT_GREEN ||
|
||||||
|
cinfo->num_components < 3)
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
|
||||||
|
emit_marker(cinfo, M_JPG8);
|
||||||
|
|
||||||
|
emit_2bytes(cinfo, 24); /* fixed length */
|
||||||
|
|
||||||
|
emit_byte(cinfo, 0x0D); /* ID inverse transform specification */
|
||||||
|
emit_2bytes(cinfo, MAXJSAMPLE); /* MAXTRANS */
|
||||||
|
emit_byte(cinfo, 3); /* Nt=3 */
|
||||||
|
emit_byte(cinfo, cinfo->comp_info[1].component_id);
|
||||||
|
emit_byte(cinfo, cinfo->comp_info[0].component_id);
|
||||||
|
emit_byte(cinfo, cinfo->comp_info[2].component_id);
|
||||||
|
emit_byte(cinfo, 0x80); /* F1: CENTER1=1, NORM1=0 */
|
||||||
|
emit_2bytes(cinfo, 0); /* A(1,1)=0 */
|
||||||
|
emit_2bytes(cinfo, 0); /* A(1,2)=0 */
|
||||||
|
emit_byte(cinfo, 0); /* F2: CENTER2=0, NORM2=0 */
|
||||||
|
emit_2bytes(cinfo, 1); /* A(2,1)=1 */
|
||||||
|
emit_2bytes(cinfo, 0); /* A(2,2)=0 */
|
||||||
|
emit_byte(cinfo, 0); /* F3: CENTER3=0, NORM3=0 */
|
||||||
|
emit_2bytes(cinfo, 1); /* A(3,1)=1 */
|
||||||
|
emit_2bytes(cinfo, 0); /* A(3,2)=0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
|
emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
|
||||||
/* Emit a SOF marker */
|
/* Emit a SOF marker */
|
||||||
|
@ -476,8 +508,8 @@ write_marker_byte (j_compress_ptr cinfo, int val)
|
||||||
* Write datastream header.
|
* Write datastream header.
|
||||||
* This consists of an SOI and optional APPn markers.
|
* This consists of an SOI and optional APPn markers.
|
||||||
* We recommend use of the JFIF marker, but not the Adobe marker,
|
* We recommend use of the JFIF marker, but not the Adobe marker,
|
||||||
* when using YCbCr or grayscale data. The JFIF marker should NOT
|
* when using YCbCr or grayscale data. The JFIF marker is also used
|
||||||
* be used for any other JPEG colorspace. The Adobe marker is helpful
|
* for other standard JPEG colorspaces. The Adobe marker is helpful
|
||||||
* to distinguish RGB, CMYK, and YCCK colorspaces.
|
* to distinguish RGB, CMYK, and YCCK colorspaces.
|
||||||
* Note that an application can write additional header markers after
|
* Note that an application can write additional header markers after
|
||||||
* jpeg_start_compress returns.
|
* jpeg_start_compress returns.
|
||||||
|
@ -502,7 +534,8 @@ write_file_header (j_compress_ptr cinfo)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write frame header.
|
* Write frame header.
|
||||||
* This consists of DQT and SOFn markers, and a conditional pseudo SOS marker.
|
* This consists of DQT and SOFn markers,
|
||||||
|
* a conditional LSE marker and a conditional pseudo SOS marker.
|
||||||
* Note that we do not emit the SOF until we have emitted the DQT(s).
|
* Note that we do not emit the SOF until we have emitted the DQT(s).
|
||||||
* This avoids compatibility problems with incorrect implementations that
|
* This avoids compatibility problems with incorrect implementations that
|
||||||
* try to error-check the quant table numbers as soon as they see the SOF.
|
* try to error-check the quant table numbers as soon as they see the SOF.
|
||||||
|
@ -560,6 +593,10 @@ write_frame_header (j_compress_ptr cinfo)
|
||||||
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
|
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check to emit LSE inverse color transform specification marker */
|
||||||
|
if (cinfo->color_transform)
|
||||||
|
emit_lse_ict(cinfo);
|
||||||
|
|
||||||
/* Check to emit pseudo SOS marker */
|
/* Check to emit pseudo SOS marker */
|
||||||
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
|
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
|
||||||
emit_pseudo_sos(cinfo);
|
emit_pseudo_sos(cinfo);
|
||||||
|
@ -668,7 +705,7 @@ jinit_marker_writer (j_compress_ptr cinfo)
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_marker_writer));
|
SIZEOF(my_marker_writer));
|
||||||
cinfo->marker = (struct jpeg_marker_writer *) marker;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize method pointers */
|
/* Initialize method pointers */
|
||||||
marker->pub.write_file_header = write_file_header;
|
marker->pub.write_file_header = write_file_header;
|
||||||
marker->pub.write_frame_header = write_frame_header;
|
marker->pub.write_frame_header = write_frame_header;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcmaster.c
|
* jcmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -222,8 +222,6 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
{
|
{
|
||||||
int ci, ssize;
|
int ci, ssize;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
long samplesperrow;
|
|
||||||
JDIMENSION jd_samplesperrow;
|
|
||||||
|
|
||||||
if (transcode_only)
|
if (transcode_only)
|
||||||
jpeg_calc_trans_dimensions(cinfo);
|
jpeg_calc_trans_dimensions(cinfo);
|
||||||
|
@ -251,7 +249,7 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
|
|
||||||
/* Sanity check on image dimensions */
|
/* Sanity check on image dimensions */
|
||||||
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
|
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
|
||||||
cinfo->num_components <= 0 || cinfo->input_components <= 0)
|
cinfo->num_components <= 0)
|
||||||
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
||||||
|
|
||||||
/* Make sure image isn't bigger than I can handle */
|
/* Make sure image isn't bigger than I can handle */
|
||||||
|
@ -259,14 +257,8 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
(long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)
|
(long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)
|
||||||
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
|
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
|
||||||
|
|
||||||
/* Width of an input scanline must be representable as JDIMENSION. */
|
/* Only 8 to 12 bits data precision are supported for DCT based JPEG */
|
||||||
samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
|
if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
|
||||||
jd_samplesperrow = (JDIMENSION) samplesperrow;
|
|
||||||
if ((long) jd_samplesperrow != samplesperrow)
|
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
|
||||||
|
|
||||||
/* For now, precision must match compiled-in value... */
|
|
||||||
if (cinfo->data_precision != BITS_IN_JSAMPLE)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
||||||
|
|
||||||
/* Check that number of components won't exceed internal array sizes */
|
/* Check that number of components won't exceed internal array sizes */
|
||||||
|
@ -339,8 +331,10 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
jdiv_round_up((long) cinfo->jpeg_height *
|
jdiv_round_up((long) cinfo->jpeg_height *
|
||||||
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
|
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
||||||
/* Mark component needed (this flag isn't actually used for compression) */
|
/* Don't need quantization scale after DCT,
|
||||||
compptr->component_needed = TRUE;
|
* until color conversion says otherwise.
|
||||||
|
*/
|
||||||
|
compptr->component_needed = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute number of fully interleaved MCU rows (number of times that
|
/* Compute number of fully interleaved MCU rows (number of times that
|
||||||
|
@ -811,7 +805,7 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_comp_master));
|
SIZEOF(my_comp_master));
|
||||||
cinfo->master = (struct jpeg_comp_master *) master;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_pass = prepare_for_pass;
|
master->pub.prepare_for_pass = prepare_for_pass;
|
||||||
master->pub.pass_startup = pass_startup;
|
master->pub.pass_startup = pass_startup;
|
||||||
master->pub.finish_pass = finish_pass_master;
|
master->pub.finish_pass = finish_pass_master;
|
||||||
|
@ -833,10 +827,14 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
|
||||||
cinfo->num_scans = 1;
|
cinfo->num_scans = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) &&
|
if (cinfo->optimize_coding)
|
||||||
!cinfo->arith_code) /* TEMPORARY HACK ??? */
|
cinfo->arith_code = FALSE; /* disable arithmetic coding */
|
||||||
/* assume default tables no good for progressive or downscale mode */
|
else if (! cinfo->arith_code &&
|
||||||
cinfo->optimize_coding = TRUE;
|
(cinfo->progressive_mode ||
|
||||||
|
(cinfo->block_size > 1 && cinfo->block_size < DCTSIZE)))
|
||||||
|
/* TEMPORARY HACK ??? */
|
||||||
|
/* assume default tables no good for progressive or reduced AC mode */
|
||||||
|
cinfo->optimize_coding = TRUE; /* force Huffman optimization */
|
||||||
|
|
||||||
/* Initialize my private state */
|
/* Initialize my private state */
|
||||||
if (transcode_only) {
|
if (transcode_only) {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcparam.c
|
* jcparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2008 by Guido Vollbeding.
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -150,7 +150,7 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
|
||||||
/* Set or change the 'quality' (quantization) setting, using default tables.
|
/* Set or change the 'quality' (quantization) setting, using default tables.
|
||||||
* This is the standard quality-adjusting entry point for typical user
|
* This is the standard quality-adjusting entry point for typical user
|
||||||
* interfaces; only those who want detailed control over quantization tables
|
* interfaces; only those who want detailed control over quantization tables
|
||||||
* would use the preceding three routines directly.
|
* would use the preceding routines directly.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
/* Convert user 0-100 rating to percentage scaling */
|
/* Convert user 0-100 rating to percentage scaling */
|
||||||
|
@ -323,18 +323,17 @@ jpeg_set_defaults (j_compress_ptr cinfo)
|
||||||
/* Expect normal source image, not raw downsampled data */
|
/* Expect normal source image, not raw downsampled data */
|
||||||
cinfo->raw_data_in = FALSE;
|
cinfo->raw_data_in = FALSE;
|
||||||
|
|
||||||
/* Use Huffman coding, not arithmetic coding, by default */
|
/* The standard Huffman tables are only valid for 8-bit data precision.
|
||||||
cinfo->arith_code = FALSE;
|
* If the precision is higher, use arithmetic coding.
|
||||||
|
* (Alternatively, using Huffman coding would be possible with forcing
|
||||||
|
* optimization on so that usable tables will be computed, or by
|
||||||
|
* supplying default tables that are valid for the desired precision.)
|
||||||
|
* Otherwise, use Huffman coding by default.
|
||||||
|
*/
|
||||||
|
cinfo->arith_code = cinfo->data_precision > 8 ? TRUE : FALSE;
|
||||||
|
|
||||||
/* By default, don't do extra passes to optimize entropy coding */
|
/* By default, don't do extra passes to optimize entropy coding */
|
||||||
cinfo->optimize_coding = FALSE;
|
cinfo->optimize_coding = FALSE;
|
||||||
/* The standard Huffman tables are only valid for 8-bit data precision.
|
|
||||||
* If the precision is higher, force optimization on so that usable
|
|
||||||
* tables will be computed. This test can be removed if default tables
|
|
||||||
* are supplied that are valid for the desired precision.
|
|
||||||
*/
|
|
||||||
if (cinfo->data_precision > 8)
|
|
||||||
cinfo->optimize_coding = TRUE;
|
|
||||||
|
|
||||||
/* By default, use the simpler non-cosited sampling alignment */
|
/* By default, use the simpler non-cosited sampling alignment */
|
||||||
cinfo->CCIR601_sampling = FALSE;
|
cinfo->CCIR601_sampling = FALSE;
|
||||||
|
@ -360,6 +359,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
|
||||||
* JFIF_minor_version to 2. We could probably get away with just defaulting
|
* JFIF_minor_version to 2. We could probably get away with just defaulting
|
||||||
* to 1.02, but there may still be some decoders in use that will complain
|
* to 1.02, but there may still be some decoders in use that will complain
|
||||||
* about that; saying 1.01 should minimize compatibility problems.
|
* about that; saying 1.01 should minimize compatibility problems.
|
||||||
|
*
|
||||||
|
* For wide gamut colorspaces (BG_RGB and BG_YCC), the major version will be
|
||||||
|
* overridden by jpeg_set_colorspace and set to 2.
|
||||||
*/
|
*/
|
||||||
cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
|
cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
|
||||||
cinfo->JFIF_minor_version = 1;
|
cinfo->JFIF_minor_version = 1;
|
||||||
|
@ -367,6 +369,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
|
||||||
cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
|
cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
|
||||||
cinfo->Y_density = 1;
|
cinfo->Y_density = 1;
|
||||||
|
|
||||||
|
/* No color transform */
|
||||||
|
cinfo->color_transform = JCT_NONE;
|
||||||
|
|
||||||
/* Choose JPEG colorspace based on input space, set defaults accordingly */
|
/* Choose JPEG colorspace based on input space, set defaults accordingly */
|
||||||
|
|
||||||
jpeg_default_colorspace(cinfo);
|
jpeg_default_colorspace(cinfo);
|
||||||
|
@ -381,6 +386,9 @@ GLOBAL(void)
|
||||||
jpeg_default_colorspace (j_compress_ptr cinfo)
|
jpeg_default_colorspace (j_compress_ptr cinfo)
|
||||||
{
|
{
|
||||||
switch (cinfo->in_color_space) {
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_UNKNOWN:
|
||||||
|
jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
|
||||||
|
break;
|
||||||
case JCS_GRAYSCALE:
|
case JCS_GRAYSCALE:
|
||||||
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
||||||
break;
|
break;
|
||||||
|
@ -396,8 +404,12 @@ jpeg_default_colorspace (j_compress_ptr cinfo)
|
||||||
case JCS_YCCK:
|
case JCS_YCCK:
|
||||||
jpeg_set_colorspace(cinfo, JCS_YCCK);
|
jpeg_set_colorspace(cinfo, JCS_YCCK);
|
||||||
break;
|
break;
|
||||||
case JCS_UNKNOWN:
|
case JCS_BG_RGB:
|
||||||
jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
|
/* No translation for now -- conversion to BG_YCC not yet supportet */
|
||||||
|
jpeg_set_colorspace(cinfo, JCS_BG_RGB);
|
||||||
|
break;
|
||||||
|
case JCS_BG_YCC:
|
||||||
|
jpeg_set_colorspace(cinfo, JCS_BG_YCC);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
|
@ -438,27 +450,40 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
|
||||||
cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
|
cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
|
||||||
|
|
||||||
switch (colorspace) {
|
switch (colorspace) {
|
||||||
|
case JCS_UNKNOWN:
|
||||||
|
cinfo->num_components = cinfo->input_components;
|
||||||
|
if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
|
||||||
|
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
|
||||||
|
MAX_COMPONENTS);
|
||||||
|
for (ci = 0; ci < cinfo->num_components; ci++) {
|
||||||
|
SET_COMP(ci, ci, 1,1, 0, 0,0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case JCS_GRAYSCALE:
|
case JCS_GRAYSCALE:
|
||||||
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
||||||
cinfo->num_components = 1;
|
cinfo->num_components = 1;
|
||||||
/* JFIF specifies component ID 1 */
|
/* JFIF specifies component ID 1 */
|
||||||
SET_COMP(0, 1, 1,1, 0, 0,0);
|
SET_COMP(0, 0x01, 1,1, 0, 0,0);
|
||||||
break;
|
break;
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
|
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
|
||||||
cinfo->num_components = 3;
|
cinfo->num_components = 3;
|
||||||
SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
|
SET_COMP(0, 0x52 /* 'R' */, 1,1, 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
|
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
|
||||||
SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
|
SET_COMP(2, 0x42 /* 'B' */, 1,1, 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
||||||
cinfo->num_components = 3;
|
cinfo->num_components = 3;
|
||||||
/* JFIF specifies component IDs 1,2,3 */
|
/* JFIF specifies component IDs 1,2,3 */
|
||||||
/* We default to 2x2 subsamples of chrominance */
|
/* We default to 2x2 subsamples of chrominance */
|
||||||
SET_COMP(0, 1, 2,2, 0, 0,0);
|
SET_COMP(0, 0x01, 2,2, 0, 0,0);
|
||||||
SET_COMP(1, 2, 1,1, 1, 1,1);
|
SET_COMP(1, 0x02, 1,1, 1, 1,1);
|
||||||
SET_COMP(2, 3, 1,1, 1, 1,1);
|
SET_COMP(2, 0x03, 1,1, 1, 1,1);
|
||||||
break;
|
break;
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
|
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
|
||||||
|
@ -471,19 +496,33 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
|
||||||
case JCS_YCCK:
|
case JCS_YCCK:
|
||||||
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
|
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
|
||||||
cinfo->num_components = 4;
|
cinfo->num_components = 4;
|
||||||
SET_COMP(0, 1, 2,2, 0, 0,0);
|
SET_COMP(0, 0x01, 2,2, 0, 0,0);
|
||||||
SET_COMP(1, 2, 1,1, 1, 1,1);
|
SET_COMP(1, 0x02, 1,1, 1, 1,1);
|
||||||
SET_COMP(2, 3, 1,1, 1, 1,1);
|
SET_COMP(2, 0x03, 1,1, 1, 1,1);
|
||||||
SET_COMP(3, 4, 2,2, 0, 0,0);
|
SET_COMP(3, 0x04, 2,2, 0, 0,0);
|
||||||
break;
|
break;
|
||||||
case JCS_UNKNOWN:
|
case JCS_BG_RGB:
|
||||||
cinfo->num_components = cinfo->input_components;
|
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
||||||
if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
|
cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
|
cinfo->num_components = 3;
|
||||||
MAX_COMPONENTS);
|
/* Add offset 0x20 to the normal R/G/B component IDs */
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++) {
|
SET_COMP(0, 0x72 /* 'r' */, 1,1, 0,
|
||||||
SET_COMP(ci, ci, 1,1, 0, 0,0);
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
}
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
|
SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0);
|
||||||
|
SET_COMP(2, 0x62 /* 'b' */, 1,1, 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
|
break;
|
||||||
|
case JCS_BG_YCC:
|
||||||
|
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
|
||||||
|
cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
|
||||||
|
cinfo->num_components = 3;
|
||||||
|
/* Add offset 0x20 to the normal Cb/Cr component IDs */
|
||||||
|
/* We default to 2x2 subsamples of chrominance */
|
||||||
|
SET_COMP(0, 0x01, 2,2, 0, 0,0);
|
||||||
|
SET_COMP(1, 0x22, 1,1, 1, 1,1);
|
||||||
|
SET_COMP(2, 0x23, 1,1, 1, 1,1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
|
@ -567,8 +606,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
||||||
|
|
||||||
/* Figure space needed for script. Calculation must match code below! */
|
/* Figure space needed for script. Calculation must match code below! */
|
||||||
if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
|
if (ncomps == 3 &&
|
||||||
/* Custom script for YCbCr color images. */
|
(cinfo->jpeg_color_space == JCS_YCbCr ||
|
||||||
|
cinfo->jpeg_color_space == JCS_BG_YCC)) {
|
||||||
|
/* Custom script for YCC color images. */
|
||||||
nscans = 10;
|
nscans = 10;
|
||||||
} else {
|
} else {
|
||||||
/* All-purpose script for other color spaces. */
|
/* All-purpose script for other color spaces. */
|
||||||
|
@ -583,7 +624,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
|
||||||
* multiple compressions without changing the settings. To avoid a memory
|
* multiple compressions without changing the settings. To avoid a memory
|
||||||
* leak if jpeg_simple_progression is called repeatedly for the same JPEG
|
* leak if jpeg_simple_progression is called repeatedly for the same JPEG
|
||||||
* object, we try to re-use previously allocated space, and we allocate
|
* object, we try to re-use previously allocated space, and we allocate
|
||||||
* enough space to handle YCbCr even if initially asked for grayscale.
|
* enough space to handle YCC even if initially asked for grayscale.
|
||||||
*/
|
*/
|
||||||
if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
|
if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
|
||||||
cinfo->script_space_size = MAX(nscans, 10);
|
cinfo->script_space_size = MAX(nscans, 10);
|
||||||
|
@ -595,8 +636,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
|
||||||
cinfo->scan_info = scanptr;
|
cinfo->scan_info = scanptr;
|
||||||
cinfo->num_scans = nscans;
|
cinfo->num_scans = nscans;
|
||||||
|
|
||||||
if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
|
if (ncomps == 3 &&
|
||||||
/* Custom script for YCbCr color images. */
|
(cinfo->jpeg_color_space == JCS_YCbCr ||
|
||||||
|
cinfo->jpeg_color_space == JCS_BG_YCC)) {
|
||||||
|
/* Custom script for YCC color images. */
|
||||||
/* Initial DC scan */
|
/* Initial DC scan */
|
||||||
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
|
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
|
||||||
/* Initial AC scan: get some luma data out in a hurry */
|
/* Initial AC scan: get some luma data out in a hurry */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jctrans.c
|
* jctrans.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1995-1998, Thomas G. Lane.
|
* Copyright (C) 1995-1998, Thomas G. Lane.
|
||||||
* Modified 2000-2011 by Guido Vollbeding.
|
* Modified 2000-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -85,7 +85,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
|
||||||
jpeg_set_defaults(dstinfo);
|
jpeg_set_defaults(dstinfo);
|
||||||
/* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
|
/* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
|
||||||
* Fix it to get the right header markers for the image colorspace.
|
* Fix it to get the right header markers for the image colorspace.
|
||||||
|
* Note: Entropy table assignment in jpeg_set_colorspace depends
|
||||||
|
* on color_transform.
|
||||||
*/
|
*/
|
||||||
|
dstinfo->color_transform = srcinfo->color_transform;
|
||||||
jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
|
jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
|
||||||
dstinfo->data_precision = srcinfo->data_precision;
|
dstinfo->data_precision = srcinfo->data_precision;
|
||||||
dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
|
dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
|
||||||
|
@ -130,7 +133,7 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
|
||||||
ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
|
ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Note: we do not copy the source's Huffman table assignments;
|
/* Note: we do not copy the source's entropy table assignments;
|
||||||
* instead we rely on jpeg_set_colorspace to have made a suitable choice.
|
* instead we rely on jpeg_set_colorspace to have made a suitable choice.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -140,10 +143,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
|
||||||
* if the application chooses to copy JFIF 1.02 extension markers from
|
* if the application chooses to copy JFIF 1.02 extension markers from
|
||||||
* the source file, we need to copy the version to make sure we don't
|
* the source file, we need to copy the version to make sure we don't
|
||||||
* emit a file that has 1.02 extensions but a claimed version of 1.01.
|
* emit a file that has 1.02 extensions but a claimed version of 1.01.
|
||||||
* We will *not*, however, copy version info from mislabeled "2.01" files.
|
|
||||||
*/
|
*/
|
||||||
if (srcinfo->saw_JFIF_marker) {
|
if (srcinfo->saw_JFIF_marker) {
|
||||||
if (srcinfo->JFIF_major_version == 1) {
|
if (srcinfo->JFIF_major_version == 1 ||
|
||||||
|
srcinfo->JFIF_major_version == 2) {
|
||||||
dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
|
dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
|
||||||
dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
|
dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
|
||||||
}
|
}
|
||||||
|
@ -364,7 +367,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
|
||||||
coef = (my_coef_ptr)
|
coef = (my_coef_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_coef_controller));
|
SIZEOF(my_coef_controller));
|
||||||
cinfo->coef = (struct jpeg_c_coef_controller *) coef;
|
cinfo->coef = &coef->pub;
|
||||||
coef->pub.start_pass = start_pass_coef;
|
coef->pub.start_pass = start_pass_coef;
|
||||||
coef->pub.compress_data = compress_output;
|
coef->pub.compress_data = compress_output;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdapimin.c
|
* jdapimin.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1998, Thomas G. Lane.
|
* Copyright (C) 1994-1998, Thomas G. Lane.
|
||||||
* Modified 2009 by Guido Vollbeding.
|
* Modified 2009-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -114,8 +114,9 @@ jpeg_abort_decompress (j_decompress_ptr cinfo)
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
default_decompress_parms (j_decompress_ptr cinfo)
|
default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
|
int cid0, cid1, cid2;
|
||||||
|
|
||||||
/* Guess the input colorspace, and set output colorspace accordingly. */
|
/* Guess the input colorspace, and set output colorspace accordingly. */
|
||||||
/* (Wish JPEG committee had provided a real way to specify this...) */
|
|
||||||
/* Note application may override our guesses. */
|
/* Note application may override our guesses. */
|
||||||
switch (cinfo->num_components) {
|
switch (cinfo->num_components) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -124,9 +125,22 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
if (cinfo->saw_JFIF_marker) {
|
cid0 = cinfo->comp_info[0].component_id;
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
|
cid1 = cinfo->comp_info[1].component_id;
|
||||||
} else if (cinfo->saw_Adobe_marker) {
|
cid2 = cinfo->comp_info[2].component_id;
|
||||||
|
|
||||||
|
/* First try to guess from the component IDs */
|
||||||
|
if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
|
||||||
|
cinfo->jpeg_color_space = JCS_YCbCr;
|
||||||
|
else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
|
||||||
|
cinfo->jpeg_color_space = JCS_BG_YCC;
|
||||||
|
else if (cid0 == 0x52 && cid1 == 0x47 && cid2 == 0x42)
|
||||||
|
cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
|
||||||
|
else if (cid0 == 0x72 && cid1 == 0x67 && cid2 == 0x62)
|
||||||
|
cinfo->jpeg_color_space = JCS_BG_RGB; /* ASCII 'r', 'g', 'b' */
|
||||||
|
else if (cinfo->saw_JFIF_marker)
|
||||||
|
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
||||||
|
else if (cinfo->saw_Adobe_marker) {
|
||||||
switch (cinfo->Adobe_transform) {
|
switch (cinfo->Adobe_transform) {
|
||||||
case 0:
|
case 0:
|
||||||
cinfo->jpeg_color_space = JCS_RGB;
|
cinfo->jpeg_color_space = JCS_RGB;
|
||||||
|
@ -136,23 +150,12 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Saw no special markers, try to guess from the component IDs */
|
TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
|
||||||
int cid0 = cinfo->comp_info[0].component_id;
|
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
||||||
int cid1 = cinfo->comp_info[1].component_id;
|
|
||||||
int cid2 = cinfo->comp_info[2].component_id;
|
|
||||||
|
|
||||||
if (cid0 == 1 && cid1 == 2 && cid2 == 3)
|
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
|
|
||||||
else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
|
|
||||||
cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
|
|
||||||
else {
|
|
||||||
TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
|
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* Always guess RGB is proper output colorspace. */
|
/* Always guess RGB is proper output colorspace. */
|
||||||
cinfo->out_color_space = JCS_RGB;
|
cinfo->out_color_space = JCS_RGB;
|
||||||
|
@ -169,7 +172,7 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
||||||
cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
|
cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jdapistd.c
|
* jdapistd.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* jdarith.c
|
* jdarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2011 by Guido Vollbeding.
|
* Developed 1997-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -345,12 +345,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
|
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
|
||||||
|
|
||||||
/* Figure F.20: Decode_AC_coefficients */
|
/* Figure F.20: Decode_AC_coefficients */
|
||||||
for (k = cinfo->Ss; k <= cinfo->Se; k++) {
|
k = cinfo->Ss - 1;
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
do {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
||||||
while (arith_decode(cinfo, st + 1) == 0) {
|
for (;;) {
|
||||||
st += 3; k++;
|
k++;
|
||||||
if (k > cinfo->Se) {
|
if (arith_decode(cinfo, st + 1)) break;
|
||||||
|
st += 3;
|
||||||
|
if (k >= cinfo->Se) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* spectral overflow */
|
entropy->ct = -1; /* spectral overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -384,7 +387,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
v += 1; if (sign) v = -v;
|
v += 1; if (sign) v = -v;
|
||||||
/* Scale and output coefficient in natural (dezigzagged) order */
|
/* Scale and output coefficient in natural (dezigzagged) order */
|
||||||
(*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
|
(*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
|
||||||
}
|
} while (k < cinfo->Se);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -392,6 +395,8 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCU decoding for DC successive approximation refinement scan.
|
* MCU decoding for DC successive approximation refinement scan.
|
||||||
|
* Note: we assume such scans can be multi-component,
|
||||||
|
* although the spec is not very clear on the point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
|
@ -457,15 +462,18 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
||||||
|
|
||||||
/* Establish EOBx (previous stage end-of-block) index */
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
for (kex = cinfo->Se; kex > 0; kex--)
|
kex = cinfo->Se;
|
||||||
|
do {
|
||||||
if ((*block)[natural_order[kex]]) break;
|
if ((*block)[natural_order[kex]]) break;
|
||||||
|
} while (--kex);
|
||||||
|
|
||||||
for (k = cinfo->Ss; k <= cinfo->Se; k++) {
|
k = cinfo->Ss - 1;
|
||||||
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
do {
|
||||||
if (k > kex)
|
st = entropy->ac_stats[tbl] + 3 * k;
|
||||||
|
if (k >= kex)
|
||||||
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
thiscoef = *block + natural_order[k];
|
thiscoef = *block + natural_order[++k];
|
||||||
if (*thiscoef) { /* previously nonzero coef */
|
if (*thiscoef) { /* previously nonzero coef */
|
||||||
if (arith_decode(cinfo, st + 2)) {
|
if (arith_decode(cinfo, st + 2)) {
|
||||||
if (*thiscoef < 0)
|
if (*thiscoef < 0)
|
||||||
|
@ -482,14 +490,14 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*thiscoef = p1;
|
*thiscoef = p1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
st += 3; k++;
|
st += 3;
|
||||||
if (k > cinfo->Se) {
|
if (k >= cinfo->Se) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* spectral overflow */
|
entropy->ct = -1; /* spectral overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} while (k < cinfo->Se);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -737,6 +745,17 @@ start_pass (j_decompress_ptr cinfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finish up at the end of an arithmetic-compressed scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
finish_pass (j_decompress_ptr cinfo)
|
||||||
|
{
|
||||||
|
/* no work necessary here */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Module initialization routine for arithmetic entropy decoding.
|
* Module initialization routine for arithmetic entropy decoding.
|
||||||
*/
|
*/
|
||||||
|
@ -750,8 +769,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(arith_entropy_decoder));
|
SIZEOF(arith_entropy_decoder));
|
||||||
cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
|
entropy->pub.finish_pass = finish_pass;
|
||||||
|
|
||||||
/* Mark tables unallocated */
|
/* Mark tables unallocated */
|
||||||
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
||||||
|
|
|
@ -226,6 +226,9 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
|
||||||
* larger memory, so the buffer is available to the application after
|
* larger memory, so the buffer is available to the application after
|
||||||
* finishing compression, and then the application is responsible for
|
* finishing compression, and then the application is responsible for
|
||||||
* freeing the requested memory.
|
* freeing the requested memory.
|
||||||
|
* Note: An initial buffer supplied by the caller is expected to be
|
||||||
|
* managed by the application. The library does not free such buffer
|
||||||
|
* when allocating a larger buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdcolor.c
|
* jdcolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011 by Guido Vollbeding.
|
* Modified 2011-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -19,12 +19,15 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct jpeg_color_deconverter pub; /* public fields */
|
struct jpeg_color_deconverter pub; /* public fields */
|
||||||
|
|
||||||
/* Private state for YCC->RGB conversion */
|
/* Private state for YCbCr->RGB and BG_YCC->RGB conversion */
|
||||||
int * Cr_r_tab; /* => table for Cr to R conversion */
|
int * Cr_r_tab; /* => table for Cr to R conversion */
|
||||||
int * Cb_b_tab; /* => table for Cb to B conversion */
|
int * Cb_b_tab; /* => table for Cb to B conversion */
|
||||||
INT32 * Cr_g_tab; /* => table for Cr to G conversion */
|
INT32 * Cr_g_tab; /* => table for Cr to G conversion */
|
||||||
INT32 * Cb_g_tab; /* => table for Cb to G conversion */
|
INT32 * Cb_g_tab; /* => table for Cb to G conversion */
|
||||||
|
|
||||||
|
JSAMPLE * range_limit; /* pointer to normal sample range limit table, */
|
||||||
|
/* or extended sample range limit table for BG_YCC */
|
||||||
|
|
||||||
/* Private state for RGB->Y conversion */
|
/* Private state for RGB->Y conversion */
|
||||||
INT32 * rgb_y_tab; /* => table for RGB to Y conversion */
|
INT32 * rgb_y_tab; /* => table for RGB to Y conversion */
|
||||||
} my_color_deconverter;
|
} my_color_deconverter;
|
||||||
|
@ -32,22 +35,44 @@ typedef struct {
|
||||||
typedef my_color_deconverter * my_cconvert_ptr;
|
typedef my_color_deconverter * my_cconvert_ptr;
|
||||||
|
|
||||||
|
|
||||||
/**************** YCbCr -> RGB conversion: most common case **************/
|
/*************** YCbCr -> RGB conversion: most common case **************/
|
||||||
/**************** RGB -> Y conversion: less common case **************/
|
/*************** BG_YCC -> RGB conversion: less common case **************/
|
||||||
|
/*************** RGB -> Y conversion: less common case **************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* YCbCr is defined per CCIR 601-1, except that Cb and Cr are
|
* YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
|
||||||
* normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
|
* previously known as Recommendation CCIR 601-1, except that Cb and Cr
|
||||||
* The conversion equations to be implemented are therefore
|
* are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
|
||||||
|
* sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
|
||||||
|
* sYCC (standard luma-chroma-chroma color space with extended gamut)
|
||||||
|
* is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
|
||||||
|
* bg-sRGB and bg-sYCC (big gamut standard color spaces)
|
||||||
|
* are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
|
||||||
|
* Note that the derived conversion coefficients given in some of these
|
||||||
|
* documents are imprecise. The general conversion equations are
|
||||||
*
|
*
|
||||||
* R = Y + 1.40200 * Cr
|
* R = Y + K * (1 - Kr) * Cr
|
||||||
* G = Y - 0.34414 * Cb - 0.71414 * Cr
|
* G = Y - K * (Kb * (1 - Kb) * Cb + Kr * (1 - Kr) * Cr) / (1 - Kr - Kb)
|
||||||
* B = Y + 1.77200 * Cb
|
* B = Y + K * (1 - Kb) * Cb
|
||||||
*
|
*
|
||||||
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
|
* Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
|
||||||
|
*
|
||||||
|
* With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
|
||||||
|
* from the 1953 FCC NTSC primaries and CIE Illuminant C), K = 2 for sYCC,
|
||||||
|
* the conversion equations to be implemented are therefore
|
||||||
|
*
|
||||||
|
* R = Y + 1.402 * Cr
|
||||||
|
* G = Y - 0.344136286 * Cb - 0.714136286 * Cr
|
||||||
|
* B = Y + 1.772 * Cb
|
||||||
|
*
|
||||||
|
* Y = 0.299 * R + 0.587 * G + 0.114 * B
|
||||||
*
|
*
|
||||||
* where Cb and Cr represent the incoming values less CENTERJSAMPLE.
|
* where Cb and Cr represent the incoming values less CENTERJSAMPLE.
|
||||||
* (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
|
* For bg-sYCC, with K = 4, the equations are
|
||||||
|
*
|
||||||
|
* R = Y + 2.804 * Cr
|
||||||
|
* G = Y - 0.688272572 * Cb - 1.428272572 * Cr
|
||||||
|
* B = Y + 3.544 * Cb
|
||||||
*
|
*
|
||||||
* To avoid floating-point arithmetic, we represent the fractional constants
|
* To avoid floating-point arithmetic, we represent the fractional constants
|
||||||
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
|
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
|
||||||
|
@ -58,9 +83,9 @@ typedef my_color_deconverter * my_cconvert_ptr;
|
||||||
* For even more speed, we avoid doing any multiplications in the inner loop
|
* For even more speed, we avoid doing any multiplications in the inner loop
|
||||||
* by precalculating the constants times Cb and Cr for all possible values.
|
* by precalculating the constants times Cb and Cr for all possible values.
|
||||||
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
|
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
|
||||||
* for 12-bit samples it is still acceptable. It's not very reasonable for
|
* for 9-bit to 12-bit samples it is still acceptable. It's not very
|
||||||
* 16-bit samples, but if you want lossless storage you shouldn't be changing
|
* reasonable for 16-bit samples, but if you want lossless storage you
|
||||||
* colorspace anyway.
|
* shouldn't be changing colorspace anyway.
|
||||||
* The Cr=>R and Cb=>B values can be rounded to integers in advance; the
|
* The Cr=>R and Cb=>B values can be rounded to integers in advance; the
|
||||||
* values for the G calculation are left scaled up, since we must add them
|
* values for the G calculation are left scaled up, since we must add them
|
||||||
* together before rounding.
|
* together before rounding.
|
||||||
|
@ -84,11 +109,12 @@ typedef my_color_deconverter * my_cconvert_ptr;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize tables for YCC->RGB colorspace conversion.
|
* Initialize tables for YCbCr->RGB and BG_YCC->RGB colorspace conversion.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
build_ycc_rgb_table (j_decompress_ptr cinfo)
|
build_ycc_rgb_table (j_decompress_ptr cinfo)
|
||||||
|
/* Normal case, sYCC */
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
int i;
|
int i;
|
||||||
|
@ -108,24 +134,84 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
|
|
||||||
|
cconvert->range_limit = cinfo->sample_range_limit;
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.40200 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
cconvert->Cr_r_tab[i] = (int)
|
cconvert->Cr_r_tab[i] = (int)
|
||||||
RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
|
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
||||||
/* Cb=>B value is nearest int to 1.77200 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
cconvert->Cb_b_tab[i] = (int)
|
cconvert->Cb_b_tab[i] = (int)
|
||||||
RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
|
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
||||||
/* Cr=>G value is scaled-up -0.71414 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
|
cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.34414 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
/* We also add in ONE_HALF so that need not do it in inner loop */
|
/* We also add in ONE_HALF so that need not do it in inner loop */
|
||||||
cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
|
cconvert->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
||||||
|
/* Wide gamut case, bg-sYCC */
|
||||||
|
{
|
||||||
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
|
int i;
|
||||||
|
INT32 x;
|
||||||
|
SHIFT_TEMPS
|
||||||
|
|
||||||
|
cconvert->Cr_r_tab = (int *)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
(MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
|
cconvert->Cb_b_tab = (int *)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
(MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
|
cconvert->Cr_g_tab = (INT32 *)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
|
cconvert->Cb_g_tab = (INT32 *)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
|
|
||||||
|
cconvert->range_limit = (JSAMPLE *)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
5 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
|
||||||
|
|
||||||
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
|
/* Cr=>R value is nearest int to 2.804 * x */
|
||||||
|
cconvert->Cr_r_tab[i] = (int)
|
||||||
|
RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
|
||||||
|
/* Cb=>B value is nearest int to 3.544 * x */
|
||||||
|
cconvert->Cb_b_tab[i] = (int)
|
||||||
|
RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
|
||||||
|
/* Cr=>G value is scaled-up -1.428272572 * x */
|
||||||
|
cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
||||||
|
/* Cb=>G value is scaled-up -0.688272572 * x */
|
||||||
|
/* We also add in ONE_HALF so that need not do it in inner loop */
|
||||||
|
cconvert->Cb_g_tab[i] = (- FIX(0.688272572)) * x + ONE_HALF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cb and Cr portions can extend to double range in wide gamut case,
|
||||||
|
* so we prepare an appropriate extended range limit table.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* First segment of range limit table: limit[x] = 0 for x < 0 */
|
||||||
|
MEMZERO(cconvert->range_limit, 2 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
|
||||||
|
cconvert->range_limit += 2 * (MAXJSAMPLE+1);
|
||||||
|
/* Main part of range limit table: limit[x] = x */
|
||||||
|
for (i = 0; i <= MAXJSAMPLE; i++)
|
||||||
|
cconvert->range_limit[i] = (JSAMPLE) i;
|
||||||
|
/* End of range limit table: limit[x] = MAXJSAMPLE for x > MAXJSAMPLE */
|
||||||
|
for (; i < 3 * (MAXJSAMPLE+1); i++)
|
||||||
|
cconvert->range_limit[i] = MAXJSAMPLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert some rows of samples to the output colorspace.
|
* Convert some rows of samples to the output colorspace.
|
||||||
*
|
*
|
||||||
|
@ -149,7 +235,7 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
/* copy these pointers into registers if possible */
|
/* copy these pointers into registers if possible */
|
||||||
register JSAMPLE * range_limit = cinfo->sample_range_limit;
|
register JSAMPLE * range_limit = cconvert->range_limit;
|
||||||
register int * Crrtab = cconvert->Cr_r_tab;
|
register int * Crrtab = cconvert->Cr_r_tab;
|
||||||
register int * Cbbtab = cconvert->Cb_b_tab;
|
register int * Cbbtab = cconvert->Cb_b_tab;
|
||||||
register INT32 * Crgtab = cconvert->Cr_g_tab;
|
register INT32 * Crgtab = cconvert->Cr_g_tab;
|
||||||
|
@ -166,19 +252,21 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
|
||||||
y = GETJSAMPLE(inptr0[col]);
|
y = GETJSAMPLE(inptr0[col]);
|
||||||
cb = GETJSAMPLE(inptr1[col]);
|
cb = GETJSAMPLE(inptr1[col]);
|
||||||
cr = GETJSAMPLE(inptr2[col]);
|
cr = GETJSAMPLE(inptr2[col]);
|
||||||
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
/* Range-limiting is essential due to noise introduced by DCT losses,
|
||||||
outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
|
* for extended gamut (sYCC) and wide gamut (bg-sYCC) encodings.
|
||||||
|
*/
|
||||||
|
outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
|
||||||
outptr[RGB_GREEN] = range_limit[y +
|
outptr[RGB_GREEN] = range_limit[y +
|
||||||
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
SCALEBITS))];
|
SCALEBITS))];
|
||||||
outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
|
outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
|
||||||
outptr += RGB_PIXELSIZE;
|
outptr += RGB_PIXELSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************** Cases other than YCbCr -> RGB **************/
|
/**************** Cases other than YCC -> RGB ****************/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -198,9 +286,9 @@ build_rgb_y_table (j_decompress_ptr cinfo)
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
(TABLE_SIZE * SIZEOF(INT32)));
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i;
|
rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i;
|
rgb_y_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
||||||
rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
|
rgb_y_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,8 +303,8 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register int r, g, b;
|
|
||||||
register INT32 * ctab = cconvert->rgb_y_tab;
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
|
register int r, g, b;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr0, inptr1, inptr2;
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
|
@ -241,6 +329,89 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
|
||||||
|
* (inverse color transform).
|
||||||
|
* This can be seen as an adaption of the general YCbCr->RGB
|
||||||
|
* conversion equation with Kr = Kb = 0, while replacing the
|
||||||
|
* normalization by modulo calculation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
rgb1_rgb_convert (j_decompress_ptr cinfo,
|
||||||
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
|
{
|
||||||
|
register int r, g, b;
|
||||||
|
register JSAMPROW outptr;
|
||||||
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
|
register JDIMENSION col;
|
||||||
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr0 = input_buf[0][input_row];
|
||||||
|
inptr1 = input_buf[1][input_row];
|
||||||
|
inptr2 = input_buf[2][input_row];
|
||||||
|
input_row++;
|
||||||
|
outptr = *output_buf++;
|
||||||
|
for (col = 0; col < num_cols; col++) {
|
||||||
|
r = GETJSAMPLE(inptr0[col]);
|
||||||
|
g = GETJSAMPLE(inptr1[col]);
|
||||||
|
b = GETJSAMPLE(inptr2[col]);
|
||||||
|
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
||||||
|
* (modulo) operator is equivalent to the bitmask operator AND.
|
||||||
|
*/
|
||||||
|
outptr[RGB_RED] = (JSAMPLE) ((r + g - CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
|
outptr[RGB_GREEN] = (JSAMPLE) g;
|
||||||
|
outptr[RGB_BLUE] = (JSAMPLE) ((b + g - CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
|
outptr += RGB_PIXELSIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [R-G,G,B-G] to grayscale conversion with modulo calculation
|
||||||
|
* (inverse color transform).
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
rgb1_gray_convert (j_decompress_ptr cinfo,
|
||||||
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
|
{
|
||||||
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
|
register int r, g, b;
|
||||||
|
register JSAMPROW outptr;
|
||||||
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
|
register JDIMENSION col;
|
||||||
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr0 = input_buf[0][input_row];
|
||||||
|
inptr1 = input_buf[1][input_row];
|
||||||
|
inptr2 = input_buf[2][input_row];
|
||||||
|
input_row++;
|
||||||
|
outptr = *output_buf++;
|
||||||
|
for (col = 0; col < num_cols; col++) {
|
||||||
|
r = GETJSAMPLE(inptr0[col]);
|
||||||
|
g = GETJSAMPLE(inptr1[col]);
|
||||||
|
b = GETJSAMPLE(inptr2[col]);
|
||||||
|
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
||||||
|
* (modulo) operator is equivalent to the bitmask operator AND.
|
||||||
|
*/
|
||||||
|
r = (r + g - CENTERJSAMPLE) & MAXJSAMPLE;
|
||||||
|
b = (b + g - CENTERJSAMPLE) & MAXJSAMPLE;
|
||||||
|
/* Y */
|
||||||
|
outptr[col] = (JSAMPLE)
|
||||||
|
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
||||||
|
>> SCALEBITS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No colorspace change, but conversion from separate-planes
|
* No colorspace change, but conversion from separate-planes
|
||||||
* to interleaved representation.
|
* to interleaved representation.
|
||||||
|
@ -283,19 +454,20 @@ null_convert (j_decompress_ptr cinfo,
|
||||||
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
register JSAMPROW inptr, outptr;
|
|
||||||
register JDIMENSION count;
|
|
||||||
register int num_components = cinfo->num_components;
|
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
|
||||||
int ci;
|
int ci;
|
||||||
|
register int nc = cinfo->num_components;
|
||||||
|
register JSAMPROW outptr;
|
||||||
|
register JSAMPROW inptr;
|
||||||
|
register JDIMENSION col;
|
||||||
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
for (ci = 0; ci < num_components; ci++) {
|
for (ci = 0; ci < nc; ci++) {
|
||||||
inptr = input_buf[ci][input_row];
|
inptr = input_buf[ci][input_row];
|
||||||
outptr = output_buf[0] + ci;
|
outptr = output_buf[0] + ci;
|
||||||
for (count = num_cols; count > 0; count--) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
|
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
|
||||||
outptr += num_components;
|
outptr += nc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_row++;
|
input_row++;
|
||||||
|
@ -306,7 +478,7 @@ null_convert (j_decompress_ptr cinfo,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Color conversion for grayscale: just copy the data.
|
* Color conversion for grayscale: just copy the data.
|
||||||
* This also works for YCbCr -> grayscale conversion, in which
|
* This also works for YCC -> grayscale conversion, in which
|
||||||
* we just copy the Y (luminance) component and ignore chrominance.
|
* we just copy the Y (luminance) component and ignore chrominance.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -331,7 +503,8 @@ gray_rgb_convert (j_decompress_ptr cinfo,
|
||||||
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW outptr;
|
||||||
|
register JSAMPROW inptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
|
||||||
|
@ -384,7 +557,9 @@ ycck_cmyk_convert (j_decompress_ptr cinfo,
|
||||||
y = GETJSAMPLE(inptr0[col]);
|
y = GETJSAMPLE(inptr0[col]);
|
||||||
cb = GETJSAMPLE(inptr1[col]);
|
cb = GETJSAMPLE(inptr1[col]);
|
||||||
cr = GETJSAMPLE(inptr2[col]);
|
cr = GETJSAMPLE(inptr2[col]);
|
||||||
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
/* Range-limiting is essential due to noise introduced by DCT losses,
|
||||||
|
* and for extended gamut encodings (sYCC).
|
||||||
|
*/
|
||||||
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
|
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
|
||||||
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
|
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
|
||||||
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
|
@ -422,7 +597,7 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_color_deconverter));
|
SIZEOF(my_color_deconverter));
|
||||||
cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
cconvert->pub.start_pass = start_pass_dcolor;
|
cconvert->pub.start_pass = start_pass_dcolor;
|
||||||
|
|
||||||
/* Make sure num_components agrees with jpeg_color_space */
|
/* Make sure num_components agrees with jpeg_color_space */
|
||||||
|
@ -434,6 +609,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
|
case JCS_BG_RGB:
|
||||||
|
case JCS_BG_YCC:
|
||||||
if (cinfo->num_components != 3)
|
if (cinfo->num_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
break;
|
break;
|
||||||
|
@ -450,6 +627,12 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Support color transform only for RGB colorspaces */
|
||||||
|
if (cinfo->color_transform &&
|
||||||
|
cinfo->jpeg_color_space != JCS_RGB &&
|
||||||
|
cinfo->jpeg_color_space != JCS_BG_RGB)
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
|
||||||
/* Set out_color_components and conversion method based on requested space.
|
/* Set out_color_components and conversion method based on requested space.
|
||||||
* Also clear the component_needed flags for any unused components,
|
* Also clear the component_needed flags for any unused components,
|
||||||
* so that earlier pipeline stages can avoid useless computation.
|
* so that earlier pipeline stages can avoid useless computation.
|
||||||
|
@ -458,41 +641,94 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
switch (cinfo->out_color_space) {
|
switch (cinfo->out_color_space) {
|
||||||
case JCS_GRAYSCALE:
|
case JCS_GRAYSCALE:
|
||||||
cinfo->out_color_components = 1;
|
cinfo->out_color_components = 1;
|
||||||
if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
|
switch (cinfo->jpeg_color_space) {
|
||||||
cinfo->jpeg_color_space == JCS_YCbCr) {
|
case JCS_GRAYSCALE:
|
||||||
|
case JCS_YCbCr:
|
||||||
|
case JCS_BG_YCC:
|
||||||
cconvert->pub.color_convert = grayscale_convert;
|
cconvert->pub.color_convert = grayscale_convert;
|
||||||
/* For color->grayscale conversion, only the Y (0) component is needed */
|
/* For color->grayscale conversion, only the Y (0) component is needed */
|
||||||
for (ci = 1; ci < cinfo->num_components; ci++)
|
for (ci = 1; ci < cinfo->num_components; ci++)
|
||||||
cinfo->comp_info[ci].component_needed = FALSE;
|
cinfo->comp_info[ci].component_needed = FALSE;
|
||||||
} else if (cinfo->jpeg_color_space == JCS_RGB) {
|
break;
|
||||||
cconvert->pub.color_convert = rgb_gray_convert;
|
case JCS_RGB:
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_gray_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb1_gray_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
build_rgb_y_table(cinfo);
|
build_rgb_y_table(cinfo);
|
||||||
} else
|
break;
|
||||||
|
default:
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
if (cinfo->jpeg_color_space == JCS_YCbCr) {
|
switch (cinfo->jpeg_color_space) {
|
||||||
|
case JCS_GRAYSCALE:
|
||||||
|
cconvert->pub.color_convert = gray_rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCS_YCbCr:
|
||||||
cconvert->pub.color_convert = ycc_rgb_convert;
|
cconvert->pub.color_convert = ycc_rgb_convert;
|
||||||
build_ycc_rgb_table(cinfo);
|
build_ycc_rgb_table(cinfo);
|
||||||
} else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
|
break;
|
||||||
cconvert->pub.color_convert = gray_rgb_convert;
|
case JCS_BG_YCC:
|
||||||
} else if (cinfo->jpeg_color_space == JCS_RGB) {
|
cconvert->pub.color_convert = ycc_rgb_convert;
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
build_bg_ycc_rgb_table(cinfo);
|
||||||
|
break;
|
||||||
|
case JCS_RGB:
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb1_rgb_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JCS_BG_RGB:
|
||||||
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
|
if (cinfo->jpeg_color_space == JCS_BG_RGB) {
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb1_rgb_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
cinfo->out_color_components = 4;
|
cinfo->out_color_components = 4;
|
||||||
if (cinfo->jpeg_color_space == JCS_YCCK) {
|
switch (cinfo->jpeg_color_space) {
|
||||||
|
case JCS_YCCK:
|
||||||
cconvert->pub.color_convert = ycck_cmyk_convert;
|
cconvert->pub.color_convert = ycck_cmyk_convert;
|
||||||
build_ycc_rgb_table(cinfo);
|
build_ycc_rgb_table(cinfo);
|
||||||
} else if (cinfo->jpeg_color_space == JCS_CMYK) {
|
break;
|
||||||
|
case JCS_CMYK:
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
} else
|
break;
|
||||||
|
default:
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jddctmgr.c
|
* jddctmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2002-2010 by Guido Vollbeding.
|
* Modified 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -368,7 +368,7 @@ jinit_inverse_dct (j_decompress_ptr cinfo)
|
||||||
idct = (my_idct_ptr)
|
idct = (my_idct_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_idct_controller));
|
SIZEOF(my_idct_controller));
|
||||||
cinfo->idct = (struct jpeg_inverse_dct *) idct;
|
cinfo->idct = &idct->pub;
|
||||||
idct->pub.start_pass = start_pass;
|
idct->pub.start_pass = start_pass;
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdhuff.c
|
* jdhuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2009 by Guido Vollbeding.
|
* Modified 2006-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -627,6 +627,22 @@ jpeg_huff_decode (bitread_working_state * state,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finish up at the end of a Huffman-compressed scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
finish_pass_huff (j_decompress_ptr cinfo)
|
||||||
|
{
|
||||||
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
|
|
||||||
|
/* Throw away any unused bits remaining in bit buffer; */
|
||||||
|
/* include any full bytes in next_marker's count of discarded bytes */
|
||||||
|
cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
|
||||||
|
entropy->bitstate.bits_left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for a restart marker & resynchronize decoder.
|
* Check for a restart marker & resynchronize decoder.
|
||||||
* Returns FALSE if must suspend.
|
* Returns FALSE if must suspend.
|
||||||
|
@ -638,10 +654,7 @@ process_restart (j_decompress_ptr cinfo)
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int ci;
|
int ci;
|
||||||
|
|
||||||
/* Throw away any unused bits remaining in bit buffer; */
|
finish_pass_huff(cinfo);
|
||||||
/* include any full bytes in next_marker's count of discarded bytes */
|
|
||||||
cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
|
|
||||||
entropy->bitstate.bits_left = 0;
|
|
||||||
|
|
||||||
/* Advance past the RSTn marker */
|
/* Advance past the RSTn marker */
|
||||||
if (! (*cinfo->marker->read_restart_marker) (cinfo))
|
if (! (*cinfo->marker->read_restart_marker) (cinfo))
|
||||||
|
@ -797,7 +810,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/* There is always only one block per MCU */
|
/* There is always only one block per MCU */
|
||||||
|
|
||||||
if (EOBRUN > 0) /* if it's a band of zeroes... */
|
if (EOBRUN) /* if it's a band of zeroes... */
|
||||||
EOBRUN--; /* ...process it now (we do nothing) */
|
EOBRUN--; /* ...process it now (we do nothing) */
|
||||||
else {
|
else {
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
||||||
|
@ -816,18 +829,17 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Scale and output coefficient in natural (dezigzagged) order */
|
/* Scale and output coefficient in natural (dezigzagged) order */
|
||||||
(*block)[natural_order[k]] = (JCOEF) (s << Al);
|
(*block)[natural_order[k]] = (JCOEF) (s << Al);
|
||||||
} else {
|
} else {
|
||||||
if (r == 15) { /* ZRL */
|
if (r != 15) { /* EOBr, run length is 2^r + appended bits */
|
||||||
k += 15; /* skip 15 zeroes in band */
|
|
||||||
} else { /* EOBr, run length is 2^r + appended bits */
|
|
||||||
EOBRUN = 1 << r;
|
|
||||||
if (r) { /* EOBr, r > 0 */
|
if (r) { /* EOBr, r > 0 */
|
||||||
|
EOBRUN = 1 << r;
|
||||||
CHECK_BIT_BUFFER(br_state, r, return FALSE);
|
CHECK_BIT_BUFFER(br_state, r, return FALSE);
|
||||||
r = GET_BITS(r);
|
r = GET_BITS(r);
|
||||||
EOBRUN += r;
|
EOBRUN += r;
|
||||||
|
EOBRUN--; /* this band is processed at this moment */
|
||||||
}
|
}
|
||||||
EOBRUN--; /* this band is processed at this moment */
|
|
||||||
break; /* force end-of-band */
|
break; /* force end-of-band */
|
||||||
}
|
}
|
||||||
|
k += 15; /* ZRL: skip 15 zeroes in band */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -847,17 +859,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCU decoding for DC successive approximation refinement scan.
|
* MCU decoding for DC successive approximation refinement scan.
|
||||||
* Note: we assume such scans can be multi-component, although the spec
|
* Note: we assume such scans can be multi-component,
|
||||||
* is not very clear on the point.
|
* although the spec is not very clear on the point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
int p1, blkn;
|
||||||
int blkn;
|
|
||||||
JBLOCKROW block;
|
|
||||||
BITREAD_STATE_VARS;
|
BITREAD_STATE_VARS;
|
||||||
|
|
||||||
/* Process restart marker if needed; may have to suspend */
|
/* Process restart marker if needed; may have to suspend */
|
||||||
|
@ -874,15 +884,15 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
||||||
|
|
||||||
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
block = MCU_data[blkn];
|
|
||||||
|
|
||||||
/* Encoded data is simply the next bit of the two's-complement DC value */
|
/* Encoded data is simply the next bit of the two's-complement DC value */
|
||||||
CHECK_BIT_BUFFER(br_state, 1, return FALSE);
|
CHECK_BIT_BUFFER(br_state, 1, return FALSE);
|
||||||
if (GET_BITS(1))
|
if (GET_BITS(1))
|
||||||
(*block)[0] |= p1;
|
MCU_data[blkn][0][0] |= p1;
|
||||||
/* Note: since we use |=, repeating the assignment later is safe */
|
/* Note: since we use |=, repeating the assignment later is safe */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -951,7 +961,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
k = cinfo->Ss;
|
k = cinfo->Ss;
|
||||||
|
|
||||||
if (EOBRUN == 0) {
|
if (EOBRUN == 0) {
|
||||||
for (; k <= Se; k++) {
|
do {
|
||||||
HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
|
HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
|
||||||
r = s >> 4;
|
r = s >> 4;
|
||||||
s &= 15;
|
s &= 15;
|
||||||
|
@ -981,7 +991,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
thiscoef = *block + natural_order[k];
|
thiscoef = *block + natural_order[k];
|
||||||
if (*thiscoef != 0) {
|
if (*thiscoef) {
|
||||||
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
|
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
|
||||||
if (GET_BITS(1)) {
|
if (GET_BITS(1)) {
|
||||||
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
|
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
|
||||||
|
@ -1004,18 +1014,19 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
/* Remember its position in case we have to suspend */
|
/* Remember its position in case we have to suspend */
|
||||||
newnz_pos[num_newnz++] = pos;
|
newnz_pos[num_newnz++] = pos;
|
||||||
}
|
}
|
||||||
}
|
k++;
|
||||||
|
} while (k <= Se);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EOBRUN > 0) {
|
if (EOBRUN) {
|
||||||
/* Scan any remaining coefficient positions after the end-of-band
|
/* Scan any remaining coefficient positions after the end-of-band
|
||||||
* (the last newly nonzero coefficient, if any). Append a correction
|
* (the last newly nonzero coefficient, if any). Append a correction
|
||||||
* bit to each already-nonzero coefficient. A correction bit is 1
|
* bit to each already-nonzero coefficient. A correction bit is 1
|
||||||
* if the absolute value of the coefficient must be increased.
|
* if the absolute value of the coefficient must be increased.
|
||||||
*/
|
*/
|
||||||
for (; k <= Se; k++) {
|
do {
|
||||||
thiscoef = *block + natural_order[k];
|
thiscoef = *block + natural_order[k];
|
||||||
if (*thiscoef != 0) {
|
if (*thiscoef) {
|
||||||
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
|
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
|
||||||
if (GET_BITS(1)) {
|
if (GET_BITS(1)) {
|
||||||
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
|
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
|
||||||
|
@ -1026,7 +1037,8 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
k++;
|
||||||
|
} while (k <= Se);
|
||||||
/* Count one block completed in EOB run */
|
/* Count one block completed in EOB run */
|
||||||
EOBRUN--;
|
EOBRUN--;
|
||||||
}
|
}
|
||||||
|
@ -1043,7 +1055,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
|
||||||
undoit:
|
undoit:
|
||||||
/* Re-zero any output coefficients that we made newly nonzero */
|
/* Re-zero any output coefficients that we made newly nonzero */
|
||||||
while (num_newnz > 0)
|
while (num_newnz)
|
||||||
(*block)[newnz_pos[--num_newnz]] = 0;
|
(*block)[newnz_pos[--num_newnz]] = 0;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1514,8 +1526,9 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(huff_entropy_decoder));
|
SIZEOF(huff_entropy_decoder));
|
||||||
cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff_decoder;
|
entropy->pub.start_pass = start_pass_huff_decoder;
|
||||||
|
entropy->pub.finish_pass = finish_pass_huff;
|
||||||
|
|
||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdinput.c
|
* jdinput.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2009 by Guido Vollbeding.
|
* Modified 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -196,7 +196,7 @@ jpeg_core_output_dimensions (j_decompress_ptr cinfo)
|
||||||
/* Hardwire it to "no scaling" */
|
/* Hardwire it to "no scaling" */
|
||||||
cinfo->output_width = cinfo->image_width;
|
cinfo->output_width = cinfo->image_width;
|
||||||
cinfo->output_height = cinfo->image_height;
|
cinfo->output_height = cinfo->image_height;
|
||||||
/* jdinput.c has already initialized DCT_scaled_size,
|
/* initial_setup has already initialized DCT_scaled_size,
|
||||||
* and has computed unscaled downsampled_width and downsampled_height.
|
* and has computed unscaled downsampled_width and downsampled_height.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -216,8 +216,8 @@ initial_setup (j_decompress_ptr cinfo)
|
||||||
(long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
|
(long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
|
||||||
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
|
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
|
||||||
|
|
||||||
/* For now, precision must match compiled-in value... */
|
/* Only 8 to 12 bits data precision are supported for DCT based JPEG */
|
||||||
if (cinfo->data_precision != BITS_IN_JSAMPLE)
|
if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
|
||||||
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
||||||
|
|
||||||
/* Check that number of components won't exceed internal array sizes */
|
/* Check that number of components won't exceed internal array sizes */
|
||||||
|
@ -537,6 +537,7 @@ start_input_pass (j_decompress_ptr cinfo)
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
finish_input_pass (j_decompress_ptr cinfo)
|
finish_input_pass (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
|
(*cinfo->entropy->finish_pass) (cinfo);
|
||||||
cinfo->inputctl->consume_input = consume_markers;
|
cinfo->inputctl->consume_input = consume_markers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -646,7 +647,7 @@ jinit_input_controller (j_decompress_ptr cinfo)
|
||||||
inputctl = (my_inputctl_ptr)
|
inputctl = (my_inputctl_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
||||||
SIZEOF(my_input_controller));
|
SIZEOF(my_input_controller));
|
||||||
cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
|
cinfo->inputctl = &inputctl->pub;
|
||||||
/* Initialize method pointers */
|
/* Initialize method pointers */
|
||||||
inputctl->pub.consume_input = consume_markers;
|
inputctl->pub.consume_input = consume_markers;
|
||||||
inputctl->pub.reset_input_controller = reset_input_controller;
|
inputctl->pub.reset_input_controller = reset_input_controller;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jdmainct.c
|
* jdmainct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2002-2012 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -159,7 +160,7 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
|
||||||
* This is done only once, not once per pass.
|
* This is done only once, not once per pass.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
int ci, rgroup;
|
int ci, rgroup;
|
||||||
int M = cinfo->min_DCT_v_scaled_size;
|
int M = cinfo->min_DCT_v_scaled_size;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -168,10 +169,10 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
|
||||||
/* Get top-level space for component array pointers.
|
/* Get top-level space for component array pointers.
|
||||||
* We alloc both arrays with one call to save a few cycles.
|
* We alloc both arrays with one call to save a few cycles.
|
||||||
*/
|
*/
|
||||||
main->xbuffer[0] = (JSAMPIMAGE)
|
mainp->xbuffer[0] = (JSAMPIMAGE)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
|
cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
|
||||||
main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
|
mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components;
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
|
@ -184,9 +185,9 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
|
2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
|
||||||
xbuf += rgroup; /* want one row group at negative offsets */
|
xbuf += rgroup; /* want one row group at negative offsets */
|
||||||
main->xbuffer[0][ci] = xbuf;
|
mainp->xbuffer[0][ci] = xbuf;
|
||||||
xbuf += rgroup * (M + 4);
|
xbuf += rgroup * (M + 4);
|
||||||
main->xbuffer[1][ci] = xbuf;
|
mainp->xbuffer[1][ci] = xbuf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,7 +201,7 @@ make_funny_pointers (j_decompress_ptr cinfo)
|
||||||
* This will be repeated at the beginning of each pass.
|
* This will be repeated at the beginning of each pass.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
int ci, i, rgroup;
|
int ci, i, rgroup;
|
||||||
int M = cinfo->min_DCT_v_scaled_size;
|
int M = cinfo->min_DCT_v_scaled_size;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -210,10 +211,10 @@ make_funny_pointers (j_decompress_ptr cinfo)
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
xbuf0 = main->xbuffer[0][ci];
|
xbuf0 = mainp->xbuffer[0][ci];
|
||||||
xbuf1 = main->xbuffer[1][ci];
|
xbuf1 = mainp->xbuffer[1][ci];
|
||||||
/* First copy the workspace pointers as-is */
|
/* First copy the workspace pointers as-is */
|
||||||
buf = main->buffer[ci];
|
buf = mainp->buffer[ci];
|
||||||
for (i = 0; i < rgroup * (M + 2); i++) {
|
for (i = 0; i < rgroup * (M + 2); i++) {
|
||||||
xbuf0[i] = xbuf1[i] = buf[i];
|
xbuf0[i] = xbuf1[i] = buf[i];
|
||||||
}
|
}
|
||||||
|
@ -240,7 +241,7 @@ set_wraparound_pointers (j_decompress_ptr cinfo)
|
||||||
* This changes the pointer list state from top-of-image to the normal state.
|
* This changes the pointer list state from top-of-image to the normal state.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
int ci, i, rgroup;
|
int ci, i, rgroup;
|
||||||
int M = cinfo->min_DCT_v_scaled_size;
|
int M = cinfo->min_DCT_v_scaled_size;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -250,8 +251,8 @@ set_wraparound_pointers (j_decompress_ptr cinfo)
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
xbuf0 = main->xbuffer[0][ci];
|
xbuf0 = mainp->xbuffer[0][ci];
|
||||||
xbuf1 = main->xbuffer[1][ci];
|
xbuf1 = mainp->xbuffer[1][ci];
|
||||||
for (i = 0; i < rgroup; i++) {
|
for (i = 0; i < rgroup; i++) {
|
||||||
xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
|
xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
|
||||||
xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
|
xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
|
||||||
|
@ -269,7 +270,7 @@ set_bottom_pointers (j_decompress_ptr cinfo)
|
||||||
* Also sets rowgroups_avail to indicate number of nondummy row groups in row.
|
* Also sets rowgroups_avail to indicate number of nondummy row groups in row.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
int ci, i, rgroup, iMCUheight, rows_left;
|
int ci, i, rgroup, iMCUheight, rows_left;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
JSAMPARRAY xbuf;
|
JSAMPARRAY xbuf;
|
||||||
|
@ -286,12 +287,12 @@ set_bottom_pointers (j_decompress_ptr cinfo)
|
||||||
* so we need only do it once.
|
* so we need only do it once.
|
||||||
*/
|
*/
|
||||||
if (ci == 0) {
|
if (ci == 0) {
|
||||||
main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
|
mainp->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
|
||||||
}
|
}
|
||||||
/* Duplicate the last real sample row rgroup*2 times; this pads out the
|
/* Duplicate the last real sample row rgroup*2 times; this pads out the
|
||||||
* last partial rowgroup and ensures at least one full rowgroup of context.
|
* last partial rowgroup and ensures at least one full rowgroup of context.
|
||||||
*/
|
*/
|
||||||
xbuf = main->xbuffer[main->whichptr][ci];
|
xbuf = mainp->xbuffer[mainp->whichptr][ci];
|
||||||
for (i = 0; i < rgroup * 2; i++) {
|
for (i = 0; i < rgroup * 2; i++) {
|
||||||
xbuf[rows_left + i] = xbuf[rows_left-1];
|
xbuf[rows_left + i] = xbuf[rows_left-1];
|
||||||
}
|
}
|
||||||
|
@ -306,27 +307,27 @@ set_bottom_pointers (j_decompress_ptr cinfo)
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
|
start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
switch (pass_mode) {
|
switch (pass_mode) {
|
||||||
case JBUF_PASS_THRU:
|
case JBUF_PASS_THRU:
|
||||||
if (cinfo->upsample->need_context_rows) {
|
if (cinfo->upsample->need_context_rows) {
|
||||||
main->pub.process_data = process_data_context_main;
|
mainp->pub.process_data = process_data_context_main;
|
||||||
make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
|
make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
|
||||||
main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
|
mainp->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
|
||||||
main->context_state = CTX_PREPARE_FOR_IMCU;
|
mainp->context_state = CTX_PREPARE_FOR_IMCU;
|
||||||
main->iMCU_row_ctr = 0;
|
mainp->iMCU_row_ctr = 0;
|
||||||
} else {
|
} else {
|
||||||
/* Simple case with no context needed */
|
/* Simple case with no context needed */
|
||||||
main->pub.process_data = process_data_simple_main;
|
mainp->pub.process_data = process_data_simple_main;
|
||||||
}
|
}
|
||||||
main->buffer_full = FALSE; /* Mark buffer empty */
|
mainp->buffer_full = FALSE; /* Mark buffer empty */
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
break;
|
break;
|
||||||
#ifdef QUANT_2PASS_SUPPORTED
|
#ifdef QUANT_2PASS_SUPPORTED
|
||||||
case JBUF_CRANK_DEST:
|
case JBUF_CRANK_DEST:
|
||||||
/* For last pass of 2-pass quantization, just crank the postprocessor */
|
/* For last pass of 2-pass quantization, just crank the postprocessor */
|
||||||
main->pub.process_data = process_data_crank_post;
|
mainp->pub.process_data = process_data_crank_post;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
@ -346,14 +347,14 @@ process_data_simple_main (j_decompress_ptr cinfo,
|
||||||
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
||||||
JDIMENSION out_rows_avail)
|
JDIMENSION out_rows_avail)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
JDIMENSION rowgroups_avail;
|
JDIMENSION rowgroups_avail;
|
||||||
|
|
||||||
/* Read input data if we haven't filled the main buffer yet */
|
/* Read input data if we haven't filled the main buffer yet */
|
||||||
if (! main->buffer_full) {
|
if (! mainp->buffer_full) {
|
||||||
if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
|
if (! (*cinfo->coef->decompress_data) (cinfo, mainp->buffer))
|
||||||
return; /* suspension forced, can do nothing more */
|
return; /* suspension forced, can do nothing more */
|
||||||
main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
|
mainp->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There are always min_DCT_scaled_size row groups in an iMCU row. */
|
/* There are always min_DCT_scaled_size row groups in an iMCU row. */
|
||||||
|
@ -364,14 +365,14 @@ process_data_simple_main (j_decompress_ptr cinfo,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Feed the postprocessor */
|
/* Feed the postprocessor */
|
||||||
(*cinfo->post->post_process_data) (cinfo, main->buffer,
|
(*cinfo->post->post_process_data) (cinfo, mainp->buffer,
|
||||||
&main->rowgroup_ctr, rowgroups_avail,
|
&mainp->rowgroup_ctr, rowgroups_avail,
|
||||||
output_buf, out_row_ctr, out_rows_avail);
|
output_buf, out_row_ctr, out_rows_avail);
|
||||||
|
|
||||||
/* Has postprocessor consumed all the data yet? If so, mark buffer empty */
|
/* Has postprocessor consumed all the data yet? If so, mark buffer empty */
|
||||||
if (main->rowgroup_ctr >= rowgroups_avail) {
|
if (mainp->rowgroup_ctr >= rowgroups_avail) {
|
||||||
main->buffer_full = FALSE;
|
mainp->buffer_full = FALSE;
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,15 +387,15 @@ process_data_context_main (j_decompress_ptr cinfo,
|
||||||
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
||||||
JDIMENSION out_rows_avail)
|
JDIMENSION out_rows_avail)
|
||||||
{
|
{
|
||||||
my_main_ptr main = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
/* Read input data if we haven't filled the main buffer yet */
|
/* Read input data if we haven't filled the main buffer yet */
|
||||||
if (! main->buffer_full) {
|
if (! mainp->buffer_full) {
|
||||||
if (! (*cinfo->coef->decompress_data) (cinfo,
|
if (! (*cinfo->coef->decompress_data) (cinfo,
|
||||||
main->xbuffer[main->whichptr]))
|
mainp->xbuffer[mainp->whichptr]))
|
||||||
return; /* suspension forced, can do nothing more */
|
return; /* suspension forced, can do nothing more */
|
||||||
main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
|
mainp->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
|
||||||
main->iMCU_row_ctr++; /* count rows received */
|
mainp->iMCU_row_ctr++; /* count rows received */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Postprocessor typically will not swallow all the input data it is handed
|
/* Postprocessor typically will not swallow all the input data it is handed
|
||||||
|
@ -402,47 +403,47 @@ process_data_context_main (j_decompress_ptr cinfo,
|
||||||
* to exit and restart. This switch lets us keep track of how far we got.
|
* to exit and restart. This switch lets us keep track of how far we got.
|
||||||
* Note that each case falls through to the next on successful completion.
|
* Note that each case falls through to the next on successful completion.
|
||||||
*/
|
*/
|
||||||
switch (main->context_state) {
|
switch (mainp->context_state) {
|
||||||
case CTX_POSTPONED_ROW:
|
case CTX_POSTPONED_ROW:
|
||||||
/* Call postprocessor using previously set pointers for postponed row */
|
/* Call postprocessor using previously set pointers for postponed row */
|
||||||
(*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
|
(*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],
|
||||||
&main->rowgroup_ctr, main->rowgroups_avail,
|
&mainp->rowgroup_ctr, mainp->rowgroups_avail,
|
||||||
output_buf, out_row_ctr, out_rows_avail);
|
output_buf, out_row_ctr, out_rows_avail);
|
||||||
if (main->rowgroup_ctr < main->rowgroups_avail)
|
if (mainp->rowgroup_ctr < mainp->rowgroups_avail)
|
||||||
return; /* Need to suspend */
|
return; /* Need to suspend */
|
||||||
main->context_state = CTX_PREPARE_FOR_IMCU;
|
mainp->context_state = CTX_PREPARE_FOR_IMCU;
|
||||||
if (*out_row_ctr >= out_rows_avail)
|
if (*out_row_ctr >= out_rows_avail)
|
||||||
return; /* Postprocessor exactly filled output buf */
|
return; /* Postprocessor exactly filled output buf */
|
||||||
/*FALLTHROUGH*/
|
/*FALLTHROUGH*/
|
||||||
case CTX_PREPARE_FOR_IMCU:
|
case CTX_PREPARE_FOR_IMCU:
|
||||||
/* Prepare to process first M-1 row groups of this iMCU row */
|
/* Prepare to process first M-1 row groups of this iMCU row */
|
||||||
main->rowgroup_ctr = 0;
|
mainp->rowgroup_ctr = 0;
|
||||||
main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);
|
mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);
|
||||||
/* Check for bottom of image: if so, tweak pointers to "duplicate"
|
/* Check for bottom of image: if so, tweak pointers to "duplicate"
|
||||||
* the last sample row, and adjust rowgroups_avail to ignore padding rows.
|
* the last sample row, and adjust rowgroups_avail to ignore padding rows.
|
||||||
*/
|
*/
|
||||||
if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
|
if (mainp->iMCU_row_ctr == cinfo->total_iMCU_rows)
|
||||||
set_bottom_pointers(cinfo);
|
set_bottom_pointers(cinfo);
|
||||||
main->context_state = CTX_PROCESS_IMCU;
|
mainp->context_state = CTX_PROCESS_IMCU;
|
||||||
/*FALLTHROUGH*/
|
/*FALLTHROUGH*/
|
||||||
case CTX_PROCESS_IMCU:
|
case CTX_PROCESS_IMCU:
|
||||||
/* Call postprocessor using previously set pointers */
|
/* Call postprocessor using previously set pointers */
|
||||||
(*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
|
(*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],
|
||||||
&main->rowgroup_ctr, main->rowgroups_avail,
|
&mainp->rowgroup_ctr, mainp->rowgroups_avail,
|
||||||
output_buf, out_row_ctr, out_rows_avail);
|
output_buf, out_row_ctr, out_rows_avail);
|
||||||
if (main->rowgroup_ctr < main->rowgroups_avail)
|
if (mainp->rowgroup_ctr < mainp->rowgroups_avail)
|
||||||
return; /* Need to suspend */
|
return; /* Need to suspend */
|
||||||
/* After the first iMCU, change wraparound pointers to normal state */
|
/* After the first iMCU, change wraparound pointers to normal state */
|
||||||
if (main->iMCU_row_ctr == 1)
|
if (mainp->iMCU_row_ctr == 1)
|
||||||
set_wraparound_pointers(cinfo);
|
set_wraparound_pointers(cinfo);
|
||||||
/* Prepare to load new iMCU row using other xbuffer list */
|
/* Prepare to load new iMCU row using other xbuffer list */
|
||||||
main->whichptr ^= 1; /* 0=>1 or 1=>0 */
|
mainp->whichptr ^= 1; /* 0=>1 or 1=>0 */
|
||||||
main->buffer_full = FALSE;
|
mainp->buffer_full = FALSE;
|
||||||
/* Still need to process last row group of this iMCU row, */
|
/* Still need to process last row group of this iMCU row, */
|
||||||
/* which is saved at index M+1 of the other xbuffer */
|
/* which is saved at index M+1 of the other xbuffer */
|
||||||
main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);
|
mainp->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);
|
||||||
main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);
|
mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);
|
||||||
main->context_state = CTX_POSTPONED_ROW;
|
mainp->context_state = CTX_POSTPONED_ROW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,15 +476,15 @@ process_data_crank_post (j_decompress_ptr cinfo,
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
{
|
{
|
||||||
my_main_ptr main;
|
my_main_ptr mainp;
|
||||||
int ci, rgroup, ngroups;
|
int ci, rgroup, ngroups;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
main = (my_main_ptr)
|
mainp = (my_main_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_main_controller));
|
SIZEOF(my_main_controller));
|
||||||
cinfo->main = (struct jpeg_d_main_controller *) main;
|
cinfo->main = &mainp->pub;
|
||||||
main->pub.start_pass = start_pass_main;
|
mainp->pub.start_pass = start_pass_main;
|
||||||
|
|
||||||
if (need_full_buffer) /* shouldn't happen */
|
if (need_full_buffer) /* shouldn't happen */
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
|
@ -504,9 +505,9 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
main->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
compptr->width_in_blocks * compptr->DCT_h_scaled_size,
|
compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
|
||||||
(JDIMENSION) (rgroup * ngroups));
|
(JDIMENSION) (rgroup * ngroups));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdmarker.c
|
* jdmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2009 by Guido Vollbeding.
|
* Modified 2009-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -23,24 +23,24 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_SOF1 = 0xc1,
|
M_SOF1 = 0xc1,
|
||||||
M_SOF2 = 0xc2,
|
M_SOF2 = 0xc2,
|
||||||
M_SOF3 = 0xc3,
|
M_SOF3 = 0xc3,
|
||||||
|
|
||||||
M_SOF5 = 0xc5,
|
M_SOF5 = 0xc5,
|
||||||
M_SOF6 = 0xc6,
|
M_SOF6 = 0xc6,
|
||||||
M_SOF7 = 0xc7,
|
M_SOF7 = 0xc7,
|
||||||
|
|
||||||
M_JPG = 0xc8,
|
M_JPG = 0xc8,
|
||||||
M_SOF9 = 0xc9,
|
M_SOF9 = 0xc9,
|
||||||
M_SOF10 = 0xca,
|
M_SOF10 = 0xca,
|
||||||
M_SOF11 = 0xcb,
|
M_SOF11 = 0xcb,
|
||||||
|
|
||||||
M_SOF13 = 0xcd,
|
M_SOF13 = 0xcd,
|
||||||
M_SOF14 = 0xce,
|
M_SOF14 = 0xce,
|
||||||
M_SOF15 = 0xcf,
|
M_SOF15 = 0xcf,
|
||||||
|
|
||||||
M_DHT = 0xc4,
|
M_DHT = 0xc4,
|
||||||
|
|
||||||
M_DAC = 0xcc,
|
M_DAC = 0xcc,
|
||||||
|
|
||||||
M_RST0 = 0xd0,
|
M_RST0 = 0xd0,
|
||||||
M_RST1 = 0xd1,
|
M_RST1 = 0xd1,
|
||||||
M_RST2 = 0xd2,
|
M_RST2 = 0xd2,
|
||||||
|
@ -49,7 +49,7 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_RST5 = 0xd5,
|
M_RST5 = 0xd5,
|
||||||
M_RST6 = 0xd6,
|
M_RST6 = 0xd6,
|
||||||
M_RST7 = 0xd7,
|
M_RST7 = 0xd7,
|
||||||
|
|
||||||
M_SOI = 0xd8,
|
M_SOI = 0xd8,
|
||||||
M_EOI = 0xd9,
|
M_EOI = 0xd9,
|
||||||
M_SOS = 0xda,
|
M_SOS = 0xda,
|
||||||
|
@ -58,7 +58,7 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_DRI = 0xdd,
|
M_DRI = 0xdd,
|
||||||
M_DHP = 0xde,
|
M_DHP = 0xde,
|
||||||
M_EXP = 0xdf,
|
M_EXP = 0xdf,
|
||||||
|
|
||||||
M_APP0 = 0xe0,
|
M_APP0 = 0xe0,
|
||||||
M_APP1 = 0xe1,
|
M_APP1 = 0xe1,
|
||||||
M_APP2 = 0xe2,
|
M_APP2 = 0xe2,
|
||||||
|
@ -75,13 +75,14 @@ typedef enum { /* JPEG marker codes */
|
||||||
M_APP13 = 0xed,
|
M_APP13 = 0xed,
|
||||||
M_APP14 = 0xee,
|
M_APP14 = 0xee,
|
||||||
M_APP15 = 0xef,
|
M_APP15 = 0xef,
|
||||||
|
|
||||||
M_JPG0 = 0xf0,
|
M_JPG0 = 0xf0,
|
||||||
|
M_JPG8 = 0xf8,
|
||||||
M_JPG13 = 0xfd,
|
M_JPG13 = 0xfd,
|
||||||
M_COM = 0xfe,
|
M_COM = 0xfe,
|
||||||
|
|
||||||
M_TEM = 0x01,
|
M_TEM = 0x01,
|
||||||
|
|
||||||
M_ERROR = 0x100
|
M_ERROR = 0x100
|
||||||
} JPEG_MARKER;
|
} JPEG_MARKER;
|
||||||
|
|
||||||
|
@ -217,6 +218,7 @@ get_soi (j_decompress_ptr cinfo)
|
||||||
/* Set initial assumptions for colorspace etc */
|
/* Set initial assumptions for colorspace etc */
|
||||||
|
|
||||||
cinfo->jpeg_color_space = JCS_UNKNOWN;
|
cinfo->jpeg_color_space = JCS_UNKNOWN;
|
||||||
|
cinfo->color_transform = JCT_NONE;
|
||||||
cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
|
cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
|
||||||
|
|
||||||
cinfo->saw_JFIF_marker = FALSE;
|
cinfo->saw_JFIF_marker = FALSE;
|
||||||
|
@ -240,7 +242,7 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
|
||||||
/* Process a SOFn marker */
|
/* Process a SOFn marker */
|
||||||
{
|
{
|
||||||
INT32 length;
|
INT32 length;
|
||||||
int c, ci;
|
int c, ci, i;
|
||||||
jpeg_component_info * compptr;
|
jpeg_component_info * compptr;
|
||||||
INPUT_VARS(cinfo);
|
INPUT_VARS(cinfo);
|
||||||
|
|
||||||
|
@ -267,8 +269,8 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
|
||||||
/* We don't support files in which the image height is initially specified */
|
/* We don't support files in which the image height is initially specified */
|
||||||
/* as 0 and is later redefined by DNL. As long as we have to check that, */
|
/* as 0 and is later redefined by DNL. As long as we have to check that, */
|
||||||
/* might as well have a general sanity check. */
|
/* might as well have a general sanity check. */
|
||||||
if (cinfo->image_height <= 0 || cinfo->image_width <= 0
|
if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
|
||||||
|| cinfo->num_components <= 0)
|
cinfo->num_components <= 0)
|
||||||
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
||||||
|
|
||||||
if (length != (cinfo->num_components * 3))
|
if (length != (cinfo->num_components * 3))
|
||||||
|
@ -278,11 +280,27 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
|
||||||
cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
|
cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components * SIZEOF(jpeg_component_info));
|
cinfo->num_components * SIZEOF(jpeg_component_info));
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0; ci < cinfo->num_components; ci++) {
|
||||||
ci++, compptr++) {
|
INPUT_BYTE(cinfo, c, return FALSE);
|
||||||
|
/* Check to see whether component id has already been seen */
|
||||||
|
/* (in violation of the spec, but unfortunately seen in some */
|
||||||
|
/* files). If so, create "fake" component id equal to the */
|
||||||
|
/* max id seen so far + 1. */
|
||||||
|
for (i = 0, compptr = cinfo->comp_info; i < ci; i++, compptr++) {
|
||||||
|
if (c == compptr->component_id) {
|
||||||
|
compptr = cinfo->comp_info;
|
||||||
|
c = compptr->component_id;
|
||||||
|
compptr++;
|
||||||
|
for (i = 1; i < ci; i++, compptr++) {
|
||||||
|
if (compptr->component_id > c) c = compptr->component_id;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compptr->component_id = c;
|
||||||
compptr->component_index = ci;
|
compptr->component_index = ci;
|
||||||
INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
|
|
||||||
INPUT_BYTE(cinfo, c, return FALSE);
|
INPUT_BYTE(cinfo, c, return FALSE);
|
||||||
compptr->h_samp_factor = (c >> 4) & 15;
|
compptr->h_samp_factor = (c >> 4) & 15;
|
||||||
compptr->v_samp_factor = (c ) & 15;
|
compptr->v_samp_factor = (c ) & 15;
|
||||||
|
@ -305,12 +323,12 @@ get_sos (j_decompress_ptr cinfo)
|
||||||
/* Process a SOS marker */
|
/* Process a SOS marker */
|
||||||
{
|
{
|
||||||
INT32 length;
|
INT32 length;
|
||||||
int i, ci, n, c, cc;
|
int c, ci, i, n;
|
||||||
jpeg_component_info * compptr;
|
jpeg_component_info * compptr;
|
||||||
INPUT_VARS(cinfo);
|
INPUT_VARS(cinfo);
|
||||||
|
|
||||||
if (! cinfo->marker->saw_SOF)
|
if (! cinfo->marker->saw_SOF)
|
||||||
ERREXIT(cinfo, JERR_SOS_NO_SOF);
|
ERREXITS(cinfo, JERR_SOF_BEFORE, "SOS");
|
||||||
|
|
||||||
INPUT_2BYTES(cinfo, length, return FALSE);
|
INPUT_2BYTES(cinfo, length, return FALSE);
|
||||||
|
|
||||||
|
@ -328,24 +346,41 @@ get_sos (j_decompress_ptr cinfo)
|
||||||
/* Collect the component-spec parameters */
|
/* Collect the component-spec parameters */
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
INPUT_BYTE(cinfo, cc, return FALSE);
|
|
||||||
INPUT_BYTE(cinfo, c, return FALSE);
|
INPUT_BYTE(cinfo, c, return FALSE);
|
||||||
|
|
||||||
|
/* Detect the case where component id's are not unique, and, if so, */
|
||||||
|
/* create a fake component id using the same logic as in get_sof. */
|
||||||
|
/* Note: This also ensures that all of the SOF components are */
|
||||||
|
/* referenced in the single scan case, which prevents access to */
|
||||||
|
/* uninitialized memory in later decoding stages. */
|
||||||
|
for (ci = 0; ci < i; ci++) {
|
||||||
|
if (c == cinfo->cur_comp_info[ci]->component_id) {
|
||||||
|
c = cinfo->cur_comp_info[0]->component_id;
|
||||||
|
for (ci = 1; ci < i; ci++) {
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
if (compptr->component_id > c) c = compptr->component_id;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
if (cc == compptr->component_id)
|
if (c == compptr->component_id)
|
||||||
goto id_found;
|
goto id_found;
|
||||||
}
|
}
|
||||||
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
|
ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, c);
|
||||||
|
|
||||||
id_found:
|
id_found:
|
||||||
|
|
||||||
cinfo->cur_comp_info[i] = compptr;
|
cinfo->cur_comp_info[i] = compptr;
|
||||||
|
INPUT_BYTE(cinfo, c, return FALSE);
|
||||||
compptr->dc_tbl_no = (c >> 4) & 15;
|
compptr->dc_tbl_no = (c >> 4) & 15;
|
||||||
compptr->ac_tbl_no = (c ) & 15;
|
compptr->ac_tbl_no = (c ) & 15;
|
||||||
|
|
||||||
TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
|
TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, compptr->component_id,
|
||||||
compptr->dc_tbl_no, compptr->ac_tbl_no);
|
compptr->dc_tbl_no, compptr->ac_tbl_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,6 +496,8 @@ get_dht (j_decompress_ptr cinfo)
|
||||||
if (count > 256 || ((INT32) count) > length)
|
if (count > 256 || ((INT32) count) > length)
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
|
MEMZERO(huffval, SIZEOF(huffval)); /* pre-zero array for later copy */
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
||||||
|
|
||||||
|
@ -605,6 +642,68 @@ get_dri (j_decompress_ptr cinfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(boolean)
|
||||||
|
get_lse (j_decompress_ptr cinfo)
|
||||||
|
/* Process an LSE marker */
|
||||||
|
{
|
||||||
|
INT32 length;
|
||||||
|
unsigned int tmp;
|
||||||
|
int cid;
|
||||||
|
INPUT_VARS(cinfo);
|
||||||
|
|
||||||
|
if (! cinfo->marker->saw_SOF)
|
||||||
|
ERREXITS(cinfo, JERR_SOF_BEFORE, "LSE");
|
||||||
|
|
||||||
|
if (cinfo->num_components < 3) goto bad;
|
||||||
|
|
||||||
|
INPUT_2BYTES(cinfo, length, return FALSE);
|
||||||
|
|
||||||
|
if (length != 24)
|
||||||
|
ERREXIT(cinfo, JERR_BAD_LENGTH);
|
||||||
|
|
||||||
|
INPUT_BYTE(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0x0D) /* ID inverse transform specification */
|
||||||
|
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != MAXJSAMPLE) goto bad; /* MAXTRANS */
|
||||||
|
INPUT_BYTE(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 3) goto bad; /* Nt=3 */
|
||||||
|
INPUT_BYTE(cinfo, cid, return FALSE);
|
||||||
|
if (cid != cinfo->comp_info[1].component_id) goto bad;
|
||||||
|
INPUT_BYTE(cinfo, cid, return FALSE);
|
||||||
|
if (cid != cinfo->comp_info[0].component_id) goto bad;
|
||||||
|
INPUT_BYTE(cinfo, cid, return FALSE);
|
||||||
|
if (cid != cinfo->comp_info[2].component_id) goto bad;
|
||||||
|
INPUT_BYTE(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0x80) goto bad; /* F1: CENTER1=1, NORM1=0 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) goto bad; /* A(1,1)=0 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) goto bad; /* A(1,2)=0 */
|
||||||
|
INPUT_BYTE(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) goto bad; /* F2: CENTER2=0, NORM2=0 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 1) goto bad; /* A(2,1)=1 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) goto bad; /* A(2,2)=0 */
|
||||||
|
INPUT_BYTE(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) goto bad; /* F3: CENTER3=0, NORM3=0 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 1) goto bad; /* A(3,1)=1 */
|
||||||
|
INPUT_2BYTES(cinfo, tmp, return FALSE);
|
||||||
|
if (tmp != 0) { /* A(3,2)=0 */
|
||||||
|
bad:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* OK, valid transform that we can handle. */
|
||||||
|
cinfo->color_transform = JCT_SUBTRACT_GREEN;
|
||||||
|
|
||||||
|
INPUT_SYNC(cinfo);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines for processing APPn and COM markers.
|
* Routines for processing APPn and COM markers.
|
||||||
* These are either saved in memory or discarded, per application request.
|
* These are either saved in memory or discarded, per application request.
|
||||||
|
@ -641,12 +740,13 @@ examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
|
||||||
cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
|
cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
|
||||||
cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
|
cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
|
||||||
/* Check version.
|
/* Check version.
|
||||||
* Major version must be 1, anything else signals an incompatible change.
|
* Major version must be 1 or 2, anything else signals an incompatible
|
||||||
|
* change.
|
||||||
* (We used to treat this as an error, but now it's a nonfatal warning,
|
* (We used to treat this as an error, but now it's a nonfatal warning,
|
||||||
* because some bozo at Hijaak couldn't read the spec.)
|
* because some bozo at Hijaak couldn't read the spec.)
|
||||||
* Minor version should be 0..2, but process anyway if newer.
|
* Minor version should be 0..2, but process anyway if newer.
|
||||||
*/
|
*/
|
||||||
if (cinfo->JFIF_major_version != 1)
|
if (cinfo->JFIF_major_version != 1 && cinfo->JFIF_major_version != 2)
|
||||||
WARNMS2(cinfo, JWRN_JFIF_MAJOR,
|
WARNMS2(cinfo, JWRN_JFIF_MAJOR,
|
||||||
cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
|
cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
|
||||||
/* Generate trace messages */
|
/* Generate trace messages */
|
||||||
|
@ -1059,32 +1159,37 @@ read_markers (j_decompress_ptr cinfo)
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
cinfo->unread_marker = 0; /* processed the marker */
|
cinfo->unread_marker = 0; /* processed the marker */
|
||||||
return JPEG_REACHED_SOS;
|
return JPEG_REACHED_SOS;
|
||||||
|
|
||||||
case M_EOI:
|
case M_EOI:
|
||||||
TRACEMS(cinfo, 1, JTRC_EOI);
|
TRACEMS(cinfo, 1, JTRC_EOI);
|
||||||
cinfo->unread_marker = 0; /* processed the marker */
|
cinfo->unread_marker = 0; /* processed the marker */
|
||||||
return JPEG_REACHED_EOI;
|
return JPEG_REACHED_EOI;
|
||||||
|
|
||||||
case M_DAC:
|
case M_DAC:
|
||||||
if (! get_dac(cinfo))
|
if (! get_dac(cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_DHT:
|
case M_DHT:
|
||||||
if (! get_dht(cinfo))
|
if (! get_dht(cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_DQT:
|
case M_DQT:
|
||||||
if (! get_dqt(cinfo))
|
if (! get_dqt(cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_DRI:
|
case M_DRI:
|
||||||
if (! get_dri(cinfo))
|
if (! get_dri(cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case M_JPG8:
|
||||||
|
if (! get_lse(cinfo))
|
||||||
|
return JPEG_SUSPENDED;
|
||||||
|
break;
|
||||||
|
|
||||||
case M_APP0:
|
case M_APP0:
|
||||||
case M_APP1:
|
case M_APP1:
|
||||||
case M_APP2:
|
case M_APP2:
|
||||||
|
@ -1105,7 +1210,7 @@ read_markers (j_decompress_ptr cinfo)
|
||||||
cinfo->unread_marker - (int) M_APP0]) (cinfo))
|
cinfo->unread_marker - (int) M_APP0]) (cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case M_COM:
|
case M_COM:
|
||||||
if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
|
if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
|
@ -1314,7 +1419,7 @@ jinit_marker_reader (j_decompress_ptr cinfo)
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
||||||
SIZEOF(my_marker_reader));
|
SIZEOF(my_marker_reader));
|
||||||
cinfo->marker = (struct jpeg_marker_reader *) marker;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize public method pointers */
|
/* Initialize public method pointers */
|
||||||
marker->pub.reset_marker_reader = reset_marker_reader;
|
marker->pub.reset_marker_reader = reset_marker_reader;
|
||||||
marker->pub.read_markers = read_markers;
|
marker->pub.read_markers = read_markers;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdmaster.c
|
* jdmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2011 by Guido Vollbeding.
|
* Modified 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -51,7 +51,8 @@ use_merged_upsample (j_decompress_ptr cinfo)
|
||||||
/* jdmerge.c only supports YCC=>RGB color conversion */
|
/* jdmerge.c only supports YCC=>RGB color conversion */
|
||||||
if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
|
if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
|
||||||
cinfo->out_color_space != JCS_RGB ||
|
cinfo->out_color_space != JCS_RGB ||
|
||||||
cinfo->out_color_components != RGB_PIXELSIZE)
|
cinfo->out_color_components != RGB_PIXELSIZE ||
|
||||||
|
cinfo->color_transform)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
/* and it only handles 2h1v or 2h2v sampling ratios */
|
/* and it only handles 2h1v or 2h2v sampling ratios */
|
||||||
if (cinfo->comp_info[0].h_samp_factor != 2 ||
|
if (cinfo->comp_info[0].h_samp_factor != 2 ||
|
||||||
|
@ -158,9 +159,11 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
||||||
cinfo->out_color_components = 1;
|
cinfo->out_color_components = 1;
|
||||||
break;
|
break;
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
|
case JCS_BG_RGB:
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
break;
|
break;
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
|
case JCS_BG_YCC:
|
||||||
cinfo->out_color_components = 3;
|
cinfo->out_color_components = 3;
|
||||||
break;
|
break;
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
|
@ -273,10 +276,19 @@ master_selection (j_decompress_ptr cinfo)
|
||||||
long samplesperrow;
|
long samplesperrow;
|
||||||
JDIMENSION jd_samplesperrow;
|
JDIMENSION jd_samplesperrow;
|
||||||
|
|
||||||
|
/* For now, precision must match compiled-in value... */
|
||||||
|
if (cinfo->data_precision != BITS_IN_JSAMPLE)
|
||||||
|
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
||||||
|
|
||||||
/* Initialize dimensions and other stuff */
|
/* Initialize dimensions and other stuff */
|
||||||
jpeg_calc_output_dimensions(cinfo);
|
jpeg_calc_output_dimensions(cinfo);
|
||||||
prepare_range_limit_table(cinfo);
|
prepare_range_limit_table(cinfo);
|
||||||
|
|
||||||
|
/* Sanity check on image dimensions */
|
||||||
|
if (cinfo->output_height <= 0 || cinfo->output_width <= 0 ||
|
||||||
|
cinfo->out_color_components <= 0)
|
||||||
|
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
||||||
|
|
||||||
/* Width of an output scanline must be representable as JDIMENSION. */
|
/* Width of an output scanline must be representable as JDIMENSION. */
|
||||||
samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
|
samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
|
||||||
jd_samplesperrow = (JDIMENSION) samplesperrow;
|
jd_samplesperrow = (JDIMENSION) samplesperrow;
|
||||||
|
@ -521,7 +533,7 @@ jinit_master_decompress (j_decompress_ptr cinfo)
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(my_decomp_master));
|
SIZEOF(my_decomp_master));
|
||||||
cinfo->master = (struct jpeg_decomp_master *) master;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
||||||
master->pub.finish_output_pass = finish_output_pass;
|
master->pub.finish_output_pass = finish_output_pass;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jdmerge.c
|
* jdmerge.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -103,17 +104,17 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.40200 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
upsample->Cr_r_tab[i] = (int)
|
upsample->Cr_r_tab[i] = (int)
|
||||||
RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
|
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
||||||
/* Cb=>B value is nearest int to 1.77200 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
upsample->Cb_b_tab[i] = (int)
|
upsample->Cb_b_tab[i] = (int)
|
||||||
RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
|
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
||||||
/* Cr=>G value is scaled-up -0.71414 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
|
upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.34414 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
/* We also add in ONE_HALF so that need not do it in inner loop */
|
/* We also add in ONE_HALF so that need not do it in inner loop */
|
||||||
upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
|
upsample->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jerror.c
|
* jerror.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
|
* Modified 2012 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -66,7 +67,7 @@ const char * const jpeg_std_message_table[] = {
|
||||||
* or jpeg_destroy) at some point.
|
* or jpeg_destroy) at some point.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(noreturn_t)
|
||||||
error_exit (j_common_ptr cinfo)
|
error_exit (j_common_ptr cinfo)
|
||||||
{
|
{
|
||||||
/* Always display the message */
|
/* Always display the message */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jerror.h
|
* jerror.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2009 by Guido Vollbeding.
|
* Modified 1997-2012 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -106,11 +106,11 @@ JMESSAGE(JERR_QUANT_COMPONENTS,
|
||||||
"Cannot quantize more than %d color components")
|
"Cannot quantize more than %d color components")
|
||||||
JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
|
JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
|
||||||
JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
|
JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
|
||||||
|
JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF")
|
||||||
JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
|
JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
|
||||||
JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
|
JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
|
||||||
JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
|
JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
|
||||||
JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
|
JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
|
||||||
JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
|
|
||||||
JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
|
JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
|
||||||
JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
|
JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
|
||||||
JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
|
JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2,7 +2,7 @@
|
||||||
* jidctint.c
|
* jidctint.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modification developed 2002-2009 by Guido Vollbeding.
|
* Modification developed 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -165,6 +165,8 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients.
|
* Perform dequantization and inverse DCT on one block of coefficients.
|
||||||
|
*
|
||||||
|
* cK represents sqrt(2) * cos(K*pi/16).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
|
@ -184,9 +186,10 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
int workspace[DCTSIZE2]; /* buffers data between passes */
|
int workspace[DCTSIZE2]; /* buffers data between passes */
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pass 1: process columns from input, store into work array. */
|
/* Pass 1: process columns from input, store into work array.
|
||||||
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
|
* Note results are scaled up by sqrt(8) compared to a true IDCT;
|
||||||
/* furthermore, we scale the results by 2**PASS1_BITS. */
|
* furthermore, we scale the results by 2**PASS1_BITS.
|
||||||
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
|
@ -223,15 +226,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
||||||
|
@ -256,25 +260,25 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
|
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
|
||||||
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
|
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
|
||||||
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
||||||
|
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
|
@ -288,15 +292,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
|
||||||
|
|
||||||
inptr++; /* advance pointers to next column */
|
inptr++; /* advance pointers to next column */
|
||||||
quantptr++;
|
quantptr++;
|
||||||
wsptr++;
|
wsptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process rows from work array, store into output array. */
|
/* Pass 2: process rows from work array, store into output array.
|
||||||
/* Note that we must descale the results by a factor of 8 == 2**3, */
|
* Note that we must descale the results by a factor of 8 == 2**3,
|
||||||
/* and also undo the PASS1_BITS scaling. */
|
* and also undo the PASS1_BITS scaling.
|
||||||
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < DCTSIZE; ctr++) {
|
for (ctr = 0; ctr < DCTSIZE; ctr++) {
|
||||||
|
@ -330,15 +335,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = (INT32) wsptr[2];
|
z2 = (INT32) wsptr[2];
|
||||||
z3 = (INT32) wsptr[6];
|
z3 = (INT32) wsptr[6];
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
||||||
|
@ -346,7 +352,7 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
tmp0 = (z2 + z3) << CONST_BITS;
|
tmp0 = (z2 + z3) << CONST_BITS;
|
||||||
tmp1 = (z2 - z3) << CONST_BITS;
|
tmp1 = (z2 - z3) << CONST_BITS;
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp2;
|
tmp10 = tmp0 + tmp2;
|
||||||
tmp13 = tmp0 - tmp2;
|
tmp13 = tmp0 - tmp2;
|
||||||
tmp11 = tmp1 + tmp3;
|
tmp11 = tmp1 + tmp3;
|
||||||
|
@ -364,21 +370,21 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
|
@ -2835,9 +2841,11 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
int workspace[8*8]; /* buffers data between passes */
|
int workspace[8*8]; /* buffers data between passes */
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pass 1: process columns from input, store into work array. */
|
/* Pass 1: process columns from input, store into work array.
|
||||||
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
|
* Note results are scaled up by sqrt(8) compared to a true IDCT;
|
||||||
/* furthermore, we scale the results by 2**PASS1_BITS. */
|
* furthermore, we scale the results by 2**PASS1_BITS.
|
||||||
|
* 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
||||||
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
|
@ -2851,14 +2859,14 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
* With typical images and quantization tables, half or more of the
|
* With typical images and quantization tables, half or more of the
|
||||||
* column DCT calculations can be simplified this way.
|
* column DCT calculations can be simplified this way.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
|
if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
|
||||||
inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
|
inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
|
||||||
inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
|
inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
|
||||||
inptr[DCTSIZE*7] == 0) {
|
inptr[DCTSIZE*7] == 0) {
|
||||||
/* AC terms all zero */
|
/* AC terms all zero */
|
||||||
int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
|
int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
|
||||||
|
|
||||||
wsptr[DCTSIZE*0] = dcval;
|
wsptr[DCTSIZE*0] = dcval;
|
||||||
wsptr[DCTSIZE*1] = dcval;
|
wsptr[DCTSIZE*1] = dcval;
|
||||||
wsptr[DCTSIZE*2] = dcval;
|
wsptr[DCTSIZE*2] = dcval;
|
||||||
|
@ -2867,23 +2875,24 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
wsptr[DCTSIZE*5] = dcval;
|
wsptr[DCTSIZE*5] = dcval;
|
||||||
wsptr[DCTSIZE*6] = dcval;
|
wsptr[DCTSIZE*6] = dcval;
|
||||||
wsptr[DCTSIZE*7] = dcval;
|
wsptr[DCTSIZE*7] = dcval;
|
||||||
|
|
||||||
inptr++; /* advance pointers to next column */
|
inptr++; /* advance pointers to next column */
|
||||||
quantptr++;
|
quantptr++;
|
||||||
wsptr++;
|
wsptr++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
||||||
z2 <<= CONST_BITS;
|
z2 <<= CONST_BITS;
|
||||||
|
@ -2893,44 +2902,44 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
tmp0 = z2 + z3;
|
tmp0 = z2 + z3;
|
||||||
tmp1 = z2 - z3;
|
tmp1 = z2 - z3;
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp2;
|
tmp10 = tmp0 + tmp2;
|
||||||
tmp13 = tmp0 - tmp2;
|
tmp13 = tmp0 - tmp2;
|
||||||
tmp11 = tmp1 + tmp3;
|
tmp11 = tmp1 + tmp3;
|
||||||
tmp12 = tmp1 - tmp3;
|
tmp12 = tmp1 - tmp3;
|
||||||
|
|
||||||
/* Odd part per figure 8; the matrix is unitary and hence its
|
/* Odd part per figure 8; the matrix is unitary and hence its
|
||||||
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
|
tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
|
||||||
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
|
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
|
||||||
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
|
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
|
||||||
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
||||||
|
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
||||||
|
|
||||||
wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
|
||||||
|
@ -2939,7 +2948,7 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
|
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
|
||||||
|
|
||||||
inptr++; /* advance pointers to next column */
|
inptr++; /* advance pointers to next column */
|
||||||
quantptr++;
|
quantptr++;
|
||||||
wsptr++;
|
wsptr++;
|
||||||
|
@ -2948,6 +2957,7 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 8 rows from work array, store into output array.
|
/* Pass 2: process 8 rows from work array, store into output array.
|
||||||
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
|
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 8; ctr++) {
|
for (ctr = 0; ctr < 8; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3109,6 +3119,7 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
|
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -3164,6 +3175,7 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 7 rows from work array, store into output array.
|
/* Pass 2: process 7 rows from work array, store into output array.
|
||||||
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
|
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 7; ctr++) {
|
for (ctr = 0; ctr < 7; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3304,6 +3316,7 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -3346,6 +3359,7 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 6 rows from work array, store into output array.
|
/* Pass 2: process 6 rows from work array, store into output array.
|
||||||
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
|
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 6; ctr++) {
|
for (ctr = 0; ctr < 6; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3480,6 +3494,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
|
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -3520,6 +3535,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 5 rows from work array, store into output array.
|
/* Pass 2: process 5 rows from work array, store into output array.
|
||||||
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
|
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 5; ctr++) {
|
for (ctr = 0; ctr < 5; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3639,8 +3655,10 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
* 4-point IDCT kernel,
|
||||||
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -3675,31 +3693,34 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
wsptr[8*2] = (int) (tmp12 - tmp2);
|
wsptr[8*2] = (int) (tmp12 - tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process rows from work array, store into output array. */
|
/* Pass 2: process rows from work array, store into output array.
|
||||||
/* Note that we must descale the results by a factor of 8 == 2**3, */
|
* Note that we must descale the results by a factor of 8 == 2**3,
|
||||||
/* and also undo the PASS1_BITS scaling. */
|
* and also undo the PASS1_BITS scaling.
|
||||||
|
* 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
||||||
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 4; ctr++) {
|
for (ctr = 0; ctr < 4; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = (INT32) wsptr[2];
|
z2 = (INT32) wsptr[2];
|
||||||
z3 = (INT32) wsptr[6];
|
z3 = (INT32) wsptr[6];
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
||||||
z3 = (INT32) wsptr[4];
|
z3 = (INT32) wsptr[4];
|
||||||
|
|
||||||
tmp0 = (z2 + z3) << CONST_BITS;
|
tmp0 = (z2 + z3) << CONST_BITS;
|
||||||
tmp1 = (z2 - z3) << CONST_BITS;
|
tmp1 = (z2 - z3) << CONST_BITS;
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp2;
|
tmp10 = tmp0 + tmp2;
|
||||||
tmp13 = tmp0 - tmp2;
|
tmp13 = tmp0 - tmp2;
|
||||||
tmp11 = tmp1 + tmp3;
|
tmp11 = tmp1 + tmp3;
|
||||||
|
@ -3717,21 +3738,21 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
|
@ -3793,6 +3814,7 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
|
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -3823,6 +3845,7 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 3 rows from work array, store into output array.
|
/* Pass 2: process 3 rows from work array, store into output array.
|
||||||
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 3; ctr++) {
|
for (ctr = 0; ctr < 3; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3924,6 +3947,7 @@ jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
* 4-point IDCT kernel,
|
* 4-point IDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 2; ctr++) {
|
for (ctr = 0; ctr < 2; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -3979,7 +4003,7 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JCOEFPTR coef_block,
|
JCOEFPTR coef_block,
|
||||||
JSAMPARRAY output_buf, JDIMENSION output_col)
|
JSAMPARRAY output_buf, JDIMENSION output_col)
|
||||||
{
|
{
|
||||||
INT32 tmp0, tmp10;
|
INT32 tmp0, tmp1;
|
||||||
ISLOW_MULT_TYPE * quantptr;
|
ISLOW_MULT_TYPE * quantptr;
|
||||||
JSAMPROW outptr;
|
JSAMPROW outptr;
|
||||||
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
|
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
|
||||||
|
@ -3994,18 +4018,18 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
/* Even part */
|
/* Even part */
|
||||||
|
|
||||||
tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]);
|
tmp0 = DEQUANTIZE(coef_block[0], quantptr[0]);
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp10 += ONE << 2;
|
tmp0 += ONE << 2;
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]);
|
tmp1 = DEQUANTIZE(coef_block[1], quantptr[1]);
|
||||||
|
|
||||||
/* Final output stage */
|
/* Final output stage */
|
||||||
|
|
||||||
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK];
|
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
|
||||||
outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK];
|
outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4036,6 +4060,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
|
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -4134,69 +4159,72 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
|
wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
|
||||||
wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
|
wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process rows from work array, store into output array. */
|
/* Pass 2: process rows from work array, store into output array.
|
||||||
/* Note that we must descale the results by a factor of 8 == 2**3, */
|
* Note that we must descale the results by a factor of 8 == 2**3,
|
||||||
/* and also undo the PASS1_BITS scaling. */
|
* and also undo the PASS1_BITS scaling.
|
||||||
|
* 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
||||||
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 16; ctr++) {
|
for (ctr = 0; ctr < 16; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = (INT32) wsptr[2];
|
z2 = (INT32) wsptr[2];
|
||||||
z3 = (INT32) wsptr[6];
|
z3 = (INT32) wsptr[6];
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
|
||||||
z3 = (INT32) wsptr[4];
|
z3 = (INT32) wsptr[4];
|
||||||
|
|
||||||
tmp0 = (z2 + z3) << CONST_BITS;
|
tmp0 = (z2 + z3) << CONST_BITS;
|
||||||
tmp1 = (z2 - z3) << CONST_BITS;
|
tmp1 = (z2 - z3) << CONST_BITS;
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp2;
|
tmp10 = tmp0 + tmp2;
|
||||||
tmp13 = tmp0 - tmp2;
|
tmp13 = tmp0 - tmp2;
|
||||||
tmp11 = tmp1 + tmp3;
|
tmp11 = tmp1 + tmp3;
|
||||||
tmp12 = tmp1 - tmp3;
|
tmp12 = tmp1 - tmp3;
|
||||||
|
|
||||||
/* Odd part per figure 8; the matrix is unitary and hence its
|
/* Odd part per figure 8; the matrix is unitary and hence its
|
||||||
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tmp0 = (INT32) wsptr[7];
|
tmp0 = (INT32) wsptr[7];
|
||||||
tmp1 = (INT32) wsptr[5];
|
tmp1 = (INT32) wsptr[5];
|
||||||
tmp2 = (INT32) wsptr[3];
|
tmp2 = (INT32) wsptr[3];
|
||||||
tmp3 = (INT32) wsptr[1];
|
tmp3 = (INT32) wsptr[1];
|
||||||
|
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
|
||||||
|
|
||||||
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
|
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
|
||||||
CONST_BITS+PASS1_BITS+3)
|
CONST_BITS+PASS1_BITS+3)
|
||||||
& RANGE_MASK];
|
& RANGE_MASK];
|
||||||
|
@ -4221,7 +4249,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
|
outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
|
||||||
CONST_BITS+PASS1_BITS+3)
|
CONST_BITS+PASS1_BITS+3)
|
||||||
& RANGE_MASK];
|
& RANGE_MASK];
|
||||||
|
|
||||||
wsptr += DCTSIZE; /* advance pointer to next row */
|
wsptr += DCTSIZE; /* advance pointer to next row */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4254,6 +4282,7 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
|
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -4341,6 +4370,7 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 14 rows from work array, store into output array.
|
/* Pass 2: process 14 rows from work array, store into output array.
|
||||||
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
|
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 14; ctr++) {
|
for (ctr = 0; ctr < 14; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -4437,6 +4467,7 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
|
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -4520,6 +4551,7 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 12 rows from work array, store into output array.
|
/* Pass 2: process 12 rows from work array, store into output array.
|
||||||
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 12; ctr++) {
|
for (ctr = 0; ctr < 12; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -4601,6 +4633,7 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
|
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -4676,6 +4709,7 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 10 rows from work array, store into output array.
|
/* Pass 2: process 10 rows from work array, store into output array.
|
||||||
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
|
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 10; ctr++) {
|
for (ctr = 0; ctr < 10; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -4750,9 +4784,11 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
int workspace[4*8]; /* buffers data between passes */
|
int workspace[4*8]; /* buffers data between passes */
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pass 1: process columns from input, store into work array. */
|
/* Pass 1: process columns from input, store into work array.
|
||||||
/* Note results are scaled up by sqrt(8) compared to a true IDCT; */
|
* Note results are scaled up by sqrt(8) compared to a true IDCT;
|
||||||
/* furthermore, we scale the results by 2**PASS1_BITS. */
|
* furthermore, we scale the results by 2**PASS1_BITS.
|
||||||
|
* 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
||||||
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
|
@ -4789,16 +4825,17 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Even part: reverse the even part of the forward DCT. */
|
/* Even part: reverse the even part of the forward DCT.
|
||||||
/* The rotator is sqrt(2)*c(-6). */
|
* The rotator is c(-6).
|
||||||
|
*/
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
|
tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
||||||
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
|
||||||
z2 <<= CONST_BITS;
|
z2 <<= CONST_BITS;
|
||||||
|
@ -4808,7 +4845,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
tmp0 = z2 + z3;
|
tmp0 = z2 + z3;
|
||||||
tmp1 = z2 - z3;
|
tmp1 = z2 - z3;
|
||||||
|
|
||||||
tmp10 = tmp0 + tmp2;
|
tmp10 = tmp0 + tmp2;
|
||||||
tmp13 = tmp0 - tmp2;
|
tmp13 = tmp0 - tmp2;
|
||||||
tmp11 = tmp1 + tmp3;
|
tmp11 = tmp1 + tmp3;
|
||||||
|
@ -4826,21 +4863,21 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
z2 = tmp0 + tmp2;
|
z2 = tmp0 + tmp2;
|
||||||
z3 = tmp1 + tmp3;
|
z3 = tmp1 + tmp3;
|
||||||
|
|
||||||
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
|
z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
|
||||||
z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
|
z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
|
||||||
z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
|
z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
|
||||||
z2 += z1;
|
z2 += z1;
|
||||||
z3 += z1;
|
z3 += z1;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
|
z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
|
||||||
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
|
tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
|
||||||
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
|
tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
|
||||||
tmp0 += z1 + z2;
|
tmp0 += z1 + z2;
|
||||||
tmp3 += z1 + z3;
|
tmp3 += z1 + z3;
|
||||||
|
|
||||||
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
|
z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
|
||||||
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
|
tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
|
||||||
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
|
tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
|
||||||
tmp1 += z1 + z3;
|
tmp1 += z1 + z3;
|
||||||
tmp2 += z1 + z2;
|
tmp2 += z1 + z2;
|
||||||
|
|
||||||
|
@ -4861,8 +4898,10 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process 8 rows from work array, store into output array.
|
/* Pass 2: process 8 rows from work array, store into output array.
|
||||||
* 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
|
* 4-point IDCT kernel,
|
||||||
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 8; ctr++) {
|
for (ctr = 0; ctr < 8; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -4900,7 +4939,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
|
outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
|
||||||
CONST_BITS+PASS1_BITS+3)
|
CONST_BITS+PASS1_BITS+3)
|
||||||
& RANGE_MASK];
|
& RANGE_MASK];
|
||||||
|
|
||||||
wsptr += 4; /* advance pointer to next row */
|
wsptr += 4; /* advance pointer to next row */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4932,6 +4971,7 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 1: process columns from input, store into work array.
|
/* Pass 1: process columns from input, store into work array.
|
||||||
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -4974,6 +5014,7 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
/* Pass 2: process 6 rows from work array, store into output array.
|
/* Pass 2: process 6 rows from work array, store into output array.
|
||||||
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
|
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
for (ctr = 0; ctr < 6; ctr++) {
|
for (ctr = 0; ctr < 6; ctr++) {
|
||||||
outptr = output_buf[ctr] + output_col;
|
outptr = output_buf[ctr] + output_col;
|
||||||
|
@ -5037,6 +5078,7 @@ jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
* 4-point IDCT kernel,
|
* 4-point IDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
inptr = coef_block;
|
inptr = coef_block;
|
||||||
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
|
||||||
wsptr = workspace;
|
wsptr = workspace;
|
||||||
|
@ -5106,7 +5148,7 @@ jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JCOEFPTR coef_block,
|
JCOEFPTR coef_block,
|
||||||
JSAMPARRAY output_buf, JDIMENSION output_col)
|
JSAMPARRAY output_buf, JDIMENSION output_col)
|
||||||
{
|
{
|
||||||
INT32 tmp0, tmp10;
|
INT32 tmp0, tmp1;
|
||||||
ISLOW_MULT_TYPE * quantptr;
|
ISLOW_MULT_TYPE * quantptr;
|
||||||
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
|
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
@ -5117,19 +5159,19 @@ jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
/* Even part */
|
/* Even part */
|
||||||
|
|
||||||
tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
tmp0 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp10 += ONE << 2;
|
tmp0 += ONE << 2;
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
tmp1 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
|
||||||
|
|
||||||
/* Final output stage */
|
/* Final output stage */
|
||||||
|
|
||||||
output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3)
|
output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3)
|
||||||
& RANGE_MASK];
|
& RANGE_MASK];
|
||||||
output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3)
|
output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3)
|
||||||
& RANGE_MASK];
|
& RANGE_MASK];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jmemmgr.c
|
* jmemmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011 by Guido Vollbeding.
|
* Modified 2011-2012 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -214,7 +214,7 @@ print_mem_stats (j_common_ptr cinfo, int pool_id)
|
||||||
#endif /* MEM_STATS */
|
#endif /* MEM_STATS */
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(noreturn_t)
|
||||||
out_of_memory (j_common_ptr cinfo, int which)
|
out_of_memory (j_common_ptr cinfo, int which)
|
||||||
/* Report an out-of-memory error and stop execution */
|
/* Report an out-of-memory error and stop execution */
|
||||||
/* If we compiled MEM_STATS support, report alloc requests before dying */
|
/* If we compiled MEM_STATS support, report alloc requests before dying */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jmorecfg.h
|
* jmorecfg.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2011 by Guido Vollbeding.
|
* Modified 1997-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -15,13 +15,22 @@
|
||||||
/*
|
/*
|
||||||
* Define BITS_IN_JSAMPLE as either
|
* Define BITS_IN_JSAMPLE as either
|
||||||
* 8 for 8-bit sample values (the usual setting)
|
* 8 for 8-bit sample values (the usual setting)
|
||||||
|
* 9 for 9-bit sample values
|
||||||
|
* 10 for 10-bit sample values
|
||||||
|
* 11 for 11-bit sample values
|
||||||
* 12 for 12-bit sample values
|
* 12 for 12-bit sample values
|
||||||
* Only 8 and 12 are legal data precisions for lossy JPEG according to the
|
* Only 8, 9, 10, 11, and 12 bits sample data precision are supported for
|
||||||
* JPEG standard, and the IJG code does not support anything else!
|
* full-feature DCT processing. Further depths up to 16-bit may be added
|
||||||
* We do not support run-time selection of data precision, sorry.
|
* later for the lossless modes of operation.
|
||||||
|
* Run-time selection and conversion of data precision will be added later
|
||||||
|
* and are currently not supported, sorry.
|
||||||
|
* Exception: The transcoding part (jpegtran) supports all settings in a
|
||||||
|
* single instance, since it operates on the level of DCT coefficients and
|
||||||
|
* not sample values. The DCT coefficients are of the same type (16 bits)
|
||||||
|
* in all cases (see below).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
|
#define BITS_IN_JSAMPLE 8 /* use 8, 9, 10, 11, or 12 */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -77,6 +86,48 @@ typedef char JSAMPLE;
|
||||||
#endif /* BITS_IN_JSAMPLE == 8 */
|
#endif /* BITS_IN_JSAMPLE == 8 */
|
||||||
|
|
||||||
|
|
||||||
|
#if BITS_IN_JSAMPLE == 9
|
||||||
|
/* JSAMPLE should be the smallest type that will hold the values 0..511.
|
||||||
|
* On nearly all machines "short" will do nicely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef short JSAMPLE;
|
||||||
|
#define GETJSAMPLE(value) ((int) (value))
|
||||||
|
|
||||||
|
#define MAXJSAMPLE 511
|
||||||
|
#define CENTERJSAMPLE 256
|
||||||
|
|
||||||
|
#endif /* BITS_IN_JSAMPLE == 9 */
|
||||||
|
|
||||||
|
|
||||||
|
#if BITS_IN_JSAMPLE == 10
|
||||||
|
/* JSAMPLE should be the smallest type that will hold the values 0..1023.
|
||||||
|
* On nearly all machines "short" will do nicely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef short JSAMPLE;
|
||||||
|
#define GETJSAMPLE(value) ((int) (value))
|
||||||
|
|
||||||
|
#define MAXJSAMPLE 1023
|
||||||
|
#define CENTERJSAMPLE 512
|
||||||
|
|
||||||
|
#endif /* BITS_IN_JSAMPLE == 10 */
|
||||||
|
|
||||||
|
|
||||||
|
#if BITS_IN_JSAMPLE == 11
|
||||||
|
/* JSAMPLE should be the smallest type that will hold the values 0..2047.
|
||||||
|
* On nearly all machines "short" will do nicely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef short JSAMPLE;
|
||||||
|
#define GETJSAMPLE(value) ((int) (value))
|
||||||
|
|
||||||
|
#define MAXJSAMPLE 2047
|
||||||
|
#define CENTERJSAMPLE 1024
|
||||||
|
|
||||||
|
#endif /* BITS_IN_JSAMPLE == 11 */
|
||||||
|
|
||||||
|
|
||||||
#if BITS_IN_JSAMPLE == 12
|
#if BITS_IN_JSAMPLE == 12
|
||||||
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
|
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
|
||||||
* On nearly all machines "short" will do nicely.
|
* On nearly all machines "short" will do nicely.
|
||||||
|
@ -210,6 +261,26 @@ typedef unsigned int JDIMENSION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* The noreturn type identifier is used to declare functions
|
||||||
|
* which cannot return.
|
||||||
|
* Compilers can thus create more optimized code and perform
|
||||||
|
* better checks for warnings and errors.
|
||||||
|
* Static analyzer tools can make improved inferences about
|
||||||
|
* execution paths and are prevented from giving false alerts.
|
||||||
|
*
|
||||||
|
* Unfortunately, the proposed specifications of corresponding
|
||||||
|
* extensions in the Dec 2011 ISO C standard revision (C11),
|
||||||
|
* GCC, MSVC, etc. are not viable.
|
||||||
|
* Thus we introduce a user defined type to declare noreturn
|
||||||
|
* functions at least for clarity. A proper compiler would
|
||||||
|
* have a suitable noreturn type to match in place of void.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_NORETURN_T
|
||||||
|
typedef void noreturn_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Here is the pseudo-keyword for declaring pointers that must be "far"
|
/* Here is the pseudo-keyword for declaring pointers that must be "far"
|
||||||
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
|
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
|
||||||
* by just saying "FAR *" where such a pointer is needed. In a few places
|
* by just saying "FAR *" where such a pointer is needed. In a few places
|
||||||
|
@ -233,14 +304,19 @@ typedef unsigned int JDIMENSION;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef HAVE_BOOLEAN
|
#ifndef HAVE_BOOLEAN
|
||||||
|
#if defined FALSE || defined TRUE || defined QGLOBAL_H
|
||||||
|
/* Qt3 defines FALSE and TRUE as "const" variables in qglobal.h */
|
||||||
typedef int boolean;
|
typedef int boolean;
|
||||||
#endif
|
|
||||||
#ifndef FALSE /* in case these macros already exist */
|
#ifndef FALSE /* in case these macros already exist */
|
||||||
#define FALSE 0 /* values of boolean */
|
#define FALSE 0 /* values of boolean */
|
||||||
#endif
|
#endif
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
typedef enum { FALSE = 0, TRUE = 1 } boolean;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -278,11 +354,12 @@ typedef int boolean;
|
||||||
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/
|
#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/
|
||||||
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
||||||
/* Note: if you selected 12-bit data precision, it is dangerous to turn off
|
/* Note: if you selected more than 8-bit data precision, it is dangerous to
|
||||||
* ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
|
* turn off ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only
|
||||||
* precision, so jchuff.c normally uses entropy optimization to compute
|
* good for 8-bit precision, so arithmetic coding is recommended for higher
|
||||||
* usable tables for higher precision. If you don't want to do optimization,
|
* precision. The Huffman encoder normally uses entropy optimization to
|
||||||
* you'll have to supply different default Huffman tables.
|
* compute usable tables for higher precision. Otherwise, you'll have to
|
||||||
|
* supply different default Huffman tables.
|
||||||
* The exact same statements apply for progressive JPEG: the default tables
|
* The exact same statements apply for progressive JPEG: the default tables
|
||||||
* don't work for progressive mode. (This may get fixed, however.)
|
* don't work for progressive mode. (This may get fixed, however.)
|
||||||
*/
|
*/
|
||||||
|
@ -293,7 +370,7 @@ typedef int boolean;
|
||||||
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
||||||
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
||||||
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
|
#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? (Requires DCT_ISLOW)*/
|
||||||
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
||||||
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
|
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
|
||||||
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
|
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jpegint.h
|
* jpegint.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2011 by Guido Vollbeding.
|
* Modified 1997-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -211,8 +211,8 @@ struct jpeg_marker_reader {
|
||||||
/* Entropy decoding */
|
/* Entropy decoding */
|
||||||
struct jpeg_entropy_decoder {
|
struct jpeg_entropy_decoder {
|
||||||
JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
|
JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
|
||||||
JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
|
JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKROW *MCU_data));
|
||||||
JBLOCKROW *MCU_data));
|
JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Inverse DCT (also performs dequantization) */
|
/* Inverse DCT (also performs dequantization) */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jpeglib.h
|
* jpeglib.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2002-2011 by Guido Vollbeding.
|
* Modified 2002-2013 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -34,17 +34,17 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Version IDs for the JPEG library.
|
/* Version IDs for the JPEG library.
|
||||||
* Might be useful for tests like "#if JPEG_LIB_VERSION >= 80".
|
* Might be useful for tests like "#if JPEG_LIB_VERSION >= 90".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */
|
#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
|
||||||
#define JPEG_LIB_VERSION_MAJOR 8
|
#define JPEG_LIB_VERSION_MAJOR 9
|
||||||
#define JPEG_LIB_VERSION_MINOR 4
|
#define JPEG_LIB_VERSION_MINOR 1
|
||||||
|
|
||||||
|
|
||||||
/* Various constants determining the sizes of things.
|
/* Various constants determining the sizes of things.
|
||||||
* All of these are specified by the JPEG standard, so don't change them
|
* All of these are specified by the JPEG standard,
|
||||||
* if you want to be compatible.
|
* so don't change them if you want to be compatible.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */
|
#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */
|
||||||
|
@ -157,16 +157,21 @@ typedef struct {
|
||||||
/* The downsampled dimensions are the component's actual, unpadded number
|
/* The downsampled dimensions are the component's actual, unpadded number
|
||||||
* of samples at the main buffer (preprocessing/compression interface);
|
* of samples at the main buffer (preprocessing/compression interface);
|
||||||
* DCT scaling is included, so
|
* DCT scaling is included, so
|
||||||
* downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE)
|
* downsampled_width =
|
||||||
|
* ceil(image_width * Hi/Hmax * DCT_h_scaled_size/block_size)
|
||||||
* and similarly for height.
|
* and similarly for height.
|
||||||
*/
|
*/
|
||||||
JDIMENSION downsampled_width; /* actual width in samples */
|
JDIMENSION downsampled_width; /* actual width in samples */
|
||||||
JDIMENSION downsampled_height; /* actual height in samples */
|
JDIMENSION downsampled_height; /* actual height in samples */
|
||||||
/* This flag is used only for decompression. In cases where some of the
|
/* For decompression, in cases where some of the components will be
|
||||||
* components will be ignored (eg grayscale output from YCbCr image),
|
* ignored (eg grayscale output from YCbCr image), we can skip most
|
||||||
* we can skip most computations for the unused components.
|
* computations for the unused components.
|
||||||
|
* For compression, some of the components will need further quantization
|
||||||
|
* scale by factor of 2 after DCT (eg BG_YCC output from normal RGB input).
|
||||||
|
* The field is first set TRUE for decompression, FALSE for compression
|
||||||
|
* in initial_setup, and then adapted in color conversion setup.
|
||||||
*/
|
*/
|
||||||
boolean component_needed; /* do we need the value of this component? */
|
boolean component_needed;
|
||||||
|
|
||||||
/* These values are computed before starting a scan of the component. */
|
/* These values are computed before starting a scan of the component. */
|
||||||
/* The decompressor output side may not use these variables. */
|
/* The decompressor output side may not use these variables. */
|
||||||
|
@ -215,12 +220,21 @@ struct jpeg_marker_struct {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JCS_UNKNOWN, /* error/unspecified */
|
JCS_UNKNOWN, /* error/unspecified */
|
||||||
JCS_GRAYSCALE, /* monochrome */
|
JCS_GRAYSCALE, /* monochrome */
|
||||||
JCS_RGB, /* red/green/blue */
|
JCS_RGB, /* red/green/blue, standard RGB (sRGB) */
|
||||||
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
|
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV), standard YCC */
|
||||||
JCS_CMYK, /* C/M/Y/K */
|
JCS_CMYK, /* C/M/Y/K */
|
||||||
JCS_YCCK /* Y/Cb/Cr/K */
|
JCS_YCCK, /* Y/Cb/Cr/K */
|
||||||
|
JCS_BG_RGB, /* big gamut red/green/blue, bg-sRGB */
|
||||||
|
JCS_BG_YCC /* big gamut Y/Cb/Cr, bg-sYCC */
|
||||||
} J_COLOR_SPACE;
|
} J_COLOR_SPACE;
|
||||||
|
|
||||||
|
/* Supported color transforms. */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
JCT_NONE = 0,
|
||||||
|
JCT_SUBTRACT_GREEN = 1
|
||||||
|
} J_COLOR_TRANSFORM;
|
||||||
|
|
||||||
/* DCT/IDCT algorithm options. */
|
/* DCT/IDCT algorithm options. */
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -369,7 +383,10 @@ struct jpeg_compress_struct {
|
||||||
UINT16 X_density; /* Horizontal pixel density */
|
UINT16 X_density; /* Horizontal pixel density */
|
||||||
UINT16 Y_density; /* Vertical pixel density */
|
UINT16 Y_density; /* Vertical pixel density */
|
||||||
boolean write_Adobe_marker; /* should an Adobe marker be written? */
|
boolean write_Adobe_marker; /* should an Adobe marker be written? */
|
||||||
|
|
||||||
|
J_COLOR_TRANSFORM color_transform;
|
||||||
|
/* Color transform identifier, writes LSE marker if nonzero */
|
||||||
|
|
||||||
/* State variable: index of next scanline to be written to
|
/* State variable: index of next scanline to be written to
|
||||||
* jpeg_write_scanlines(). Application may use this to control its
|
* jpeg_write_scanlines(). Application may use this to control its
|
||||||
* processing loop, e.g., "while (next_scanline < image_height)".
|
* processing loop, e.g., "while (next_scanline < image_height)".
|
||||||
|
@ -589,6 +606,9 @@ struct jpeg_decompress_struct {
|
||||||
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
|
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
|
||||||
UINT8 Adobe_transform; /* Color transform code from Adobe marker */
|
UINT8 Adobe_transform; /* Color transform code from Adobe marker */
|
||||||
|
|
||||||
|
J_COLOR_TRANSFORM color_transform;
|
||||||
|
/* Color transform identifier derived from LSE marker, otherwise zero */
|
||||||
|
|
||||||
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
|
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
|
||||||
|
|
||||||
/* Aside from the specific data retained from APPn markers known to the
|
/* Aside from the specific data retained from APPn markers known to the
|
||||||
|
@ -681,7 +701,7 @@ struct jpeg_decompress_struct {
|
||||||
|
|
||||||
struct jpeg_error_mgr {
|
struct jpeg_error_mgr {
|
||||||
/* Error exit handler: does not return to caller */
|
/* Error exit handler: does not return to caller */
|
||||||
JMETHOD(void, error_exit, (j_common_ptr cinfo));
|
JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo));
|
||||||
/* Conditionally emit a trace or warning message */
|
/* Conditionally emit a trace or warning message */
|
||||||
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
|
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
|
||||||
/* Routine that actually outputs a trace or error message */
|
/* Routine that actually outputs a trace or error message */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* jpegtran.c
|
* jpegtran.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1995-2011, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1995-2013, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -66,8 +66,8 @@ usage (void)
|
||||||
fprintf(stderr, "Switches for modifying the image:\n");
|
fprintf(stderr, "Switches for modifying the image:\n");
|
||||||
#if TRANSFORMS_SUPPORTED
|
#if TRANSFORMS_SUPPORTED
|
||||||
fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
|
fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
|
||||||
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
|
|
||||||
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
|
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
|
||||||
|
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
|
||||||
fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
|
fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
|
||||||
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
|
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -76,6 +76,7 @@ usage (void)
|
||||||
fprintf(stderr, " -transpose Transpose image\n");
|
fprintf(stderr, " -transpose Transpose image\n");
|
||||||
fprintf(stderr, " -transverse Transverse transpose image\n");
|
fprintf(stderr, " -transverse Transverse transpose image\n");
|
||||||
fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
|
fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
|
||||||
|
fprintf(stderr, " -wipe WxH+X+Y Wipe (gray out) a rectangular subarea\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, "Switches for advanced users:\n");
|
fprintf(stderr, "Switches for advanced users:\n");
|
||||||
#ifdef C_ARITH_CODING_SUPPORTED
|
#ifdef C_ARITH_CODING_SUPPORTED
|
||||||
|
@ -187,7 +188,8 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
#if TRANSFORMS_SUPPORTED
|
#if TRANSFORMS_SUPPORTED
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
|
if (transformoption.crop /* reject multiple crop/wipe requests */ ||
|
||||||
|
! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
|
||||||
fprintf(stderr, "%s: bogus -crop argument '%s'\n",
|
fprintf(stderr, "%s: bogus -crop argument '%s'\n",
|
||||||
progname, argv[argn]);
|
progname, argv[argn]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -336,6 +338,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
/* Trim off any partial edge MCUs that the transform can't handle. */
|
/* Trim off any partial edge MCUs that the transform can't handle. */
|
||||||
transformoption.trim = TRUE;
|
transformoption.trim = TRUE;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "wipe", 1)) {
|
||||||
|
#if TRANSFORMS_SUPPORTED
|
||||||
|
if (++argn >= argc) /* advance to next argument */
|
||||||
|
usage();
|
||||||
|
if (transformoption.crop /* reject multiple crop/wipe requests */ ||
|
||||||
|
! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
|
||||||
|
fprintf(stderr, "%s: bogus -wipe argument '%s'\n",
|
||||||
|
progname, argv[argn]);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
select_transform(JXFORM_WIPE);
|
||||||
|
#else
|
||||||
|
select_transform(JXFORM_NONE); /* force an error */
|
||||||
|
#endif
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
usage(); /* bogus switch */
|
usage(); /* bogus switch */
|
||||||
}
|
}
|
||||||
|
@ -467,7 +484,7 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
/* Adjust default decompression parameters */
|
/* Adjust default decompression parameters */
|
||||||
if (scaleoption != NULL)
|
if (scaleoption != NULL)
|
||||||
if (sscanf(scaleoption, "%d/%d",
|
if (sscanf(scaleoption, "%u/%u",
|
||||||
&srcinfo.scale_num, &srcinfo.scale_denom) < 1)
|
&srcinfo.scale_num, &srcinfo.scale_denom) < 1)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* jversion.h
|
* jversion.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1991-2014, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -9,6 +9,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define JVERSION "8d 15-Jan-2012"
|
#define JVERSION "9a 19-Jan-2014"
|
||||||
|
|
||||||
#define JCOPYRIGHT "Copyright (C) 2012, Thomas G. Lane, Guido Vollbeding"
|
#define JCOPYRIGHT "Copyright (C) 2014, Thomas G. Lane, Guido Vollbeding"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* transupp.c
|
* transupp.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1997-2013, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -113,6 +113,116 @@ do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
do_crop_ext (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||||
|
JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
|
||||||
|
jvirt_barray_ptr *src_coef_arrays,
|
||||||
|
jvirt_barray_ptr *dst_coef_arrays)
|
||||||
|
/* Crop. This is only used when no rotate/flip is requested with the crop.
|
||||||
|
* Extension: If the destination size is larger than the source, we fill in
|
||||||
|
* the extra area with zero (neutral gray). Note we also have to zero partial
|
||||||
|
* iMCUs at the right and bottom edge of the source image area in this case.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height;
|
||||||
|
JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks;
|
||||||
|
int ci, offset_y;
|
||||||
|
JBLOCKARRAY src_buffer, dst_buffer;
|
||||||
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
|
MCU_cols = srcinfo->output_width /
|
||||||
|
(dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
|
||||||
|
MCU_rows = srcinfo->output_height /
|
||||||
|
(dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
|
||||||
|
|
||||||
|
for (ci = 0; ci < dstinfo->num_components; ci++) {
|
||||||
|
compptr = dstinfo->comp_info + ci;
|
||||||
|
comp_width = MCU_cols * compptr->h_samp_factor;
|
||||||
|
comp_height = MCU_rows * compptr->v_samp_factor;
|
||||||
|
x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
|
||||||
|
y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
|
||||||
|
for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
|
||||||
|
dst_blk_y += compptr->v_samp_factor) {
|
||||||
|
dst_buffer = (*srcinfo->mem->access_virt_barray)
|
||||||
|
((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
|
||||||
|
(JDIMENSION) compptr->v_samp_factor, TRUE);
|
||||||
|
if (dstinfo->jpeg_height > srcinfo->output_height) {
|
||||||
|
if (dst_blk_y < y_crop_blocks ||
|
||||||
|
dst_blk_y >= comp_height + y_crop_blocks) {
|
||||||
|
for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
|
||||||
|
FMEMZERO(dst_buffer[offset_y],
|
||||||
|
compptr->width_in_blocks * SIZEOF(JBLOCK));
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
src_buffer = (*srcinfo->mem->access_virt_barray)
|
||||||
|
((j_common_ptr) srcinfo, src_coef_arrays[ci],
|
||||||
|
dst_blk_y - y_crop_blocks,
|
||||||
|
(JDIMENSION) compptr->v_samp_factor, FALSE);
|
||||||
|
} else {
|
||||||
|
src_buffer = (*srcinfo->mem->access_virt_barray)
|
||||||
|
((j_common_ptr) srcinfo, src_coef_arrays[ci],
|
||||||
|
dst_blk_y + y_crop_blocks,
|
||||||
|
(JDIMENSION) compptr->v_samp_factor, FALSE);
|
||||||
|
}
|
||||||
|
for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
|
||||||
|
if (dstinfo->jpeg_width > srcinfo->output_width) {
|
||||||
|
if (x_crop_blocks > 0) {
|
||||||
|
FMEMZERO(dst_buffer[offset_y],
|
||||||
|
x_crop_blocks * SIZEOF(JBLOCK));
|
||||||
|
}
|
||||||
|
jcopy_block_row(src_buffer[offset_y],
|
||||||
|
dst_buffer[offset_y] + x_crop_blocks,
|
||||||
|
comp_width);
|
||||||
|
if (compptr->width_in_blocks > comp_width + x_crop_blocks) {
|
||||||
|
FMEMZERO(dst_buffer[offset_y] +
|
||||||
|
comp_width + x_crop_blocks,
|
||||||
|
(compptr->width_in_blocks -
|
||||||
|
comp_width - x_crop_blocks) * SIZEOF(JBLOCK));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
jcopy_block_row(src_buffer[offset_y] + x_crop_blocks,
|
||||||
|
dst_buffer[offset_y],
|
||||||
|
compptr->width_in_blocks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
do_wipe (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||||
|
JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
|
||||||
|
jvirt_barray_ptr *src_coef_arrays,
|
||||||
|
JDIMENSION drop_width, JDIMENSION drop_height)
|
||||||
|
/* Wipe - drop content of specified area, fill with zero (neutral gray) */
|
||||||
|
{
|
||||||
|
JDIMENSION comp_width, comp_height;
|
||||||
|
JDIMENSION blk_y, x_wipe_blocks, y_wipe_blocks;
|
||||||
|
int ci, offset_y;
|
||||||
|
JBLOCKARRAY buffer;
|
||||||
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
|
for (ci = 0; ci < dstinfo->num_components; ci++) {
|
||||||
|
compptr = dstinfo->comp_info + ci;
|
||||||
|
comp_width = drop_width * compptr->h_samp_factor;
|
||||||
|
comp_height = drop_height * compptr->v_samp_factor;
|
||||||
|
x_wipe_blocks = x_crop_offset * compptr->h_samp_factor;
|
||||||
|
y_wipe_blocks = y_crop_offset * compptr->v_samp_factor;
|
||||||
|
for (blk_y = 0; blk_y < comp_height; blk_y += compptr->v_samp_factor) {
|
||||||
|
buffer = (*srcinfo->mem->access_virt_barray)
|
||||||
|
((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y + y_wipe_blocks,
|
||||||
|
(JDIMENSION) compptr->v_samp_factor, TRUE);
|
||||||
|
for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
|
||||||
|
FMEMZERO(buffer[offset_y] + x_wipe_blocks,
|
||||||
|
comp_width * SIZEOF(JBLOCK));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||||
JDIMENSION x_crop_offset,
|
JDIMENSION x_crop_offset,
|
||||||
|
@ -888,7 +998,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
|
||||||
|
|
||||||
/* Determine number of components in output image */
|
/* Determine number of components in output image */
|
||||||
if (info->force_grayscale &&
|
if (info->force_grayscale &&
|
||||||
srcinfo->jpeg_color_space == JCS_YCbCr &&
|
(srcinfo->jpeg_color_space == JCS_YCbCr ||
|
||||||
|
srcinfo->jpeg_color_space == JCS_BG_YCC) &&
|
||||||
srcinfo->num_components == 3)
|
srcinfo->num_components == 3)
|
||||||
/* We'll only process the first component */
|
/* We'll only process the first component */
|
||||||
info->num_components = 1;
|
info->num_components = 1;
|
||||||
|
@ -965,39 +1076,81 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
|
||||||
info->crop_xoffset = 0; /* default to +0 */
|
info->crop_xoffset = 0; /* default to +0 */
|
||||||
if (info->crop_yoffset_set == JCROP_UNSET)
|
if (info->crop_yoffset_set == JCROP_UNSET)
|
||||||
info->crop_yoffset = 0; /* default to +0 */
|
info->crop_yoffset = 0; /* default to +0 */
|
||||||
if (info->crop_xoffset >= info->output_width ||
|
if (info->crop_width_set == JCROP_UNSET) {
|
||||||
info->crop_yoffset >= info->output_height)
|
if (info->crop_xoffset >= info->output_width)
|
||||||
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
if (info->crop_width_set == JCROP_UNSET)
|
|
||||||
info->crop_width = info->output_width - info->crop_xoffset;
|
info->crop_width = info->output_width - info->crop_xoffset;
|
||||||
if (info->crop_height_set == JCROP_UNSET)
|
} else {
|
||||||
|
/* Check for crop extension */
|
||||||
|
if (info->crop_width > info->output_width) {
|
||||||
|
/* Crop extension does not work when transforming! */
|
||||||
|
if (info->transform != JXFORM_NONE ||
|
||||||
|
info->crop_xoffset >= info->crop_width ||
|
||||||
|
info->crop_xoffset > info->crop_width - info->output_width)
|
||||||
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
|
} else {
|
||||||
|
if (info->crop_xoffset >= info->output_width ||
|
||||||
|
info->crop_width <= 0 ||
|
||||||
|
info->crop_xoffset > info->output_width - info->crop_width)
|
||||||
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (info->crop_height_set == JCROP_UNSET) {
|
||||||
|
if (info->crop_yoffset >= info->output_height)
|
||||||
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
info->crop_height = info->output_height - info->crop_yoffset;
|
info->crop_height = info->output_height - info->crop_yoffset;
|
||||||
/* Ensure parameters are valid */
|
} else {
|
||||||
if (info->crop_width <= 0 || info->crop_width > info->output_width ||
|
/* Check for crop extension */
|
||||||
info->crop_height <= 0 || info->crop_height > info->output_height ||
|
if (info->crop_height > info->output_height) {
|
||||||
info->crop_xoffset > info->output_width - info->crop_width ||
|
/* Crop extension does not work when transforming! */
|
||||||
info->crop_yoffset > info->output_height - info->crop_height)
|
if (info->transform != JXFORM_NONE ||
|
||||||
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
info->crop_yoffset >= info->crop_height ||
|
||||||
|
info->crop_yoffset > info->crop_height - info->output_height)
|
||||||
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
|
} else {
|
||||||
|
if (info->crop_yoffset >= info->output_height ||
|
||||||
|
info->crop_height <= 0 ||
|
||||||
|
info->crop_yoffset > info->output_height - info->crop_height)
|
||||||
|
ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
/* Convert negative crop offsets into regular offsets */
|
/* Convert negative crop offsets into regular offsets */
|
||||||
if (info->crop_xoffset_set == JCROP_NEG)
|
if (info->crop_xoffset_set != JCROP_NEG)
|
||||||
xoffset = info->output_width - info->crop_width - info->crop_xoffset;
|
|
||||||
else
|
|
||||||
xoffset = info->crop_xoffset;
|
xoffset = info->crop_xoffset;
|
||||||
if (info->crop_yoffset_set == JCROP_NEG)
|
else if (info->crop_width > info->output_width) /* crop extension */
|
||||||
yoffset = info->output_height - info->crop_height - info->crop_yoffset;
|
xoffset = info->crop_width - info->output_width - info->crop_xoffset;
|
||||||
else
|
else
|
||||||
|
xoffset = info->output_width - info->crop_width - info->crop_xoffset;
|
||||||
|
if (info->crop_yoffset_set != JCROP_NEG)
|
||||||
yoffset = info->crop_yoffset;
|
yoffset = info->crop_yoffset;
|
||||||
|
else if (info->crop_height > info->output_height) /* crop extension */
|
||||||
|
yoffset = info->crop_height - info->output_height - info->crop_yoffset;
|
||||||
|
else
|
||||||
|
yoffset = info->output_height - info->crop_height - info->crop_yoffset;
|
||||||
/* Now adjust so that upper left corner falls at an iMCU boundary */
|
/* Now adjust so that upper left corner falls at an iMCU boundary */
|
||||||
if (info->crop_width_set == JCROP_FORCE)
|
if (info->transform == JXFORM_WIPE) {
|
||||||
info->output_width = info->crop_width;
|
/* Ensure the effective wipe region will cover the requested */
|
||||||
else
|
info->drop_width = (JDIMENSION) jdiv_round_up
|
||||||
info->output_width =
|
((long) (info->crop_width + (xoffset % info->iMCU_sample_width)),
|
||||||
info->crop_width + (xoffset % info->iMCU_sample_width);
|
(long) info->iMCU_sample_width);
|
||||||
if (info->crop_height_set == JCROP_FORCE)
|
info->drop_height = (JDIMENSION) jdiv_round_up
|
||||||
info->output_height = info->crop_height;
|
((long) (info->crop_height + (yoffset % info->iMCU_sample_height)),
|
||||||
else
|
(long) info->iMCU_sample_height);
|
||||||
info->output_height =
|
} else {
|
||||||
info->crop_height + (yoffset % info->iMCU_sample_height);
|
/* Ensure the effective crop region will cover the requested */
|
||||||
|
if (info->crop_width_set == JCROP_FORCE ||
|
||||||
|
info->crop_width > info->output_width)
|
||||||
|
info->output_width = info->crop_width;
|
||||||
|
else
|
||||||
|
info->output_width =
|
||||||
|
info->crop_width + (xoffset % info->iMCU_sample_width);
|
||||||
|
if (info->crop_height_set == JCROP_FORCE ||
|
||||||
|
info->crop_height > info->output_height)
|
||||||
|
info->output_height = info->crop_height;
|
||||||
|
else
|
||||||
|
info->output_height =
|
||||||
|
info->crop_height + (yoffset % info->iMCU_sample_height);
|
||||||
|
}
|
||||||
/* Save x/y offsets measured in iMCUs */
|
/* Save x/y offsets measured in iMCUs */
|
||||||
info->x_crop_offset = xoffset / info->iMCU_sample_width;
|
info->x_crop_offset = xoffset / info->iMCU_sample_width;
|
||||||
info->y_crop_offset = yoffset / info->iMCU_sample_height;
|
info->y_crop_offset = yoffset / info->iMCU_sample_height;
|
||||||
|
@ -1013,7 +1166,9 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
|
||||||
transpose_it = FALSE;
|
transpose_it = FALSE;
|
||||||
switch (info->transform) {
|
switch (info->transform) {
|
||||||
case JXFORM_NONE:
|
case JXFORM_NONE:
|
||||||
if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
|
if (info->x_crop_offset != 0 || info->y_crop_offset != 0 ||
|
||||||
|
info->output_width > srcinfo->output_width ||
|
||||||
|
info->output_height > srcinfo->output_height)
|
||||||
need_workspace = TRUE;
|
need_workspace = TRUE;
|
||||||
/* No workspace needed if neither cropping nor transforming */
|
/* No workspace needed if neither cropping nor transforming */
|
||||||
break;
|
break;
|
||||||
|
@ -1067,6 +1222,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
|
||||||
need_workspace = TRUE;
|
need_workspace = TRUE;
|
||||||
transpose_it = TRUE;
|
transpose_it = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case JXFORM_WIPE:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate workspace if needed.
|
/* Allocate workspace if needed.
|
||||||
|
@ -1076,7 +1233,7 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
|
||||||
if (need_workspace) {
|
if (need_workspace) {
|
||||||
coef_arrays = (jvirt_barray_ptr *)
|
coef_arrays = (jvirt_barray_ptr *)
|
||||||
(*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,
|
(*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,
|
||||||
SIZEOF(jvirt_barray_ptr) * info->num_components);
|
SIZEOF(jvirt_barray_ptr) * info->num_components);
|
||||||
width_in_iMCUs = (JDIMENSION)
|
width_in_iMCUs = (JDIMENSION)
|
||||||
jdiv_round_up((long) info->output_width,
|
jdiv_round_up((long) info->output_width,
|
||||||
(long) info->iMCU_sample_width);
|
(long) info->iMCU_sample_width);
|
||||||
|
@ -1327,12 +1484,13 @@ jtransform_adjust_parameters (j_decompress_ptr srcinfo,
|
||||||
{
|
{
|
||||||
/* If force-to-grayscale is requested, adjust destination parameters */
|
/* If force-to-grayscale is requested, adjust destination parameters */
|
||||||
if (info->force_grayscale) {
|
if (info->force_grayscale) {
|
||||||
/* First, ensure we have YCbCr or grayscale data, and that the source's
|
/* First, ensure we have YCC or grayscale data, and that the source's
|
||||||
* Y channel is full resolution. (No reasonable person would make Y
|
* Y channel is full resolution. (No reasonable person would make Y
|
||||||
* be less than full resolution, so actually coping with that case
|
* be less than full resolution, so actually coping with that case
|
||||||
* isn't worth extra code space. But we check it to avoid crashing.)
|
* isn't worth extra code space. But we check it to avoid crashing.)
|
||||||
*/
|
*/
|
||||||
if (((dstinfo->jpeg_color_space == JCS_YCbCr &&
|
if ((((dstinfo->jpeg_color_space == JCS_YCbCr ||
|
||||||
|
dstinfo->jpeg_color_space == JCS_BG_YCC) &&
|
||||||
dstinfo->num_components == 3) ||
|
dstinfo->num_components == 3) ||
|
||||||
(dstinfo->jpeg_color_space == JCS_GRAYSCALE &&
|
(dstinfo->jpeg_color_space == JCS_GRAYSCALE &&
|
||||||
dstinfo->num_components == 1)) &&
|
dstinfo->num_components == 1)) &&
|
||||||
|
@ -1427,7 +1585,11 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
|
||||||
*/
|
*/
|
||||||
switch (info->transform) {
|
switch (info->transform) {
|
||||||
case JXFORM_NONE:
|
case JXFORM_NONE:
|
||||||
if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
|
if (info->output_width > srcinfo->output_width ||
|
||||||
|
info->output_height > srcinfo->output_height)
|
||||||
|
do_crop_ext(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
||||||
|
src_coef_arrays, dst_coef_arrays);
|
||||||
|
else if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
|
||||||
do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
||||||
src_coef_arrays, dst_coef_arrays);
|
src_coef_arrays, dst_coef_arrays);
|
||||||
break;
|
break;
|
||||||
|
@ -1463,6 +1625,10 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
|
||||||
do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
||||||
src_coef_arrays, dst_coef_arrays);
|
src_coef_arrays, dst_coef_arrays);
|
||||||
break;
|
break;
|
||||||
|
case JXFORM_WIPE:
|
||||||
|
do_wipe(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
|
||||||
|
src_coef_arrays, info->drop_width, info->drop_height);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* transupp.h
|
* transupp.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1997-2013, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
|
@ -51,14 +51,17 @@
|
||||||
*
|
*
|
||||||
* We also offer a lossless-crop option, which discards data outside a given
|
* We also offer a lossless-crop option, which discards data outside a given
|
||||||
* image region but losslessly preserves what is inside. Like the rotate and
|
* image region but losslessly preserves what is inside. Like the rotate and
|
||||||
* flip transforms, lossless crop is restricted by the JPEG format: the upper
|
* flip transforms, lossless crop is restricted by the current JPEG format: the
|
||||||
* left corner of the selected region must fall on an iMCU boundary. If this
|
* upper left corner of the selected region must fall on an iMCU boundary. If
|
||||||
* does not hold for the given crop parameters, we silently move the upper left
|
* this does not hold for the given crop parameters, we silently move the upper
|
||||||
* corner up and/or left to make it so, simultaneously increasing the region
|
* left corner up and/or left to make it so, simultaneously increasing the
|
||||||
* dimensions to keep the lower right crop corner unchanged. (Thus, the
|
* region dimensions to keep the lower right crop corner unchanged. (Thus, the
|
||||||
* output image covers at least the requested region, but may cover more.)
|
* output image covers at least the requested region, but may cover more.)
|
||||||
* The adjustment of the region dimensions may be optionally disabled.
|
* The adjustment of the region dimensions may be optionally disabled.
|
||||||
*
|
*
|
||||||
|
* A complementary lossless-wipe option is provided to discard (gray out) data
|
||||||
|
* inside a given image region while losslessly preserving what is outside.
|
||||||
|
*
|
||||||
* We also provide a lossless-resize option, which is kind of a lossless-crop
|
* We also provide a lossless-resize option, which is kind of a lossless-crop
|
||||||
* operation in the DCT coefficient block domain - it discards higher-order
|
* operation in the DCT coefficient block domain - it discards higher-order
|
||||||
* coefficients and losslessly preserves lower-order coefficients of a
|
* coefficients and losslessly preserves lower-order coefficients of a
|
||||||
|
@ -102,7 +105,8 @@ typedef enum {
|
||||||
JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
||||||
JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
||||||
JXFORM_ROT_180, /* 180-degree rotation */
|
JXFORM_ROT_180, /* 180-degree rotation */
|
||||||
JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
|
JXFORM_ROT_270, /* 270-degree clockwise (or 90 ccw) */
|
||||||
|
JXFORM_WIPE /* wipe */
|
||||||
} JXFORM_CODE;
|
} JXFORM_CODE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -130,7 +134,7 @@ typedef struct {
|
||||||
boolean perfect; /* if TRUE, fail if partial MCUs are requested */
|
boolean perfect; /* if TRUE, fail if partial MCUs are requested */
|
||||||
boolean trim; /* if TRUE, trim partial MCUs as needed */
|
boolean trim; /* if TRUE, trim partial MCUs as needed */
|
||||||
boolean force_grayscale; /* if TRUE, convert color image to grayscale */
|
boolean force_grayscale; /* if TRUE, convert color image to grayscale */
|
||||||
boolean crop; /* if TRUE, crop source image */
|
boolean crop; /* if TRUE, crop or wipe source image */
|
||||||
|
|
||||||
/* Crop parameters: application need not set these unless crop is TRUE.
|
/* Crop parameters: application need not set these unless crop is TRUE.
|
||||||
* These can be filled in by jtransform_parse_crop_spec().
|
* These can be filled in by jtransform_parse_crop_spec().
|
||||||
|
@ -151,6 +155,8 @@ typedef struct {
|
||||||
JDIMENSION output_height;
|
JDIMENSION output_height;
|
||||||
JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
|
JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
|
||||||
JDIMENSION y_crop_offset;
|
JDIMENSION y_crop_offset;
|
||||||
|
JDIMENSION drop_width; /* drop/wipe dimensions measured in iMCUs */
|
||||||
|
JDIMENSION drop_height;
|
||||||
int iMCU_sample_width; /* destination iMCU size */
|
int iMCU_sample_width; /* destination iMCU size */
|
||||||
int iMCU_sample_height;
|
int iMCU_sample_height;
|
||||||
} jpeg_transform_info;
|
} jpeg_transform_info;
|
||||||
|
|
Loading…
Reference in a new issue