JCSAMPLE.c
上传用户:qiutianh
上传日期:2022-08-08
资源大小:939k
文件大小:20k
源码类别:

图形图象

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////
  2. //
  3. // Note : this file is included as part of the Smaller Animals Software
  4. // JpegFile package. Though this file has not been modified from it's 
  5. // original IJG 6a form, it is not the responsibility on the Independent
  6. // JPEG Group to answer questions regarding this code.
  7. //
  8. // Any questions you have about this code should be addressed to :
  9. //
  10. // CHRISDL@PAGESZ.NET - the distributor of this package.
  11. //
  12. // Remember, by including this code in the JpegFile package, Smaller 
  13. // Animals Software assumes all responsibilities for answering questions
  14. // about it. If we (SA Software) can't answer your questions ourselves, we 
  15. // will direct you to people who can.
  16. //
  17. // Thanks, CDL.
  18. //
  19. ////////////////////////////////////////////////////////////////////////
  20. /*
  21.  * jcsample.c
  22.  *
  23.  * Copyright (C) 1991-1996, Thomas G. Lane.
  24.  * This file is part of the Independent JPEG Group's software.
  25.  * For conditions of distribution and use, see the accompanying README file.
  26.  *
  27.  * This file contains downsampling routines.
  28.  *
  29.  * Downsampling input data is counted in "row groups".  A row group
  30.  * is defined to be max_v_samp_factor pixel rows of each component,
  31.  * from which the downsampler produces v_samp_factor sample rows.
  32.  * A single row group is processed in each call to the downsampler module.
  33.  *
  34.  * The downsampler is responsible for edge-expansion of its output data
  35.  * to fill an integral number of DCT blocks horizontally.  The source buffer
  36.  * may be modified if it is helpful for this purpose (the source buffer is
  37.  * allocated wide enough to correspond to the desired output width).
  38.  * The caller (the prep controller) is responsible for vertical padding.
  39.  *
  40.  * The downsampler may request "context rows" by setting need_context_rows
  41.  * during startup.  In this case, the input arrays will contain at least
  42.  * one row group's worth of pixels above and below the passed-in data;
  43.  * the caller will create dummy rows at image top and bottom by replicating
  44.  * the first or last real pixel row.
  45.  *
  46.  * An excellent reference for image resampling is
  47.  *   Digital Image Warping, George Wolberg, 1990.
  48.  *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
  49.  *
  50.  * The downsampling algorithm used here is a simple average of the source
  51.  * pixels covered by the output pixel.  The hi-falutin sampling literature
  52.  * refers to this as a "box filter".  In general the characteristics of a box
  53.  * filter are not very good, but for the specific cases we normally use (1:1
  54.  * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
  55.  * nearly so bad.  If you intend to use other sampling ratios, you'd be well
  56.  * advised to improve this code.
  57.  *
  58.  * A simple input-smoothing capability is provided.  This is mainly intended
  59.  * for cleaning up color-dithered GIF input files (if you find it inadequate,
  60.  * we suggest using an external filtering program such as pnmconvol).  When
  61.  * enabled, each input pixel P is replaced by a weighted sum of itself and its
  62.  * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,
  63.  * where SF = (smoothing_factor / 1024).
  64.  * Currently, smoothing is only supported for 2h2v sampling factors.
  65.  */
  66. #define JPEG_INTERNALS
  67. #include "jinclude.h"
  68. #include "jpeglib.h"
  69. /* Pointer to routine to downsample a single component */
  70. typedef JMETHOD(void, downsample1_ptr,
  71. (j_compress_ptr cinfo, jpeg_component_info * compptr,
  72.  JSAMPARRAY input_data, JSAMPARRAY output_data));
  73. /* Private subobject */
  74. typedef struct {
  75.   struct jpeg_downsampler pub; /* public fields */
  76.   /* Downsampling method pointers, one per component */
  77.   downsample1_ptr methods[MAX_COMPONENTS];
  78. } my_downsampler;
  79. typedef my_downsampler * my_downsample_ptr;
  80. /*
  81.  * Initialize for a downsampling pass.
  82.  */
  83. METHODDEF(void)
  84. start_pass_downsample (j_compress_ptr cinfo)
  85. {
  86.   /* no work for now */
  87. }
  88. /*
  89.  * Expand a component horizontally from width input_cols to width output_cols,
  90.  * by duplicating the rightmost samples.
  91.  */
  92. LOCAL(void)
  93. expand_right_edge (JSAMPARRAY image_data, int num_rows,
  94.    JDIMENSION input_cols, JDIMENSION output_cols)
  95. {
  96.   register JSAMPROW ptr;
  97.   register JSAMPLE pixval;
  98.   register int count;
  99.   int row;
  100.   int numcols = (int) (output_cols - input_cols);
  101.   if (numcols > 0) {
  102.     for (row = 0; row < num_rows; row++) {
  103.       ptr = image_data[row] + input_cols;
  104.       pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
  105.       for (count = numcols; count > 0; count--)
  106. *ptr++ = pixval;
  107.     }
  108.   }
  109. }
  110. /*
  111.  * Do downsampling for a whole row group (all components).
  112.  *
  113.  * In this version we simply downsample each component independently.
  114.  */
  115. METHODDEF(void)
  116. sep_downsample (j_compress_ptr cinfo,
  117. JSAMPIMAGE input_buf, JDIMENSION in_row_index,
  118. JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
  119. {
  120.   my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
  121.   int ci;
  122.   jpeg_component_info * compptr;
  123.   JSAMPARRAY in_ptr, out_ptr;
  124.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  125.        ci++, compptr++) {
  126.     in_ptr = input_buf[ci] + in_row_index;
  127.     out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
  128.     (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
  129.   }
  130. }
  131. /*
  132.  * Downsample pixel values of a single component.
  133.  * One row group is processed per call.
  134.  * This version handles arbitrary integral sampling ratios, without smoothing.
  135.  * Note that this version is not actually used for customary sampling ratios.
  136.  */
  137. METHODDEF(void)
  138. int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
  139. JSAMPARRAY input_data, JSAMPARRAY output_data)
  140. {
  141.   int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
  142.   JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */
  143.   JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
  144.   JSAMPROW inptr, outptr;
  145.   long outvalue;
  146.   h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
  147.   v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
  148.   numpix = h_expand * v_expand;
  149.   numpix2 = numpix/2;
  150.   /* Expand input data enough to let all the output samples be generated
  151.    * by the standard loop.  Special-casing padded output would be more
  152.    * efficient.
  153.    */
  154.   expand_right_edge(input_data, cinfo->max_v_samp_factor,
  155.     cinfo->image_width, output_cols * h_expand);
  156.   inrow = 0;
  157.   for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
  158.     outptr = output_data[outrow];
  159.     for (outcol = 0, outcol_h = 0; outcol < output_cols;
  160.  outcol++, outcol_h += h_expand) {
  161.       outvalue = 0;
  162.       for (v = 0; v < v_expand; v++) {
  163. inptr = input_data[inrow+v] + outcol_h;
  164. for (h = 0; h < h_expand; h++) {
  165.   outvalue += (long) GETJSAMPLE(*inptr++);
  166. }
  167.       }
  168.       *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
  169.     }
  170.     inrow += v_expand;
  171.   }
  172. }
  173. /*
  174.  * Downsample pixel values of a single component.
  175.  * This version handles the special case of a full-size component,
  176.  * without smoothing.
  177.  */
  178. METHODDEF(void)
  179. fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
  180.      JSAMPARRAY input_data, JSAMPARRAY output_data)
  181. {
  182.   /* Copy the data */
  183.   jcopy_sample_rows(input_data, 0, output_data, 0,
  184.     cinfo->max_v_samp_factor, cinfo->image_width);
  185.   /* Edge-expand */
  186.   expand_right_edge(output_data, cinfo->max_v_samp_factor,
  187.     cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
  188. }
  189. /*
  190.  * Downsample pixel values of a single component.
  191.  * This version handles the common case of 2:1 horizontal and 1:1 vertical,
  192.  * without smoothing.
  193.  *
  194.  * A note about the "bias" calculations: when rounding fractional values to
  195.  * integer, we do not want to always round 0.5 up to the next integer.
  196.  * If we did that, we'd introduce a noticeable bias towards larger values.
  197.  * Instead, this code is arranged so that 0.5 will be rounded up or down at
  198.  * alternate pixel locations (a simple ordered dither pattern).
  199.  */
  200. METHODDEF(void)
  201. h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
  202.  JSAMPARRAY input_data, JSAMPARRAY output_data)
  203. {
  204.   int outrow;
  205.   JDIMENSION outcol;
  206.   JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
  207.   register JSAMPROW inptr, outptr;
  208.   register int bias;
  209.   /* Expand input data enough to let all the output samples be generated
  210.    * by the standard loop.  Special-casing padded output would be more
  211.    * efficient.
  212.    */
  213.   expand_right_edge(input_data, cinfo->max_v_samp_factor,
  214.     cinfo->image_width, output_cols * 2);
  215.   for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
  216.     outptr = output_data[outrow];
  217.     inptr = input_data[outrow];
  218.     bias = 0; /* bias = 0,1,0,1,... for successive samples */
  219.     for (outcol = 0; outcol < output_cols; outcol++) {
  220.       *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
  221.       + bias) >> 1);
  222.       bias ^= 1; /* 0=>1, 1=>0 */
  223.       inptr += 2;
  224.     }
  225.   }
  226. }
  227. /*
  228.  * Downsample pixel values of a single component.
  229.  * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
  230.  * without smoothing.
  231.  */
  232. METHODDEF(void)
  233. h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
  234.  JSAMPARRAY input_data, JSAMPARRAY output_data)
  235. {
  236.   int inrow, outrow;
  237.   JDIMENSION outcol;
  238.   JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
  239.   register JSAMPROW inptr0, inptr1, outptr;
  240.   register int bias;
  241.   /* Expand input data enough to let all the output samples be generated
  242.    * by the standard loop.  Special-casing padded output would be more
  243.    * efficient.
  244.    */
  245.   expand_right_edge(input_data, cinfo->max_v_samp_factor,
  246.     cinfo->image_width, output_cols * 2);
  247.   inrow = 0;
  248.   for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
  249.     outptr = output_data[outrow];
  250.     inptr0 = input_data[inrow];
  251.     inptr1 = input_data[inrow+1];
  252.     bias = 1; /* bias = 1,2,1,2,... for successive samples */
  253.     for (outcol = 0; outcol < output_cols; outcol++) {
  254.       *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
  255.       GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
  256.       + bias) >> 2);
  257.       bias ^= 3; /* 1=>2, 2=>1 */
  258.       inptr0 += 2; inptr1 += 2;
  259.     }
  260.     inrow += 2;
  261.   }
  262. }
  263. #ifdef INPUT_SMOOTHING_SUPPORTED
  264. /*
  265.  * Downsample pixel values of a single component.
  266.  * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
  267.  * with smoothing.  One row of context is required.
  268.  */
  269. METHODDEF(void)
  270. h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
  271. JSAMPARRAY input_data, JSAMPARRAY output_data)
  272. {
  273.   int inrow, outrow;
  274.   JDIMENSION colctr;
  275.   JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
  276.   register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
  277.   long membersum, neighsum, memberscale, neighscale;
  278.   /* Expand input data enough to let all the output samples be generated
  279.    * by the standard loop.  Special-casing padded output would be more
  280.    * efficient.
  281.    */
  282.   expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
  283.     cinfo->image_width, output_cols * 2);
  284.   /* We don't bother to form the individual "smoothed" input pixel values;
  285.    * we can directly compute the output which is the average of the four
  286.    * smoothed values.  Each of the four member pixels contributes a fraction
  287.    * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
  288.    * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
  289.    * output.  The four corner-adjacent neighbor pixels contribute a fraction
  290.    * SF to just one smoothed pixel, or SF/4 to the final output; while the
  291.    * eight edge-adjacent neighbors contribute SF to each of two smoothed
  292.    * pixels, or SF/2 overall.  In order to use integer arithmetic, these
  293.    * factors are scaled by 2^16 = 65536.
  294.    * Also recall that SF = smoothing_factor / 1024.
  295.    */
  296.   memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
  297.   neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
  298.   inrow = 0;
  299.   for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
  300.     outptr = output_data[outrow];
  301.     inptr0 = input_data[inrow];
  302.     inptr1 = input_data[inrow+1];
  303.     above_ptr = input_data[inrow-1];
  304.     below_ptr = input_data[inrow+2];
  305.     /* Special case for first column: pretend column -1 is same as column 0 */
  306.     membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
  307. GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
  308.     neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
  309.        GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
  310.        GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
  311.        GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
  312.     neighsum += neighsum;
  313.     neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
  314. GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
  315.     membersum = membersum * memberscale + neighsum * neighscale;
  316.     *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
  317.     inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
  318.     for (colctr = output_cols - 2; colctr > 0; colctr--) {
  319.       /* sum of pixels directly mapped to this output element */
  320.       membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
  321.   GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
  322.       /* sum of edge-neighbor pixels */
  323.       neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
  324.  GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
  325.  GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
  326.  GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
  327.       /* The edge-neighbors count twice as much as corner-neighbors */
  328.       neighsum += neighsum;
  329.       /* Add in the corner-neighbors */
  330.       neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
  331.   GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
  332.       /* form final output scaled up by 2^16 */
  333.       membersum = membersum * memberscale + neighsum * neighscale;
  334.       /* round, descale and output it */
  335.       *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
  336.       inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
  337.     }
  338.     /* Special case for last column */
  339.     membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
  340. GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
  341.     neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
  342.        GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
  343.        GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
  344.        GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
  345.     neighsum += neighsum;
  346.     neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
  347. GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
  348.     membersum = membersum * memberscale + neighsum * neighscale;
  349.     *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
  350.     inrow += 2;
  351.   }
  352. }
  353. /*
  354.  * Downsample pixel values of a single component.
  355.  * This version handles the special case of a full-size component,
  356.  * with smoothing.  One row of context is required.
  357.  */
  358. METHODDEF(void)
  359. fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
  360.     JSAMPARRAY input_data, JSAMPARRAY output_data)
  361. {
  362.   int outrow;
  363.   JDIMENSION colctr;
  364.   JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
  365.   register JSAMPROW inptr, above_ptr, below_ptr, outptr;
  366.   long membersum, neighsum, memberscale, neighscale;
  367.   int colsum, lastcolsum, nextcolsum;
  368.   /* Expand input data enough to let all the output samples be generated
  369.    * by the standard loop.  Special-casing padded output would be more
  370.    * efficient.
  371.    */
  372.   expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
  373.     cinfo->image_width, output_cols);
  374.   /* Each of the eight neighbor pixels contributes a fraction SF to the
  375.    * smoothed pixel, while the main pixel contributes (1-8*SF).  In order
  376.    * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
  377.    * Also recall that SF = smoothing_factor / 1024.
  378.    */
  379.   memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
  380.   neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
  381.   for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
  382.     outptr = output_data[outrow];
  383.     inptr = input_data[outrow];
  384.     above_ptr = input_data[outrow-1];
  385.     below_ptr = input_data[outrow+1];
  386.     /* Special case for first column */
  387.     colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
  388.      GETJSAMPLE(*inptr);
  389.     membersum = GETJSAMPLE(*inptr++);
  390.     nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
  391.  GETJSAMPLE(*inptr);
  392.     neighsum = colsum + (colsum - membersum) + nextcolsum;
  393.     membersum = membersum * memberscale + neighsum * neighscale;
  394.     *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
  395.     lastcolsum = colsum; colsum = nextcolsum;
  396.     for (colctr = output_cols - 2; colctr > 0; colctr--) {
  397.       membersum = GETJSAMPLE(*inptr++);
  398.       above_ptr++; below_ptr++;
  399.       nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
  400.    GETJSAMPLE(*inptr);
  401.       neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
  402.       membersum = membersum * memberscale + neighsum * neighscale;
  403.       *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
  404.       lastcolsum = colsum; colsum = nextcolsum;
  405.     }
  406.     /* Special case for last column */
  407.     membersum = GETJSAMPLE(*inptr);
  408.     neighsum = lastcolsum + (colsum - membersum) + colsum;
  409.     membersum = membersum * memberscale + neighsum * neighscale;
  410.     *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
  411.   }
  412. }
  413. #endif /* INPUT_SMOOTHING_SUPPORTED */
  414. /*
  415.  * Module initialization routine for downsampling.
  416.  * Note that we must select a routine for each component.
  417.  */
  418. GLOBAL(void)
  419. jinit_downsampler (j_compress_ptr cinfo)
  420. {
  421.   my_downsample_ptr downsample;
  422.   int ci;
  423.   jpeg_component_info * compptr;
  424.   boolean smoothok = TRUE;
  425.   downsample = (my_downsample_ptr)
  426.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  427. SIZEOF(my_downsampler));
  428.   cinfo->downsample = (struct jpeg_downsampler *) downsample;
  429.   downsample->pub.start_pass = start_pass_downsample;
  430.   downsample->pub.downsample = sep_downsample;
  431.   downsample->pub.need_context_rows = FALSE;
  432.   if (cinfo->CCIR601_sampling)
  433.     ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
  434.   /* Verify we can handle the sampling factors, and set up method pointers */
  435.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  436.        ci++, compptr++) {
  437.     if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
  438. compptr->v_samp_factor == cinfo->max_v_samp_factor) {
  439. #ifdef INPUT_SMOOTHING_SUPPORTED
  440.       if (cinfo->smoothing_factor) {
  441. downsample->methods[ci] = fullsize_smooth_downsample;
  442. downsample->pub.need_context_rows = TRUE;
  443.       } else
  444. #endif
  445. downsample->methods[ci] = fullsize_downsample;
  446.     } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
  447.        compptr->v_samp_factor == cinfo->max_v_samp_factor) {
  448.       smoothok = FALSE;
  449.       downsample->methods[ci] = h2v1_downsample;
  450.     } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
  451.        compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
  452. #ifdef INPUT_SMOOTHING_SUPPORTED
  453.       if (cinfo->smoothing_factor) {
  454. downsample->methods[ci] = h2v2_smooth_downsample;
  455. downsample->pub.need_context_rows = TRUE;
  456.       } else
  457. #endif
  458. downsample->methods[ci] = h2v2_downsample;
  459.     } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
  460.        (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
  461.       smoothok = FALSE;
  462.       downsample->methods[ci] = int_downsample;
  463.     } else
  464.       ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
  465.   }
  466. #ifdef INPUT_SMOOTHING_SUPPORTED
  467.   if (cinfo->smoothing_factor && !smoothok)
  468.     TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
  469. #endif
  470. }