1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if !defined(_FX_JPEG_TURBO_)
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * jdmerge.c
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (C) 1994-1996, Thomas G. Lane.
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file is part of the Independent JPEG Group's software.
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the accompanying README file.
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file contains code for merged upsampling/color conversion.
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file combines functions from jdsample.c and jdcolor.c;
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * read those files first to understand what's going on.
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * When the chroma components are to be upsampled by simple replication
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (ie, box filtering), we can save some work in color conversion by
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * calculating all the output pixels corresponding to a pair of chroma
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * samples at one time.  In the conversion equations
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	R = Y           + K1 * Cr
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	G = Y + K2 * Cb + K3 * Cr
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	B = Y + K4 * Cb
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * only the Y term varies among the group of pixels corresponding to a pair
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * of chroma samples, so the rest of the terms can be calculated just once.
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * At typical sampling ratios, this eliminates half or three-quarters of the
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * multiplications needed for color conversion.
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This file currently provides implementations for the following cases:
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	YCbCr => RGB color conversion only.
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	Sampling ratios of 2h1v or 2h2v.
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	No scaling needed at upsample time.
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *	Corner-aligned (non-CCIR601) sampling alignment.
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Other special cases could be added, but in most applications these are
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the only common cases.  (For uncommon cases we fall back on the more
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * general code in jdsample.c and jdcolor.c.)
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define JPEG_INTERNALS
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jinclude.h"
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "jpeglib.h"
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef UPSAMPLE_MERGING_SUPPORTED
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _FX_MANAGED_CODE_
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define my_upsampler	my_upsampler_m
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Private subobject */
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef struct {
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  struct jpeg_upsampler pub;	/* public fields */
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Pointer to routine to do actual upsampling/conversion of one row group */
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			   JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			   JSAMPARRAY output_buf));
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Private state for YCC->RGB conversion */
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Cr_r_tab;		/* => table for Cr to R conversion */
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Cb_b_tab;		/* => table for Cb to B conversion */
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Cr_g_tab;		/* => table for Cr to G conversion */
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Cb_g_tab;		/* => table for Cb to G conversion */
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* For 2:1 vertical sampling, we produce two output rows at a time.
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   * We need a "spare" row buffer to hold the second output row if the
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   * application provides just a one-row buffer; we also use the spare
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   * to discard the dummy last row if the image height is odd.
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   */
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JSAMPROW spare_row;
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  boolean spare_full;		/* T if spare buffer is occupied */
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JDIMENSION out_row_width;	/* samples per output row */
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JDIMENSION rows_to_go;	/* counts rows remaining in image */
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} my_upsampler;
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtypedef my_upsampler * my_upsample_ptr;
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define SCALEBITS	16	/* speediest right-shift on some machines */
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Initialize tables for YCC->RGB colorspace conversion.
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This is taken directly from jdcolor.c; see that file for more info.
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovLOCAL(void)
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovbuild_ycc_rgb_table (j_decompress_ptr cinfo)
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int i;
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 x;
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  SHIFT_TEMPS
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->Cr_r_tab = (int *)
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(int));
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->Cb_b_tab = (int *)
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(int));
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->Cr_g_tab = (INT32 *)
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(INT32));
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->Cb_g_tab = (INT32 *)
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				(MAXJSAMPLE+1) * SIZEOF(INT32));
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Cr=>R value is nearest int to 1.40200 * x */
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->Cr_r_tab[i] = (int)
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Cb=>B value is nearest int to 1.77200 * x */
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->Cb_b_tab[i] = (int)
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Cr=>G value is scaled-up -0.71414 * x */
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Cb=>G value is scaled-up -0.34414 * x */
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* We also add in ONE_HALF so that need not do it in inner loop */
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Initialize for an upsampling pass.
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstart_pass_merged_upsample (j_decompress_ptr cinfo)
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Mark the spare buffer empty */
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->spare_full = FALSE;
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Initialize total-height counter for detecting bottom of image */
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->rows_to_go = cinfo->output_height;
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Control routine to do upsampling (and color conversion).
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The control routine just handles the row buffering considerations.
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovmerged_2v_upsample (j_decompress_ptr cinfo,
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JDIMENSION in_row_groups_avail,
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JDIMENSION out_rows_avail)
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 2:1 vertical sampling case: may need a spare row. */
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JSAMPROW work_ptrs[2];
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JDIMENSION num_rows;		/* number of rows returned to caller */
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (upsample->spare_full) {
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* If we have a spare row saved from a previous cycle, just return it. */
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		      1, upsample->out_row_width);
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    num_rows = 1;
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->spare_full = FALSE;
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  } else {
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Figure number of rows to return to caller. */
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    num_rows = 2;
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Not more than the distance to the end of the image. */
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (num_rows > upsample->rows_to_go)
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      num_rows = upsample->rows_to_go;
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* And not more than what the client can accept: */
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    out_rows_avail -= *out_row_ctr;
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (num_rows > out_rows_avail)
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      num_rows = out_rows_avail;
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Create output pointer array for upsampler. */
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    work_ptrs[0] = output_buf[*out_row_ctr];
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (num_rows > 1) {
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      work_ptrs[1] = output_buf[*out_row_ctr + 1];
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      work_ptrs[1] = upsample->spare_row;
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      upsample->spare_full = TRUE;
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Now do the upsampling. */
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Adjust counts */
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  *out_row_ctr += num_rows;
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->rows_to_go -= num_rows;
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* When the buffer is emptied, declare this input row group consumed */
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (! upsample->spare_full)
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*in_row_group_ctr)++;
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovmerged_1v_upsample (j_decompress_ptr cinfo,
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JDIMENSION in_row_groups_avail,
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		    JDIMENSION out_rows_avail)
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* 1:1 vertical sampling case: much easier, never need a spare row. */
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Just do the upsampling. */
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov			 output_buf + *out_row_ctr);
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Adjust counts */
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  (*out_row_ctr)++;
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  (*in_row_group_ctr)++;
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * These are the routines invoked by the control routines to do
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the actual upsampling/conversion.  One row group is processed per call.
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Note: since we may be writing directly into application-supplied buffers,
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * we have to be honest about the output width; we can't assume the buffer
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * has been rounded up to an even width.
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovh2v1_merged_upsample (j_decompress_ptr cinfo,
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		      JSAMPARRAY output_buf)
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register int y, cred, cgreen, cblue;
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int cb, cr;
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register JSAMPROW outptr;
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JSAMPROW inptr0, inptr1, inptr2;
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JDIMENSION col;
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* copy these pointers into registers if possible */
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register JSAMPLE * range_limit = cinfo->sample_range_limit;
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Crrtab = upsample->Cr_r_tab;
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Cbbtab = upsample->Cb_b_tab;
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Crgtab = upsample->Cr_g_tab;
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Cbgtab = upsample->Cb_g_tab;
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  SHIFT_TEMPS
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr0 = input_buf[0][in_row_group_ctr];
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr1 = input_buf[1][in_row_group_ctr];
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr2 = input_buf[2][in_row_group_ctr];
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  outptr = output_buf[0];
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Loop for each pair of output pixels */
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  for (col = cinfo->output_width >> 1; col > 0; col--) {
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Do the chroma part of the calculation */
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cb = GETJSAMPLE(*inptr1++);
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cr = GETJSAMPLE(*inptr2++);
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cred = Crrtab[cr];
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cblue = Cbbtab[cb];
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Fetch 2 Y values and emit 2 pixels */
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr0++);
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr += RGB_PIXELSIZE;
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr0++);
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr += RGB_PIXELSIZE;
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* If image width is odd, do the last output column separately */
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (cinfo->output_width & 1) {
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cb = GETJSAMPLE(*inptr1);
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cr = GETJSAMPLE(*inptr2);
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cred = Crrtab[cr];
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cblue = Cbbtab[cb];
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr0);
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_RED] =   range_limit[y + cred];
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_GREEN] = range_limit[y + cgreen];
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr[RGB_BLUE] =  range_limit[y + cblue];
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovMETHODDEF(void)
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovh2v2_merged_upsample (j_decompress_ptr cinfo,
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		      JSAMPARRAY output_buf)
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register int y, cred, cgreen, cblue;
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int cb, cr;
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register JSAMPROW outptr0, outptr1;
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JSAMPROW inptr00, inptr01, inptr1, inptr2;
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  JDIMENSION col;
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* copy these pointers into registers if possible */
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  register JSAMPLE * range_limit = cinfo->sample_range_limit;
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Crrtab = upsample->Cr_r_tab;
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  int * Cbbtab = upsample->Cb_b_tab;
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Crgtab = upsample->Cr_g_tab;
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  INT32 * Cbgtab = upsample->Cb_g_tab;
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  SHIFT_TEMPS
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr00 = input_buf[0][in_row_group_ctr*2];
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr1 = input_buf[1][in_row_group_ctr];
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  inptr2 = input_buf[2][in_row_group_ctr];
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  outptr0 = output_buf[0];
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  outptr1 = output_buf[1];
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* Loop for each group of output pixels */
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  for (col = cinfo->output_width >> 1; col > 0; col--) {
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Do the chroma part of the calculation */
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cb = GETJSAMPLE(*inptr1++);
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cr = GETJSAMPLE(*inptr2++);
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cred = Crrtab[cr];
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cblue = Cbbtab[cb];
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Fetch 4 Y values and emit 4 pixels */
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr00++);
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0 += RGB_PIXELSIZE;
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr00++);
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0 += RGB_PIXELSIZE;
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr01++);
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1 += RGB_PIXELSIZE;
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr01++);
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1 += RGB_PIXELSIZE;
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* If image width is odd, do the last output column separately */
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (cinfo->output_width & 1) {
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cb = GETJSAMPLE(*inptr1);
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cr = GETJSAMPLE(*inptr2);
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cred = Crrtab[cr];
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    cblue = Cbbtab[cb];
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr00);
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_RED] =   range_limit[y + cred];
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_GREEN] = range_limit[y + cgreen];
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr0[RGB_BLUE] =  range_limit[y + cblue];
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    y  = GETJSAMPLE(*inptr01);
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_RED] =   range_limit[y + cred];
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_GREEN] = range_limit[y + cgreen];
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    outptr1[RGB_BLUE] =  range_limit[y + cblue];
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/*
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Module initialization routine for merged upsampling/color conversion.
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * NB: this is called under the conditions determined by use_merged_upsample()
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * in jdmaster.c.  That routine MUST correspond to the actual capabilities
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * of this module; no safety checks are made here.
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovGLOBAL(void)
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovjinit_merged_upsampler (j_decompress_ptr cinfo)
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  my_upsample_ptr upsample;
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample = (my_upsample_ptr)
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov				SIZEOF(my_upsampler));
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  cinfo->upsample = (struct jpeg_upsampler *) upsample;
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->pub.start_pass = start_pass_merged_upsample;
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->pub.need_context_rows = FALSE;
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  if (cinfo->max_v_samp_factor == 2) {
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->pub.upsample = merged_2v_upsample;
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->upmethod = h2v2_merged_upsample;
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* Allocate a spare row buffer */
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->spare_row = (JSAMPROW)
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov		(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  } else {
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->pub.upsample = merged_1v_upsample;
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->upmethod = h2v1_merged_upsample;
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    /* No spare row needed */
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    upsample->spare_row = NULL;
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  }
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  build_ycc_rgb_table(cinfo);
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* UPSAMPLE_MERGING_SUPPORTED */
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif //_FX_JPEG_TURBO_
407