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

图形图象

开发平台:

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.  * jdapistd.c
  22.  *
  23.  * Copyright (C) 1994-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 application interface code for the decompression half
  28.  * of the JPEG library.  These are the "standard" API routines that are
  29.  * used in the normal full-decompression case.  They are not used by a
  30.  * transcoding-only application.  Note that if an application links in
  31.  * jpeg_start_decompress, it will end up linking in the entire decompressor.
  32.  * We thus must separate this file from jdapimin.c to avoid linking the
  33.  * whole decompression library into a transcoder.
  34.  */
  35. #define JPEG_INTERNALS
  36. #include "jinclude.h"
  37. #include "jpeglib.h"
  38. /* Forward declarations */
  39. LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
  40. /*
  41.  * Decompression initialization.
  42.  * jpeg_read_header must be completed before calling this.
  43.  *
  44.  * If a multipass operating mode was selected, this will do all but the
  45.  * last pass, and thus may take a great deal of time.
  46.  *
  47.  * Returns FALSE if suspended.  The return value need be inspected only if
  48.  * a suspending data source is used.
  49.  */
  50. GLOBAL(boolean)
  51. jpeg_start_decompress (j_decompress_ptr cinfo)
  52. {
  53.   if (cinfo->global_state == DSTATE_READY) {
  54.     /* First call: initialize master control, select active modules */
  55.     jinit_master_decompress(cinfo);
  56.     if (cinfo->buffered_image) {
  57.       /* No more work here; expecting jpeg_start_output next */
  58.       cinfo->global_state = DSTATE_BUFIMAGE;
  59.       return TRUE;
  60.     }
  61.     cinfo->global_state = DSTATE_PRELOAD;
  62.   }
  63.   if (cinfo->global_state == DSTATE_PRELOAD) {
  64.     /* If file has multiple scans, absorb them all into the coef buffer */
  65.     if (cinfo->inputctl->has_multiple_scans) {
  66. #ifdef D_MULTISCAN_FILES_SUPPORTED
  67.       for (;;) {
  68. int retcode;
  69. /* Call progress monitor hook if present */
  70. if (cinfo->progress != NULL)
  71.   (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  72. /* Absorb some more input */
  73. retcode = (*cinfo->inputctl->consume_input) (cinfo);
  74. if (retcode == JPEG_SUSPENDED)
  75.   return FALSE;
  76. if (retcode == JPEG_REACHED_EOI)
  77.   break;
  78. /* Advance progress counter if appropriate */
  79. if (cinfo->progress != NULL &&
  80.     (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
  81.   if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
  82.     /* jdmaster underestimated number of scans; ratchet up one scan */
  83.     cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
  84.   }
  85. }
  86.       }
  87. #else
  88.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  89. #endif /* D_MULTISCAN_FILES_SUPPORTED */
  90.     }
  91.     cinfo->output_scan_number = cinfo->input_scan_number;
  92.   } else if (cinfo->global_state != DSTATE_PRESCAN)
  93.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  94.   /* Perform any dummy output passes, and set up for the final pass */
  95.   return output_pass_setup(cinfo);
  96. }
  97. /*
  98.  * Set up for an output pass, and perform any dummy pass(es) needed.
  99.  * Common subroutine for jpeg_start_decompress and jpeg_start_output.
  100.  * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
  101.  * Exit: If done, returns TRUE and sets global_state for proper output mode.
  102.  *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
  103.  */
  104. LOCAL(boolean)
  105. output_pass_setup (j_decompress_ptr cinfo)
  106. {
  107.   if (cinfo->global_state != DSTATE_PRESCAN) {
  108.     /* First call: do pass setup */
  109.     (*cinfo->master->prepare_for_output_pass) (cinfo);
  110.     cinfo->output_scanline = 0;
  111.     cinfo->global_state = DSTATE_PRESCAN;
  112.   }
  113.   /* Loop over any required dummy passes */
  114.   while (cinfo->master->is_dummy_pass) {
  115. #ifdef QUANT_2PASS_SUPPORTED
  116.     /* Crank through the dummy pass */
  117.     while (cinfo->output_scanline < cinfo->output_height) {
  118.       JDIMENSION last_scanline;
  119.       /* Call progress monitor hook if present */
  120.       if (cinfo->progress != NULL) {
  121. cinfo->progress->pass_counter = (long) cinfo->output_scanline;
  122. cinfo->progress->pass_limit = (long) cinfo->output_height;
  123. (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  124.       }
  125.       /* Process some data */
  126.       last_scanline = cinfo->output_scanline;
  127.       (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
  128.     &cinfo->output_scanline, (JDIMENSION) 0);
  129.       if (cinfo->output_scanline == last_scanline)
  130. return FALSE; /* No progress made, must suspend */
  131.     }
  132.     /* Finish up dummy pass, and set up for another one */
  133.     (*cinfo->master->finish_output_pass) (cinfo);
  134.     (*cinfo->master->prepare_for_output_pass) (cinfo);
  135.     cinfo->output_scanline = 0;
  136. #else
  137.     ERREXIT(cinfo, JERR_NOT_COMPILED);
  138. #endif /* QUANT_2PASS_SUPPORTED */
  139.   }
  140.   /* Ready for application to drive output pass through
  141.    * jpeg_read_scanlines or jpeg_read_raw_data.
  142.    */
  143.   cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
  144.   return TRUE;
  145. }
  146. /*
  147.  * Read some scanlines of data from the JPEG decompressor.
  148.  *
  149.  * The return value will be the number of lines actually read.
  150.  * This may be less than the number requested in several cases,
  151.  * including bottom of image, data source suspension, and operating
  152.  * modes that emit multiple scanlines at a time.
  153.  *
  154.  * Note: we warn about excess calls to jpeg_read_scanlines() since
  155.  * this likely signals an application programmer error.  However,
  156.  * an oversize buffer (max_lines > scanlines remaining) is not an error.
  157.  */
  158. GLOBAL(JDIMENSION)
  159. jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
  160.      JDIMENSION max_lines)
  161. {
  162.   JDIMENSION row_ctr;
  163.   if (cinfo->global_state != DSTATE_SCANNING)
  164.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  165.   if (cinfo->output_scanline >= cinfo->output_height) {
  166.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  167.     return 0;
  168.   }
  169.   /* Call progress monitor hook if present */
  170.   if (cinfo->progress != NULL) {
  171.     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
  172.     cinfo->progress->pass_limit = (long) cinfo->output_height;
  173.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  174.   }
  175.   /* Process some data */
  176.   row_ctr = 0;
  177.   (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
  178.   cinfo->output_scanline += row_ctr;
  179.   return row_ctr;
  180. }
  181. /*
  182.  * Alternate entry point to read raw data.
  183.  * Processes exactly one iMCU row per call, unless suspended.
  184.  */
  185. GLOBAL(JDIMENSION)
  186. jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
  187.     JDIMENSION max_lines)
  188. {
  189.   JDIMENSION lines_per_iMCU_row;
  190.   if (cinfo->global_state != DSTATE_RAW_OK)
  191.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  192.   if (cinfo->output_scanline >= cinfo->output_height) {
  193.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  194.     return 0;
  195.   }
  196.   /* Call progress monitor hook if present */
  197.   if (cinfo->progress != NULL) {
  198.     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
  199.     cinfo->progress->pass_limit = (long) cinfo->output_height;
  200.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  201.   }
  202.   /* Verify that at least one iMCU row can be returned. */
  203.   lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
  204.   if (max_lines < lines_per_iMCU_row)
  205.     ERREXIT(cinfo, JERR_BUFFER_SIZE);
  206.   /* Decompress directly into user's buffer. */
  207.   if (! (*cinfo->coef->decompress_data) (cinfo, data))
  208.     return 0; /* suspension forced, can do nothing more */
  209.   /* OK, we processed one iMCU row. */
  210.   cinfo->output_scanline += lines_per_iMCU_row;
  211.   return lines_per_iMCU_row;
  212. }
  213. /* Additional entry points for buffered-image mode. */
  214. #ifdef D_MULTISCAN_FILES_SUPPORTED
  215. /*
  216.  * Initialize for an output pass in buffered-image mode.
  217.  */
  218. GLOBAL(boolean)
  219. jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
  220. {
  221.   if (cinfo->global_state != DSTATE_BUFIMAGE &&
  222.       cinfo->global_state != DSTATE_PRESCAN)
  223.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  224.   /* Limit scan number to valid range */
  225.   if (scan_number <= 0)
  226.     scan_number = 1;
  227.   if (cinfo->inputctl->eoi_reached &&
  228.       scan_number > cinfo->input_scan_number)
  229.     scan_number = cinfo->input_scan_number;
  230.   cinfo->output_scan_number = scan_number;
  231.   /* Perform any dummy output passes, and set up for the real pass */
  232.   return output_pass_setup(cinfo);
  233. }
  234. /*
  235.  * Finish up after an output pass in buffered-image mode.
  236.  *
  237.  * Returns FALSE if suspended.  The return value need be inspected only if
  238.  * a suspending data source is used.
  239.  */
  240. GLOBAL(boolean)
  241. jpeg_finish_output (j_decompress_ptr cinfo)
  242. {
  243.   if ((cinfo->global_state == DSTATE_SCANNING ||
  244.        cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
  245.     /* Terminate this pass. */
  246.     /* We do not require the whole pass to have been completed. */
  247.     (*cinfo->master->finish_output_pass) (cinfo);
  248.     cinfo->global_state = DSTATE_BUFPOST;
  249.   } else if (cinfo->global_state != DSTATE_BUFPOST) {
  250.     /* BUFPOST = repeat call after a suspension, anything else is error */
  251.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  252.   }
  253.   /* Read markers looking for SOS or EOI */
  254.   while (cinfo->input_scan_number <= cinfo->output_scan_number &&
  255.  ! cinfo->inputctl->eoi_reached) {
  256.     if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
  257.       return FALSE; /* Suspend, come back later */
  258.   }
  259.   cinfo->global_state = DSTATE_BUFIMAGE;
  260.   return TRUE;
  261. }
  262. #endif /* D_MULTISCAN_FILES_SUPPORTED */