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

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_print.c,v 1.35 2006/03/13 07:53:28 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.  * Directory Printing Support
  29.  */
  30. #include "tiffiop.h"
  31. #include <stdio.h>
  32. #include <ctype.h>
  33. static const char *photoNames[] = {
  34.     "min-is-white", /* PHOTOMETRIC_MINISWHITE */
  35.     "min-is-black", /* PHOTOMETRIC_MINISBLACK */
  36.     "RGB color", /* PHOTOMETRIC_RGB */
  37.     "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
  38.     "transparency mask", /* PHOTOMETRIC_MASK */
  39.     "separated", /* PHOTOMETRIC_SEPARATED */
  40.     "YCbCr", /* PHOTOMETRIC_YCBCR */
  41.     "7 (0x7)",
  42.     "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
  43. };
  44. #define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0]))
  45. static const char *orientNames[] = {
  46.     "0 (0x0)",
  47.     "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
  48.     "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
  49.     "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
  50.     "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
  51.     "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
  52.     "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
  53.     "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
  54.     "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
  55. };
  56. #define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0]))
  57. static void
  58. _TIFFPrintField(FILE* fd, const TIFFFieldInfo *fip,
  59. uint32 value_count, void *raw_data)
  60. {
  61. uint32 j;
  62. fprintf(fd, "  %s: ", fip->field_name);
  63. for(j = 0; j < value_count; j++) {
  64. if(fip->field_type == TIFF_BYTE)
  65. fprintf(fd, "%u", ((uint8 *) raw_data)[j]);
  66. else if(fip->field_type == TIFF_UNDEFINED)
  67. fprintf(fd, "0x%x",
  68. (unsigned int) ((unsigned char *) raw_data)[j]);
  69. else if(fip->field_type == TIFF_SBYTE)
  70. fprintf(fd, "%d", ((int8 *) raw_data)[j]);
  71. else if(fip->field_type == TIFF_SHORT)
  72. fprintf(fd, "%u", ((uint16 *) raw_data)[j]);
  73. else if(fip->field_type == TIFF_SSHORT)
  74. fprintf(fd, "%d", ((int16 *) raw_data)[j]);
  75. else if(fip->field_type == TIFF_LONG)
  76. fprintf(fd, "%lu",
  77. (unsigned long)((uint32 *) raw_data)[j]);
  78. else if(fip->field_type == TIFF_SLONG)
  79. fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]);
  80. else if(fip->field_type == TIFF_RATIONAL
  81. || fip->field_type == TIFF_SRATIONAL
  82. || fip->field_type == TIFF_FLOAT)
  83. fprintf(fd, "%f", ((float *) raw_data)[j]);
  84. else if(fip->field_type == TIFF_IFD)
  85. fprintf(fd, "0x%ulx", ((uint32 *) raw_data)[j]);
  86. else if(fip->field_type == TIFF_ASCII) {
  87. fprintf(fd, "%s", (char *) raw_data);
  88. break;
  89. }
  90. else if(fip->field_type == TIFF_DOUBLE)
  91. fprintf(fd, "%f", ((double *) raw_data)[j]);
  92. else if(fip->field_type == TIFF_FLOAT)
  93. fprintf(fd, "%f", ((float *)raw_data)[j]);
  94. else {
  95. fprintf(fd, "<unsupported data type in TIFFPrint>");
  96. break;
  97. }
  98. if(j < value_count - 1)
  99. fprintf(fd, ",");
  100. }
  101. fprintf(fd, "n");
  102. }
  103. static int
  104. _TIFFPrettyPrintField(TIFF* tif, FILE* fd, ttag_t tag,
  105.       uint32 value_count, void *raw_data)
  106. {
  107. TIFFDirectory *td = &tif->tif_dir;
  108. switch (tag)
  109. {
  110. case TIFFTAG_INKSET:
  111. fprintf(fd, "  Ink Set: ");
  112. switch (*((uint16*)raw_data)) {
  113. case INKSET_CMYK:
  114. fprintf(fd, "CMYKn");
  115. break;
  116. default:
  117. fprintf(fd, "%u (0x%x)n",
  118. *((uint16*)raw_data),
  119. *((uint16*)raw_data));
  120. break;
  121. }
  122. return 1;
  123. case TIFFTAG_DOTRANGE:
  124. fprintf(fd, "  Dot Range: %u-%un",
  125. ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]);
  126. return 1;
  127. case TIFFTAG_WHITEPOINT:
  128. fprintf(fd, "  White Point: %g-%gn",
  129. ((float *)raw_data)[0], ((float *)raw_data)[1]); return 1;
  130. case TIFFTAG_REFERENCEBLACKWHITE:
  131. {
  132. uint16 i;
  133. fprintf(fd, "  Reference Black/White:n");
  134. for (i = 0; i < td->td_samplesperpixel; i++)
  135. fprintf(fd, "    %2d: %5g %5gn", i,
  136. ((float *)raw_data)[2*i+0],
  137. ((float *)raw_data)[2*i+1]);
  138. return 1;
  139. }
  140. case TIFFTAG_XMLPACKET:
  141. {
  142. uint32 i;
  143. fprintf(fd, "  XMLPacket (XMP Metadata):n" );
  144. for(i = 0; i < value_count; i++)
  145. fputc(((char *)raw_data)[i], fd);
  146. fprintf( fd, "n" );
  147. return 1;
  148. }
  149. case TIFFTAG_RICHTIFFIPTC:
  150. /*
  151.  * XXX: for some weird reason RichTIFFIPTC tag
  152.  * defined as array of LONG values.
  153.  */
  154. fprintf(fd,
  155. "  RichTIFFIPTC Data: <present>, %lu bytesn",
  156. (unsigned long) value_count * 4);
  157. return 1;
  158. case TIFFTAG_PHOTOSHOP:
  159. fprintf(fd, "  Photoshop Data: <present>, %lu bytesn",
  160. (unsigned long) value_count);
  161. return 1;
  162. case TIFFTAG_ICCPROFILE:
  163. fprintf(fd, "  ICC Profile: <present>, %lu bytesn",
  164. (unsigned long) value_count);
  165. return 1;
  166. case TIFFTAG_STONITS:
  167. fprintf(fd,
  168. "  Sample to Nits conversion factor: %.4en",
  169. *((double*)raw_data));
  170. return 1;
  171.         }
  172. return 0;
  173. }
  174. /*
  175.  * Print the contents of the current directory
  176.  * to the specified stdio file stream.
  177.  */
  178. void
  179. TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
  180. {
  181. TIFFDirectory *td = &tif->tif_dir;
  182. char *sep;
  183. uint16 i;
  184. long l, n;
  185. fprintf(fd, "TIFF Directory at offset 0x%lx (%lu)n",
  186. (unsigned long)tif->tif_diroff, (unsigned long)tif->tif_diroff);
  187. if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
  188. fprintf(fd, "  Subfile Type:");
  189. sep = " ";
  190. if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
  191. fprintf(fd, "%sreduced-resolution image", sep);
  192. sep = "/";
  193. }
  194. if (td->td_subfiletype & FILETYPE_PAGE) {
  195. fprintf(fd, "%smulti-page document", sep);
  196. sep = "/";
  197. }
  198. if (td->td_subfiletype & FILETYPE_MASK)
  199. fprintf(fd, "%stransparency mask", sep);
  200. fprintf(fd, " (%lu = 0x%lx)n",
  201.     (long) td->td_subfiletype, (long) td->td_subfiletype);
  202. }
  203. if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
  204. fprintf(fd, "  Image Width: %lu Image Length: %lu",
  205.     (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength);
  206. if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
  207. fprintf(fd, " Image Depth: %lu",
  208.     (unsigned long) td->td_imagedepth);
  209. fprintf(fd, "n");
  210. }
  211. if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
  212. fprintf(fd, "  Tile Width: %lu Tile Length: %lu",
  213.     (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength);
  214. if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
  215. fprintf(fd, " Tile Depth: %lu",
  216.     (unsigned long) td->td_tiledepth);
  217. fprintf(fd, "n");
  218. }
  219. if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
  220. fprintf(fd, "  Resolution: %g, %g",
  221.     td->td_xresolution, td->td_yresolution);
  222. if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
  223. switch (td->td_resolutionunit) {
  224. case RESUNIT_NONE:
  225. fprintf(fd, " (unitless)");
  226. break;
  227. case RESUNIT_INCH:
  228. fprintf(fd, " pixels/inch");
  229. break;
  230. case RESUNIT_CENTIMETER:
  231. fprintf(fd, " pixels/cm");
  232. break;
  233. default:
  234. fprintf(fd, " (unit %u = 0x%x)",
  235.     td->td_resolutionunit,
  236.     td->td_resolutionunit);
  237. break;
  238. }
  239. }
  240. fprintf(fd, "n");
  241. }
  242. if (TIFFFieldSet(tif,FIELD_POSITION))
  243. fprintf(fd, "  Position: %g, %gn",
  244.     td->td_xposition, td->td_yposition);
  245. if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
  246. fprintf(fd, "  Bits/Sample: %un", td->td_bitspersample);
  247. if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
  248. fprintf(fd, "  Sample Format: ");
  249. switch (td->td_sampleformat) {
  250. case SAMPLEFORMAT_VOID:
  251. fprintf(fd, "voidn");
  252. break;
  253. case SAMPLEFORMAT_INT:
  254. fprintf(fd, "signed integern");
  255. break;
  256. case SAMPLEFORMAT_UINT:
  257. fprintf(fd, "unsigned integern");
  258. break;
  259. case SAMPLEFORMAT_IEEEFP:
  260. fprintf(fd, "IEEE floating pointn");
  261. break;
  262. case SAMPLEFORMAT_COMPLEXINT:
  263. fprintf(fd, "complex signed integern");
  264. break;
  265. case SAMPLEFORMAT_COMPLEXIEEEFP:
  266. fprintf(fd, "complex IEEE floating pointn");
  267. break;
  268. default:
  269. fprintf(fd, "%u (0x%x)n",
  270.     td->td_sampleformat, td->td_sampleformat);
  271. break;
  272. }
  273. }
  274. if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
  275. const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
  276. fprintf(fd, "  Compression Scheme: ");
  277. if (c)
  278. fprintf(fd, "%sn", c->name);
  279. else
  280. fprintf(fd, "%u (0x%x)n",
  281.     td->td_compression, td->td_compression);
  282. }
  283. if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
  284. fprintf(fd, "  Photometric Interpretation: ");
  285. if (td->td_photometric < NPHOTONAMES)
  286. fprintf(fd, "%sn", photoNames[td->td_photometric]);
  287. else {
  288. switch (td->td_photometric) {
  289. case PHOTOMETRIC_LOGL:
  290. fprintf(fd, "CIE Log2(L)n");
  291. break;
  292. case PHOTOMETRIC_LOGLUV:
  293. fprintf(fd, "CIE Log2(L) (u',v')n");
  294. break;
  295. default:
  296. fprintf(fd, "%u (0x%x)n",
  297.     td->td_photometric, td->td_photometric);
  298. break;
  299. }
  300. }
  301. }
  302. if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
  303. fprintf(fd, "  Extra Samples: %u<", td->td_extrasamples);
  304. sep = "";
  305. for (i = 0; i < td->td_extrasamples; i++) {
  306. switch (td->td_sampleinfo[i]) {
  307. case EXTRASAMPLE_UNSPECIFIED:
  308. fprintf(fd, "%sunspecified", sep);
  309. break;
  310. case EXTRASAMPLE_ASSOCALPHA:
  311. fprintf(fd, "%sassoc-alpha", sep);
  312. break;
  313. case EXTRASAMPLE_UNASSALPHA:
  314. fprintf(fd, "%sunassoc-alpha", sep);
  315. break;
  316. default:
  317. fprintf(fd, "%s%u (0x%x)", sep,
  318.     td->td_sampleinfo[i], td->td_sampleinfo[i]);
  319. break;
  320. }
  321. sep = ", ";
  322. }
  323. fprintf(fd, ">n");
  324. }
  325. if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
  326. char* cp;
  327. fprintf(fd, "  Ink Names: ");
  328. i = td->td_samplesperpixel;
  329. sep = "";
  330. for (cp = td->td_inknames; i > 0; cp = strchr(cp,'')+1, i--) {
  331. fputs(sep, fd);
  332. _TIFFprintAscii(fd, cp);
  333. sep = ", ";
  334. }
  335.                 fputs("n", fd);
  336. }
  337. if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
  338. fprintf(fd, "  Thresholding: ");
  339. switch (td->td_threshholding) {
  340. case THRESHHOLD_BILEVEL:
  341. fprintf(fd, "bilevel art scann");
  342. break;
  343. case THRESHHOLD_HALFTONE:
  344. fprintf(fd, "halftone or dithered scann");
  345. break;
  346. case THRESHHOLD_ERRORDIFFUSE:
  347. fprintf(fd, "error diffusedn");
  348. break;
  349. default:
  350. fprintf(fd, "%u (0x%x)n",
  351.     td->td_threshholding, td->td_threshholding);
  352. break;
  353. }
  354. }
  355. if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
  356. fprintf(fd, "  FillOrder: ");
  357. switch (td->td_fillorder) {
  358. case FILLORDER_MSB2LSB:
  359. fprintf(fd, "msb-to-lsbn");
  360. break;
  361. case FILLORDER_LSB2MSB:
  362. fprintf(fd, "lsb-to-msbn");
  363. break;
  364. default:
  365. fprintf(fd, "%u (0x%x)n",
  366.     td->td_fillorder, td->td_fillorder);
  367. break;
  368. }
  369. }
  370. if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
  371.         {
  372.             /*
  373.              * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
  374.              * we need to fetch this rather than trust what is in our
  375.              * structures.
  376.              */
  377.             uint16 subsampling[2];
  378.             TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, 
  379.                           subsampling + 0, subsampling + 1 );
  380. fprintf(fd, "  YCbCr Subsampling: %u, %un",
  381.                         subsampling[0], subsampling[1] );
  382.         }
  383. if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
  384. fprintf(fd, "  YCbCr Positioning: ");
  385. switch (td->td_ycbcrpositioning) {
  386. case YCBCRPOSITION_CENTERED:
  387. fprintf(fd, "centeredn");
  388. break;
  389. case YCBCRPOSITION_COSITED:
  390. fprintf(fd, "cositedn");
  391. break;
  392. default:
  393. fprintf(fd, "%u (0x%x)n",
  394.     td->td_ycbcrpositioning, td->td_ycbcrpositioning);
  395. break;
  396. }
  397. }
  398. if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
  399. fprintf(fd, "  Halftone Hints: light %u dark %un",
  400.     td->td_halftonehints[0], td->td_halftonehints[1]);
  401. if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
  402. fprintf(fd, "  Orientation: ");
  403. if (td->td_orientation < NORIENTNAMES)
  404. fprintf(fd, "%sn", orientNames[td->td_orientation]);
  405. else
  406. fprintf(fd, "%u (0x%x)n",
  407.     td->td_orientation, td->td_orientation);
  408. }
  409. if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
  410. fprintf(fd, "  Samples/Pixel: %un", td->td_samplesperpixel);
  411. if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
  412. fprintf(fd, "  Rows/Strip: ");
  413. if (td->td_rowsperstrip == (uint32) -1)
  414. fprintf(fd, "(infinite)n");
  415. else
  416. fprintf(fd, "%lun", (unsigned long) td->td_rowsperstrip);
  417. }
  418. if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
  419. fprintf(fd, "  Min Sample Value: %un", td->td_minsamplevalue);
  420. if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
  421. fprintf(fd, "  Max Sample Value: %un", td->td_maxsamplevalue);
  422. if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
  423. fprintf(fd, "  SMin Sample Value: %gn",
  424.     td->td_sminsamplevalue);
  425. if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
  426. fprintf(fd, "  SMax Sample Value: %gn",
  427.     td->td_smaxsamplevalue);
  428. if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
  429. fprintf(fd, "  Planar Configuration: ");
  430. switch (td->td_planarconfig) {
  431. case PLANARCONFIG_CONTIG:
  432. fprintf(fd, "single image planen");
  433. break;
  434. case PLANARCONFIG_SEPARATE:
  435. fprintf(fd, "separate image planesn");
  436. break;
  437. default:
  438. fprintf(fd, "%u (0x%x)n",
  439.     td->td_planarconfig, td->td_planarconfig);
  440. break;
  441. }
  442. }
  443. if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
  444. fprintf(fd, "  Page Number: %u-%un",
  445.     td->td_pagenumber[0], td->td_pagenumber[1]);
  446. if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
  447. fprintf(fd, "  Color Map: ");
  448. if (flags & TIFFPRINT_COLORMAP) {
  449. fprintf(fd, "n");
  450. n = 1L<<td->td_bitspersample;
  451. for (l = 0; l < n; l++)
  452. fprintf(fd, "   %5lu: %5u %5u %5un",
  453.     l,
  454.     td->td_colormap[0][l],
  455.     td->td_colormap[1][l],
  456.     td->td_colormap[2][l]);
  457. } else
  458. fprintf(fd, "(present)n");
  459. }
  460. if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
  461. fprintf(fd, "  Transfer Function: ");
  462. if (flags & TIFFPRINT_CURVES) {
  463. fprintf(fd, "n");
  464. n = 1L<<td->td_bitspersample;
  465. for (l = 0; l < n; l++) {
  466. fprintf(fd, "    %2lu: %5u",
  467.     l, td->td_transferfunction[0][l]);
  468. for (i = 1; i < td->td_samplesperpixel; i++)
  469. fprintf(fd, " %5u",
  470.     td->td_transferfunction[i][l]);
  471. fputc('n', fd);
  472. }
  473. } else
  474. fprintf(fd, "(present)n");
  475. }
  476. if (TIFFFieldSet(tif, FIELD_SUBIFD)) {
  477. fprintf(fd, "  SubIFD Offsets:");
  478. for (i = 0; i < td->td_nsubifd; i++)
  479. fprintf(fd, " %5lu", (long) td->td_subifd[i]);
  480. fputc('n', fd);
  481. }
  482.         /*
  483.         ** Custom tag support.
  484.         */
  485.         {
  486.             int  i;
  487.             short count;
  488.             count = (short) TIFFGetTagListCount(tif);
  489.             for(i = 0; i < count; i++) {
  490.                 ttag_t  tag = TIFFGetTagListEntry(tif, i);
  491.                 const TIFFFieldInfo *fip;
  492.                 uint16 value_count;
  493.                 int mem_alloc = 0;
  494.                 void *raw_data;
  495.                 fip = TIFFFieldWithTag(tif, tag);
  496.                 if(fip == NULL)
  497. continue;
  498. if(fip->field_passcount) {
  499. if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
  500. continue;
  501. } else {
  502. if (fip->field_readcount == TIFF_VARIABLE
  503.     || fip->field_readcount == TIFF_VARIABLE2)
  504. value_count = 1;
  505. else if (fip->field_readcount == TIFF_SPP)
  506. value_count = td->td_samplesperpixel;
  507. else
  508. value_count = fip->field_readcount;
  509. if ((fip->field_type == TIFF_ASCII
  510.      || fip->field_readcount == TIFF_VARIABLE
  511.      || fip->field_readcount == TIFF_VARIABLE2
  512.      || fip->field_readcount == TIFF_SPP
  513.      || value_count > 1)
  514.     && fip->field_tag != TIFFTAG_PAGENUMBER
  515.     && fip->field_tag != TIFFTAG_HALFTONEHINTS
  516.     && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING
  517.     && fip->field_tag != TIFFTAG_DOTRANGE) {
  518. if(TIFFGetField(tif, tag, &raw_data) != 1)
  519. continue;
  520. } else if (fip->field_tag != TIFFTAG_PAGENUMBER
  521.    && fip->field_tag != TIFFTAG_HALFTONEHINTS
  522.    && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING
  523.    && fip->field_tag != TIFFTAG_DOTRANGE) {
  524. raw_data = _TIFFmalloc(
  525. _TIFFDataSize(fip->field_type)
  526. * value_count);
  527. mem_alloc = 1;
  528. if(TIFFGetField(tif, tag, raw_data) != 1) {
  529. _TIFFfree(raw_data);
  530. continue;
  531. }
  532. } else {
  533. /* 
  534.  * XXX: Should be fixed and removed, see the
  535.  * notes related to TIFFTAG_PAGENUMBER,
  536.  * TIFFTAG_HALFTONEHINTS,
  537.  * TIFFTAG_YCBCRSUBSAMPLING and
  538.  * TIFFTAG_DOTRANGE tags in tif_dir.c. */
  539. char *tmp;
  540. raw_data = _TIFFmalloc(
  541. _TIFFDataSize(fip->field_type)
  542. * value_count);
  543. tmp =(char *) raw_data;
  544. mem_alloc = 1;
  545. if(TIFFGetField(tif, tag, tmp,
  546. tmp + _TIFFDataSize(fip->field_type)) != 1) {
  547. _TIFFfree(raw_data);
  548. continue;
  549. }
  550. }
  551. }
  552. /*
  553.  * Catch the tags which needs to be specially handled and
  554.  * pretty print them. If tag not handled in
  555.  * _TIFFPrettyPrintField() fall down and print it as any other
  556.  * tag.
  557.  */
  558. if (_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) {
  559. if(mem_alloc)
  560. _TIFFfree(raw_data);
  561. continue;
  562. }
  563. else
  564. _TIFFPrintField(fd, fip, value_count, raw_data);
  565. if(mem_alloc)
  566. _TIFFfree(raw_data);
  567.             }
  568.         }
  569.         
  570. if (tif->tif_tagmethods.printdir)
  571. (*tif->tif_tagmethods.printdir)(tif, fd, flags);
  572. if ((flags & TIFFPRINT_STRIPS) &&
  573.     TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
  574. tstrip_t s;
  575. fprintf(fd, "  %lu %s:n",
  576.     (long) td->td_nstrips,
  577.     isTiled(tif) ? "Tiles" : "Strips");
  578. for (s = 0; s < td->td_nstrips; s++)
  579. fprintf(fd, "    %3lu: [%8lu, %8lu]n",
  580.     (unsigned long) s,
  581.     (unsigned long) td->td_stripoffset[s],
  582.     (unsigned long) td->td_stripbytecount[s]);
  583. }
  584. }
  585. void
  586. _TIFFprintAscii(FILE* fd, const char* cp)
  587. {
  588. for (; *cp != ''; cp++) {
  589. const char* tp;
  590. if (isprint((int)*cp)) {
  591. fputc(*cp, fd);
  592. continue;
  593. }
  594. for (tp = "ttbbrrnnvv"; *tp; tp++)
  595. if (*tp++ == *cp)
  596. break;
  597. if (*tp)
  598. fprintf(fd, "\%c", *tp);
  599. else
  600. fprintf(fd, "\%03o", *cp & 0xff);
  601. }
  602. }
  603. void
  604. _TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
  605. {
  606. fprintf(fd, "  %s: "", name);
  607. _TIFFprintAscii(fd, value);
  608. fprintf(fd, ""n");
  609. }
  610. /* vim: set ts=8 sts=8 sw=8 noet: */