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

图片显示

开发平台:

Visual C++

  1. /*
  2.  * jcapi.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 compression 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 jcparam.c for
  11.  * parameter-setup helper routines, and jcomapi.c for routines shared by
  12.  * compression and decompression.
  13.  */
  14. #define JPEG_INTERNALS
  15. #include "jinclude.h"
  16. #include "jpeglib.h"
  17. /*
  18.  * Initialization of a JPEG compression object.
  19.  * The error manager must already be set up (in case memory manager fails).
  20.  */
  21. GLOBAL void
  22. jpeg_create_compress (j_compress_ptr cinfo)
  23. {
  24.   int i;
  25.   /* For debugging purposes, zero the whole master structure.
  26.    * But error manager pointer is already there, so save and restore it.
  27.    */
  28.   {
  29.     struct jpeg_error_mgr * err = cinfo->err;
  30.     MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
  31.     cinfo->err = err;
  32.   }
  33.   cinfo->is_decompressor = FALSE;
  34.   /* Initialize a memory manager instance for this object */
  35.   jinit_memory_mgr((j_common_ptr) cinfo);
  36.   /* Zero out pointers to permanent structures. */
  37.   cinfo->progress = NULL;
  38.   cinfo->dest = NULL;
  39.   cinfo->comp_info = NULL;
  40.   for (i = 0; i < NUM_QUANT_TBLS; i++)
  41.     cinfo->quant_tbl_ptrs[i] = NULL;
  42.   for (i = 0; i < NUM_HUFF_TBLS; i++) {
  43.     cinfo->dc_huff_tbl_ptrs[i] = NULL;
  44.     cinfo->ac_huff_tbl_ptrs[i] = NULL;
  45.   }
  46.   cinfo->input_gamma = 1.0; /* in case application forgets */
  47.   /* OK, I'm ready */
  48.   cinfo->global_state = CSTATE_START;
  49. }
  50. /*
  51.  * Destruction of a JPEG compression object
  52.  */
  53. GLOBAL void
  54. jpeg_destroy_compress (j_compress_ptr cinfo)
  55. {
  56.   jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
  57. }
  58. /*
  59.  * Forcibly suppress or un-suppress all quantization and Huffman tables.
  60.  * Marks all currently defined tables as already written (if suppress)
  61.  * or not written (if !suppress).  This will control whether they get emitted
  62.  * by a subsequent jpeg_start_compress call.
  63.  *
  64.  * This routine is exported for use by applications that want to produce
  65.  * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but
  66.  * since it is called by jpeg_start_compress, we put it here --- otherwise
  67.  * jcparam.o would be linked whether the application used it or not.
  68.  */
  69. GLOBAL void
  70. jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
  71. {
  72.   int i;
  73.   JQUANT_TBL * qtbl;
  74.   JHUFF_TBL * htbl;
  75.   for (i = 0; i < NUM_QUANT_TBLS; i++) {
  76.     if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
  77.       qtbl->sent_table = suppress;
  78.   }
  79.   for (i = 0; i < NUM_HUFF_TBLS; i++) {
  80.     if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
  81.       htbl->sent_table = suppress;
  82.     if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
  83.       htbl->sent_table = suppress;
  84.   }
  85. }
  86. /*
  87.  * Compression initialization.
  88.  * Before calling this, all parameters and a data destination must be set up.
  89.  *
  90.  * We require a write_all_tables parameter as a failsafe check when writing
  91.  * multiple datastreams from the same compression object.  Since prior runs
  92.  * will have left all the tables marked sent_table=TRUE, a subsequent run
  93.  * would emit an abbreviated stream (no tables) by default.  This may be what
  94.  * is wanted, but for safety's sake it should not be the default behavior:
  95.  * programmers should have to make a deliberate choice to emit abbreviated
  96.  * images.  Therefore the documentation and examples should encourage people
  97.  * to pass write_all_tables=TRUE; then it will take active thought to do the
  98.  * wrong thing.
  99.  */
  100. GLOBAL void
  101. jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
  102. {
  103.   if (cinfo->global_state != CSTATE_START)
  104.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  105.   if (write_all_tables)
  106.     jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
  107.   /* (Re)initialize error mgr and destination modules */
  108.   (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
  109.   (*cinfo->dest->init_destination) (cinfo);
  110.   /* Perform master selection of active modules */
  111.   jinit_master_compress(cinfo);
  112.   /* Set up for the first pass */
  113.   (*cinfo->master->prepare_for_pass) (cinfo);
  114.   /* Ready for application to drive first pass through jpeg_write_scanlines
  115.    * or jpeg_write_raw_data.
  116.    */
  117.   cinfo->next_scanline = 0;
  118.   cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
  119. }
  120. /*
  121.  * Write some scanlines of data to the JPEG compressor.
  122.  *
  123.  * The return value will be the number of lines actually written.
  124.  * This should be less than the supplied num_lines only in case that
  125.  * the data destination module has requested suspension of the compressor,
  126.  * or if more than image_height scanlines are passed in.
  127.  *
  128.  * Note: we warn about excess calls to jpeg_write_scanlines() since
  129.  * this likely signals an application programmer error.  However,
  130.  * excess scanlines passed in the last valid call are *silently* ignored,
  131.  * so that the application need not adjust num_lines for end-of-image
  132.  * when using a multiple-scanline buffer.
  133.  */
  134. GLOBAL JDIMENSION
  135. jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
  136.       JDIMENSION num_lines)
  137. {
  138.   JDIMENSION row_ctr, rows_left;
  139.   if (cinfo->global_state != CSTATE_SCANNING)
  140.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  141.   if (cinfo->next_scanline >= cinfo->image_height)
  142.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  143.   /* Call progress monitor hook if present */
  144.   if (cinfo->progress != NULL) {
  145.     cinfo->progress->pass_counter = (long) cinfo->next_scanline;
  146.     cinfo->progress->pass_limit = (long) cinfo->image_height;
  147.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  148.   }
  149.   /* Give master control module another chance if this is first call to
  150.    * jpeg_write_scanlines.  This lets output of the frame/scan headers be
  151.    * delayed so that application can write COM, etc, markers between
  152.    * jpeg_start_compress and jpeg_write_scanlines.
  153.    */
  154.   if (cinfo->master->call_pass_startup)
  155.     (*cinfo->master->pass_startup) (cinfo);
  156.   /* Ignore any extra scanlines at bottom of image. */
  157.   rows_left = cinfo->image_height - cinfo->next_scanline;
  158.   if (num_lines > rows_left)
  159.     num_lines = rows_left;
  160.   row_ctr = 0;
  161.   (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
  162.   cinfo->next_scanline += row_ctr;
  163.   return row_ctr;
  164. }
  165. /*
  166.  * Alternate entry point to write raw data.
  167.  * Processes exactly one iMCU row per call.
  168.  */
  169. GLOBAL JDIMENSION
  170. jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
  171.      JDIMENSION num_lines)
  172. {
  173.   JDIMENSION mcu_ctr, lines_per_MCU_row;
  174.   if (cinfo->global_state != CSTATE_RAW_OK)
  175.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  176.   if (cinfo->next_scanline >= cinfo->image_height) {
  177.     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
  178.     return 0;
  179.   }
  180.   /* Call progress monitor hook if present */
  181.   if (cinfo->progress != NULL) {
  182.     cinfo->progress->pass_counter = (long) cinfo->next_scanline;
  183.     cinfo->progress->pass_limit = (long) cinfo->image_height;
  184.     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  185.   }
  186.   /* Give master control module another chance if this is first call to
  187.    * jpeg_write_raw_data.  This lets output of the frame/scan headers be
  188.    * delayed so that application can write COM, etc, markers between
  189.    * jpeg_start_compress and jpeg_write_raw_data.
  190.    */
  191.   if (cinfo->master->call_pass_startup)
  192.     (*cinfo->master->pass_startup) (cinfo);
  193.   /* Verify that at least one iMCU row has been passed. */
  194.   lines_per_MCU_row = cinfo->max_v_samp_factor * DCTSIZE;
  195.   if (num_lines < lines_per_MCU_row)
  196.     ERREXIT(cinfo, JERR_BUFFER_SIZE);
  197.   /* Directly compress the row. */
  198.   mcu_ctr = 0;
  199.   (*cinfo->coef->compress_data) (cinfo, data, &mcu_ctr);
  200.   /* If compressor did not consume the whole row, then we must need to
  201.    * suspend processing; this is not currently supported.
  202.    */
  203.   if (mcu_ctr != cinfo->MCUs_per_row)
  204.     ERREXIT(cinfo, JERR_CANT_SUSPEND);
  205.   /* OK, we processed one iMCU row. */
  206.   cinfo->next_scanline += lines_per_MCU_row;
  207.   return lines_per_MCU_row;
  208. }
  209. /*
  210.  * Finish JPEG compression.
  211.  *
  212.  * If a multipass operating mode was selected, this may do a great deal of
  213.  * work including most of the actual output.
  214.  */
  215. GLOBAL void
  216. jpeg_finish_compress (j_compress_ptr cinfo)
  217. {
  218.   JDIMENSION iMCU_row, mcu_ctr;
  219.   if (cinfo->global_state != CSTATE_SCANNING && 
  220.       cinfo->global_state != CSTATE_RAW_OK)
  221.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  222.   if (cinfo->next_scanline < cinfo->image_height)
  223.     ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
  224.   /* Terminate first pass */
  225.   (*cinfo->master->finish_pass) (cinfo);
  226.   /* Perform any remaining passes */
  227.   while (! cinfo->master->is_last_pass) {
  228.     (*cinfo->master->prepare_for_pass) (cinfo);
  229.     for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
  230.       if (cinfo->progress != NULL) {
  231. cinfo->progress->pass_counter = (long) iMCU_row;
  232. cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
  233. (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
  234.       }
  235.       /* We bypass the main controller and invoke coef controller directly;
  236.        * all work is being done from the coefficient buffer.
  237.        */
  238.       mcu_ctr = 0;
  239.       (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL, &mcu_ctr);
  240.       if (mcu_ctr != cinfo->MCUs_per_row)
  241. ERREXIT(cinfo, JERR_CANT_SUSPEND);
  242.     }
  243.     (*cinfo->master->finish_pass) (cinfo);
  244.   }
  245.   /* Write EOI, do final cleanup */
  246.   (*cinfo->marker->write_file_trailer) (cinfo);
  247.   (*cinfo->dest->term_destination) (cinfo);
  248.   /* We can use jpeg_abort to release memory and reset global_state */
  249.   jpeg_abort((j_common_ptr) cinfo);
  250. }
  251. /*
  252.  * Write a special marker.
  253.  * This is only recommended for writing COM or APPn markers.
  254.  * Must be called after jpeg_start_compress() and before
  255.  * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
  256.  */
  257. GLOBAL void
  258. jpeg_write_marker (j_compress_ptr cinfo, int marker,
  259.    const JOCTET *dataptr, unsigned int datalen)
  260. {
  261.   if (cinfo->next_scanline != 0 ||
  262.       (cinfo->global_state != CSTATE_SCANNING &&
  263.        cinfo->global_state != CSTATE_RAW_OK))
  264.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  265.   (*cinfo->marker->write_any_marker) (cinfo, marker, dataptr, datalen);
  266. }
  267. /*
  268.  * Alternate compression function: just write an abbreviated table file.
  269.  * Before calling this, all parameters and a data destination must be set up.
  270.  *
  271.  * To produce a pair of files containing abbreviated tables and abbreviated
  272.  * image data, one would proceed as follows:
  273.  *
  274.  * initialize JPEG object
  275.  * set JPEG parameters
  276.  * set destination to table file
  277.  * jpeg_write_tables(cinfo);
  278.  * set destination to image file
  279.  * jpeg_start_compress(cinfo, FALSE);
  280.  * write data...
  281.  * jpeg_finish_compress(cinfo);
  282.  *
  283.  * jpeg_write_tables has the side effect of marking all tables written
  284.  * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress
  285.  * will not re-emit the tables unless it is passed write_all_tables=TRUE.
  286.  */
  287. GLOBAL void
  288. jpeg_write_tables (j_compress_ptr cinfo)
  289. {
  290.   if (cinfo->global_state != CSTATE_START)
  291.     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
  292.   /* (Re)initialize error mgr and destination modules */
  293.   (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
  294.   (*cinfo->dest->init_destination) (cinfo);
  295.   /* Initialize the marker writer ... bit of a crock to do it here. */
  296.   jinit_marker_writer(cinfo);
  297.   /* Write them tables! */
  298.   (*cinfo->marker->write_tables_only) (cinfo);
  299.   /* And clean up. */
  300.   (*cinfo->dest->term_destination) (cinfo);
  301.   /* We can use jpeg_abort to release memory ... is this necessary? */
  302.   jpeg_abort((j_common_ptr) cinfo);
  303. }
  304. /*
  305.  * Abort processing of a JPEG compression operation,
  306.  * but don't destroy the object itself.
  307.  */
  308. GLOBAL void
  309. jpeg_abort_compress (j_compress_ptr cinfo)
  310. {
  311.   jpeg_abort((j_common_ptr) cinfo); /* use common routine */
  312. }