tif_close.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:4k
源码类别:

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_close.c,v 1.9 2005/11/23 22:20:56 dron Exp $ */
  2. /*
  3.  * Copyright (c) 1988-1997 Sam Leffler
  4.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * TIFF Library.
  27.  */
  28. #include "tiffiop.h"
  29. /************************************************************************/
  30. /*                            TIFFCleanup()                             */
  31. /************************************************************************/
  32. /**
  33.  * Auxiliary function to free the TIFF structure. Given structure will be
  34.  * completetly freed, so you should save opened file handle and pointer
  35.  * to the close procedure in external variables before calling
  36.  * _TIFFCleanup(), if you will need these ones to close the file.
  37.  * 
  38.  * @param tif A TIFF pointer.
  39.  */
  40. void
  41. TIFFCleanup(TIFF* tif)
  42. {
  43. if (tif->tif_mode != O_RDONLY)
  44.     /*
  45.      * Flush buffered data and directory (if dirty).
  46.      */
  47.     TIFFFlush(tif);
  48. (*tif->tif_cleanup)(tif);
  49. TIFFFreeDirectory(tif);
  50. if (tif->tif_dirlist)
  51.     _TIFFfree(tif->tif_dirlist);
  52.     
  53. /* Clean up client info links */
  54. while( tif->tif_clientinfo )
  55. {
  56.     TIFFClientInfoLink *link = tif->tif_clientinfo;
  57.     tif->tif_clientinfo = link->next;
  58.     _TIFFfree( link->name );
  59.     _TIFFfree( link );
  60. }
  61. if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
  62.     _TIFFfree(tif->tif_rawdata);
  63. if (isMapped(tif))
  64.     TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size);
  65. /* Clean up custom fields */
  66. if (tif->tif_nfields > 0) 
  67. {
  68.     size_t  i;
  69.     for (i = 0; i < tif->tif_nfields; i++) 
  70.     {
  71. TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
  72. if (fld->field_bit == FIELD_CUSTOM && 
  73.     strncmp("Tag ", fld->field_name, 4) == 0) 
  74. {
  75.     _TIFFfree(fld->field_name);
  76.     _TIFFfree(fld);
  77. }
  78.     }   
  79.   
  80.     _TIFFfree(tif->tif_fieldinfo);
  81. }
  82. _TIFFfree(tif);
  83. }
  84. /************************************************************************/
  85. /*                            TIFFClose()                               */
  86. /************************************************************************/
  87. /**
  88.  * Close a previously opened TIFF file.
  89.  *
  90.  * TIFFClose closes a file that was previously opened with TIFFOpen().
  91.  * Any buffered data are flushed to the file, including the contents of
  92.  * the current directory (if modified); and all resources are reclaimed.
  93.  * 
  94.  * @param tif A TIFF pointer.
  95.  */
  96. void
  97. TIFFClose(TIFF* tif)
  98. {
  99. TIFFCloseProc closeproc = tif->tif_closeproc;
  100. thandle_t fd = tif->tif_clientdata;
  101. TIFFCleanup(tif);
  102. (void) (*closeproc)(fd);
  103. }