JDAPI.C
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:14k
源码类别:

图片显示

开发平台:

Visual C++

  1. /*
  2.  * jdapi.c
  3.  *
  4.  * Copyright (C) 1994, Thomas G. Lane.
  5.  * This file is part of the Independent JPEG Group's software.
  6.  * For conditions of distribution and use, see the accompanying README file.
  7.  *
  8.  * This file contains application interface code for the decompression half of
  9.  * the JPEG library.  Most of the routines intended to be called directly by
  10.  * an application are in this file.  But also see jcomapi.c for routines
  11.  * shared by compression and decompression.
  12.  */
  13. #define JPEG_INTERNALS
  14. #include "jinclude.h"
  15. #include "jpeglib.h"
  16. /*
  17.  * Initialization of a JPEG decompression object.
  18.  * The error manager must already be set up (in case memory manager fails).
  19.  */
  20. GLOBAL void
  21. jpeg_create_decompress (j_decompress_ptr cinfo)
  22. {
  23.   int i;
  24.   /* For debugging purposes, zero the whole master structure.
  25.    * But error manager pointer is already there, so save and restore it.
  26.    */
  27.   {
  28.     struct jpeg_error_mgr * err = cinfo->err;
  29.     MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
  30.     cinfo->err = err;
  31.   }
  32.   cinfo->is_decompressor = TRUE;
  33.   /* Initialize a memory manager instance for this object */
  34.   jinit_memory_mgr((j_common_ptr) cinfo);
  35.   /* Zero out pointers to permanent structures. */
  36.   cinfo->progress = NULL;
  37.   cinfo->src = NULL;
  38.   for (i = 0; i < NUM_QUANT_TBLS; i++)
  39.     cinfo->quant_tbl_ptrs[i] = NULL;
  40.   for (i = 0; i < NUM_HUFF_TBLS; i++) {
  41.     cinfo->dc_huff_tbl_ptrs[i] = NULL;
  42.     cinfo->ac_huff_tbl_ptrs[i] = NULL;
  43.   }
  44.   cinfo->sample_range_limit = NULL;
  45.   /* Initialize marker processor so application can override methods
  46.    * for COM, APPn markers before calling jpeg_read_header.
  47.    */
  48.   cinfo->marker = NULL;
  49.   jinit_marker_reader(cinfo);
  50.   /* OK, I'm ready */
  51.   cinfo->global_state = DSTATE_START;
  52. }
  53. /*
  54.  * Destruction of a JPEG decompression object
  55.  */
  56. GLOBAL void
  57. jpeg_destroy_decompress (j_decompress_ptr cinfo)
  58. {
  59.   jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
  60. }
  61. /*
  62.  * Install a special processing method for COM or APPn markers.
  63.  */
  64. GLOBAL void
  65. jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
  66.    jpeg_marker_parser_method routine)
  67. {
  68.   if (marker_code == JPEG_COM)
  69.     cinfo->marker->process_COM = routine;
  70.   else if (marker_code >= JPEG_APP0 && marker_code <= JPEG_APP0+15)
  71.     cinfo->marker->process_APPn[marker_code-JPEG_APP0] = routine;
  72.   else
  73.     ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
  74. }
  75. /*
  76.  * Set default decompression parameters.
  77.  */
  78. LOCAL void
  79. default_decompress_parms (j_decompress_ptr cinfo)
  80. {
  81.   /* Guess the input colorspace, and set output colorspace accordingly. */
  82.   /* (Wish JPEG committee had provided a real way to specify this...) */
  83.   /* Note application may override our guesses. */
  84.   switch (cinfo->num_components) {
  85.   case 1:
  86.     cinfo->jpeg_color_space = JCS_GRAYSCALE;
  87.     cinfo->out_color_space = JCS_GRAYSCALE;
  88.     break;
  89.     
  90.   case 3:
  91.     if (cinfo->saw_JFIF_marker) {
  92.       cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
  93.     } else if (cinfo->saw_Adobe_marker) {
  94.       switch (cinfo->Adobe_transform) {
  95.       case 0:
  96. cinfo->jpeg_color_space = JCS_RGB;
  97. break;
  98.       case 1:
  99. cinfo->jpeg_color_space = JCS_YCbCr;
  100. break;
  101.       default:
  102. WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
  103. cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
  104. break;
  105.       }
  106.     } else {
  107.       /* Saw no special markers, try to guess from the component IDs */
  108.       int cid0 = cinfo->comp_info[0].component_id;
  109.       int cid1 = cinfo->comp_info[1].component_id;
  110.       int cid2 = cinfo->comp_info[2].component_id;
  111.       if (cid0 == 1 && cid1 == 2 && cid2 == 3)
  112. cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
  113.       else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
  114. cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
  115.       else {
  116. TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
  117. cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
  118.       }
  119.     }
  120.     /* Always guess RGB is proper output colorspace. */
  121.     cinfo->out_color_space = JCS_RGB;
  122.     break;
  123.     
  124.   case 4:
  125.     if (cinfo->saw_Adobe_marker) {
  126.       switch (cinfo->Adobe_transform) {
  127.       case 0:
  128. cinfo->jpeg_color_space = JCS_CMYK;
  129. break;
  130.       case 2:
  131. cinfo->jpeg_color_space = JCS_YCCK;
  132. break;
  133.       default:
  134. WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
  135. cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
  136. break;
  137.       }
  138.     } else {
  139.       /* No special markers, assume straight CMYK. */
  140.       cinfo->jpeg_color_space = JCS_CMYK;
  141.     }
  142.     cinfo->out_color_space = JCS_CMYK;
  143.     break;
  144.     
  145.   default:
  146.     cinfo->jpeg_color_space = JCS_UNKNOWN;
  147.     cinfo->out_color_space = JCS_UNKNOWN;
  148.     break;
  149.   }
  150.   /* Set defaults for other decompression parameters. */
  151.   cinfo->scale_num = 1; /* 1:1 scaling */
  152.   cinfo->scale_denom = 1;
  153.   cinfo->output_gamma = 1.0;
  154.   cinfo->raw_data_out = FALSE;
  155.   cinfo->quantize_colors = FALSE;
  156.   /* We set these in case application only sets quantize_colors. */
  157.   cinfo->two_pass_quantize = TRUE;
  158.   cinfo->dither_mode = JDITHER_FS;
  159.   cinfo->desired_number_of_colors = 256;
  160.   cinfo->colormap = NULL;
  161.   /* DCT algorithm preference */
  162.   cinfo->dct_method = JDCT_DEFAULT;
  163.   cinfo->do_fancy_upsampling = TRUE;
  164. }
  165. /*
  166.  * Decompression startup: read start of JPEG datastream to see what's there.
  167.  * Need only initialize JPEG object and supply a data source before calling.
  168.  *
  169.  * This routine will read as far as the first SOS marker (ie, actual start of
  170.  * compressed data), and will save all tables and parameters in the JPEG
  171.  * object.  It will also initialize the decompression parameters to default
  172.  * values, and finally return JPEG_HEADER_OK.  On return, the application may
  173.  * adjust the decompression parameters and then call jpeg_start_decompress.
  174.  * (Or, if the application only wanted to determine the image parameters,
  175.  * the data need not be decompressed.  In that case, call jpeg_abort or
  176.  * jpeg_destroy to release any temporary space.)
  177.  * If an abbreviated (tables only) datastream is presented, the routine will
  178.  * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then
  179.  * re-use the JPEG object to read the abbreviated image datastream(s).
  180.  * It is unnecessary (but OK) to call jpeg_abort in this case.
  181.  * The JPEG_SUSPENDED return code only occurs if the data source module
  182.  * requests suspension of the decompressor.  In this case the application
  183.  * should load more source data and then re-call jpeg_read_header to resume
  184.  * processing.
  185.  * If a non-suspending data source is used and require_image is TRUE, then the
  186.  * return code need not be inspected since only JPEG_HEADER_OK is possible.
  187.  */
  188. GLOBAL int
  189. jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
  190. {
  191.   int retcode;
  192.   if (cinfo->global_state == DSTATE_START) {
  193.     /* First-time actions: reset appropriate modules */
  194.     (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
  195.     (*cinfo->marker->reset_marker_reader) (cinfo);
  196.     (*cinfo->src->init_source) (cinfo);
  197.     cinfo->global_state = DSTATE_INHEADER;
  198.   } else if (cinfo->global_state != DSTATE_INHEADER) {
  199.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  200.   }
  201.   retcode = (*cinfo->marker->read_markers) (cinfo);
  202.   switch (retcode) {
  203.   case JPEG_HEADER_OK: /* Found SOS, prepare to decompress */
  204.     /* Set up default parameters based on header data */
  205.     default_decompress_parms(cinfo);
  206.     /* Set global state: ready for start_decompress */
  207.     cinfo->global_state = DSTATE_READY;
  208.     break;
  209.   case JPEG_HEADER_TABLES_ONLY: /* Found EOI before any SOS */
  210.     if (cinfo->marker->saw_SOF)
  211.       ERREXIT(cinfo, JERR_SOF_NO_SOS);
  212.     if (require_image) /* Complain if application wants an image */
  213.       ERREXIT(cinfo, JERR_NO_IMAGE);
  214.     /* We need not do any cleanup since only permanent storage (for DQT, DHT)
  215.      * has been allocated.
  216.      */
  217.     /* Set global state: ready for a new datastream */
  218.     cinfo->global_state = DSTATE_START;
  219.     break;
  220.   case JPEG_SUSPENDED: /* Had to suspend before end of headers */
  221.     /* no work */
  222.     break;
  223.   }
  224.   return retcode;
  225. }
  226. /*
  227.  * Decompression initialization.
  228.  * jpeg_read_header must be completed before calling this.
  229.  *
  230.  * If a multipass operating mode was selected, this will do all but the
  231.  * last pass, and thus may take a great deal of time.
  232.  */
  233. GLOBAL void
  234. jpeg_start_decompress (j_decompress_ptr cinfo)
  235. {
  236.   JDIMENSION chunk_ctr, last_chunk_ctr;
  237.   if (cinfo->global_state != DSTATE_READY)
  238.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  239.   /* Perform master selection of active modules */
  240.   jinit_master_decompress(cinfo);
  241.   /* Do all but the final (output) pass, and set up for that one. */
  242.   for (;;) {
  243.     (*cinfo->master->prepare_for_pass) (cinfo);
  244.     if (cinfo->master->is_last_pass)
  245.       break;
  246.     chunk_ctr = 0;
  247.     while (chunk_ctr < cinfo->main->num_chunks) {
  248.       /* Call progress monitor hook if present */
  249.       if (cinfo->progress != NULL) {
  250. cinfo->progress->pass_counter = (long) chunk_ctr;
  251. cinfo->progress->pass_limit = (long) cinfo->main->num_chunks;
  252. (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  253.       }
  254.       /* Process some data */
  255.       last_chunk_ctr = chunk_ctr;
  256.       (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
  257.     &chunk_ctr, (JDIMENSION) 0);
  258.       if (chunk_ctr == last_chunk_ctr) /* check for failure to make progress */
  259. ERREXIT(cinfo, JERR_CANT_SUSPEND);
  260.     }
  261.     (*cinfo->master->finish_pass) (cinfo);
  262.   }
  263.   /* Ready for application to drive last pass through jpeg_read_scanlines
  264.    * or jpeg_read_raw_data.
  265.    */
  266.   cinfo->output_scanline = 0;
  267.   cinfo->global_state = (cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING);
  268. }
  269. /*
  270.  * Read some scanlines of data from the JPEG decompressor.
  271.  *
  272.  * The return value will be the number of lines actually read.
  273.  * This may be less than the number requested in several cases,
  274.  * including bottom of image, data source suspension, and operating
  275.  * modes that emit multiple scanlines at a time.
  276.  *
  277.  * Note: we warn about excess calls to jpeg_read_scanlines() since
  278.  * this likely signals an application programmer error.  However,
  279.  * an oversize buffer (max_lines > scanlines remaining) is not an error.
  280.  */
  281. GLOBAL JDIMENSION
  282. jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
  283.      JDIMENSION max_lines)
  284. {
  285.   JDIMENSION row_ctr;
  286.   if (cinfo->global_state != DSTATE_SCANNING)
  287.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  288.   if (cinfo->output_scanline >= cinfo->output_height)
  289.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  290.   /* Call progress monitor hook if present */
  291.   if (cinfo->progress != NULL) {
  292.     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
  293.     cinfo->progress->pass_limit = (long) cinfo->output_height;
  294.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  295.   }
  296.   /* Process some data */
  297.   row_ctr = 0;
  298.   (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
  299.   cinfo->output_scanline += row_ctr;
  300.   return row_ctr;
  301. }
  302. /*
  303.  * Alternate entry point to read raw data.
  304.  * Processes exactly one MCU row per call.
  305.  */
  306. GLOBAL JDIMENSION
  307. jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
  308.     JDIMENSION max_lines)
  309. {
  310.   JDIMENSION lines_per_MCU_row;
  311.   if (cinfo->global_state != DSTATE_RAW_OK)
  312.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  313.   if (cinfo->output_scanline >= cinfo->output_height) {
  314.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  315.     return 0;
  316.   }
  317.   /* Call progress monitor hook if present */
  318.   if (cinfo->progress != NULL) {
  319.     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
  320.     cinfo->progress->pass_limit = (long) cinfo->output_height;
  321.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  322.   }
  323.   /* Verify that at least one MCU row can be returned. */
  324.   lines_per_MCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
  325.   if (max_lines < lines_per_MCU_row)
  326.     ERREXIT(cinfo, JERR_BUFFER_SIZE);
  327.   /* Decompress directly into user's buffer. */
  328.   if (! (*cinfo->coef->decompress_data) (cinfo, data))
  329.     return 0; /* suspension forced, can do nothing more */
  330.   /* OK, we processed one MCU row. */
  331.   cinfo->output_scanline += lines_per_MCU_row;
  332.   return lines_per_MCU_row;
  333. }
  334. /*
  335.  * Finish JPEG decompression.
  336.  *
  337.  * This will normally just verify the file trailer and release temp storage.
  338.  *
  339.  * Returns FALSE if suspended.  The return value need be inspected only if
  340.  * a suspending data source is used.
  341.  */
  342. GLOBAL boolean
  343. jpeg_finish_decompress (j_decompress_ptr cinfo)
  344. {
  345.   if (cinfo->global_state == DSTATE_SCANNING ||
  346.       cinfo->global_state == DSTATE_RAW_OK) {
  347.     /* Terminate final pass */
  348.     if (cinfo->output_scanline < cinfo->output_height)
  349.       ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
  350.     (*cinfo->master->finish_pass) (cinfo);
  351.     cinfo->global_state = DSTATE_STOPPING;
  352.   } else if (cinfo->global_state != DSTATE_STOPPING) {
  353.     /* Repeat call after a suspension? */
  354.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  355.   }
  356.   /* Check for EOI in source file, unless master control already read it */
  357.   if (! cinfo->master->eoi_processed) {
  358.     switch ((*cinfo->marker->read_markers) (cinfo)) {
  359.     case JPEG_HEADER_OK: /* Found SOS!? */
  360.       ERREXIT(cinfo, JERR_EOI_EXPECTED);
  361.       break;
  362.     case JPEG_HEADER_TABLES_ONLY: /* Found EOI, A-OK */
  363.       break;
  364.     case JPEG_SUSPENDED: /* Suspend, come back later */
  365.       return FALSE;
  366.     }
  367.   }
  368.   /* Do final cleanup */
  369.   (*cinfo->src->term_source) (cinfo);
  370.   /* We can use jpeg_abort to release memory and reset global_state */
  371.   jpeg_abort((j_common_ptr) cinfo);
  372.   return TRUE;
  373. }
  374. /*
  375.  * Abort processing of a JPEG decompression operation,
  376.  * but don't destroy the object itself.
  377.  */
  378. GLOBAL void
  379. jpeg_abort_decompress (j_decompress_ptr cinfo)
  380. {
  381.   jpeg_abort((j_common_ptr) cinfo); /* use common routine */
  382. }