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

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_predict.c,v 1.11 2006/03/03 14:10:09 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.  * Predictor Tag Support (used by multiple codecs).
  29.  */
  30. #include "tiffiop.h"
  31. #include "tif_predict.h"
  32. #define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data)
  33. static void horAcc8(TIFF*, tidata_t, tsize_t);
  34. static void horAcc16(TIFF*, tidata_t, tsize_t);
  35. static void swabHorAcc16(TIFF*, tidata_t, tsize_t);
  36. static void horDiff8(TIFF*, tidata_t, tsize_t);
  37. static void horDiff16(TIFF*, tidata_t, tsize_t);
  38. static void fpAcc(TIFF*, tidata_t, tsize_t);
  39. static void fpDiff(TIFF*, tidata_t, tsize_t);
  40. static int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
  41. static int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
  42. static int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
  43. static int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
  44. static int
  45. PredictorSetup(TIFF* tif)
  46. {
  47. static const char module[] = "PredictorSetup";
  48. TIFFPredictorState* sp = PredictorState(tif);
  49. TIFFDirectory* td = &tif->tif_dir;
  50. switch (sp->predictor) /* no differencing */
  51. {
  52. case PREDICTOR_NONE:
  53. return 1;
  54. case PREDICTOR_HORIZONTAL:
  55. if (td->td_bitspersample != 8
  56.     && td->td_bitspersample != 16) {
  57. TIFFErrorExt(tif->tif_clientdata, module,
  58.     "Horizontal differencing "Predictor" not supported with %d-bit samples",
  59.   td->td_bitspersample);
  60. return 0;
  61. }
  62. break;
  63. case PREDICTOR_FLOATINGPOINT:
  64. if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP) {
  65. TIFFErrorExt(tif->tif_clientdata, module,
  66. "Floating point "Predictor" not supported with %d data format",
  67.   td->td_sampleformat);
  68. return 0;
  69. }
  70. break;
  71. default:
  72. TIFFErrorExt(tif->tif_clientdata, module,
  73.   ""Predictor" value %d not supported",
  74.   sp->predictor);
  75. return 0;
  76. }
  77. sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
  78.     td->td_samplesperpixel : 1);
  79. /*
  80.  * Calculate the scanline/tile-width size in bytes.
  81.  */
  82. if (isTiled(tif))
  83. sp->rowsize = TIFFTileRowSize(tif);
  84. else
  85. sp->rowsize = TIFFScanlineSize(tif);
  86. return 1;
  87. }
  88. static int
  89. PredictorSetupDecode(TIFF* tif)
  90. {
  91. TIFFPredictorState* sp = PredictorState(tif);
  92. TIFFDirectory* td = &tif->tif_dir;
  93. if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
  94. return 0;
  95. if (sp->predictor == 2) {
  96. switch (td->td_bitspersample) {
  97. case 8:  sp->pfunc = horAcc8; break;
  98. case 16: sp->pfunc = horAcc16; break;
  99. }
  100. /*
  101.  * Override default decoding method with one that does the
  102.  * predictor stuff.
  103.  */
  104. sp->coderow = tif->tif_decoderow;
  105. tif->tif_decoderow = PredictorDecodeRow;
  106. sp->codestrip = tif->tif_decodestrip;
  107. tif->tif_decodestrip = PredictorDecodeTile;
  108. sp->codetile = tif->tif_decodetile;
  109. tif->tif_decodetile = PredictorDecodeTile;
  110. /*
  111.  * If the data is horizontally differenced 16-bit data that
  112.  * requires byte-swapping, then it must be byte swapped before
  113.  * the accumulation step.  We do this with a special-purpose
  114.  * routine and override the normal post decoding logic that
  115.  * the library setup when the directory was read.
  116.  */
  117. if (tif->tif_flags & TIFF_SWAB) {
  118. if (sp->pfunc == horAcc16) {
  119. sp->pfunc = swabHorAcc16;
  120. tif->tif_postdecode = _TIFFNoPostDecode;
  121. } /* else handle 32-bit case... */
  122. }
  123. }
  124. else if (sp->predictor == 3) {
  125. sp->pfunc = fpAcc;
  126. /*
  127.  * Override default decoding method with one that does the
  128.  * predictor stuff.
  129.  */
  130. sp->coderow = tif->tif_decoderow;
  131. tif->tif_decoderow = PredictorDecodeRow;
  132. sp->codestrip = tif->tif_decodestrip;
  133. tif->tif_decodestrip = PredictorDecodeTile;
  134. sp->codetile = tif->tif_decodetile;
  135. tif->tif_decodetile = PredictorDecodeTile;
  136. /*
  137.  * The data should not be swapped outside of the floating
  138.  * point predictor, the accumulation routine should return
  139.  * byres in the native order.
  140.  */
  141. if (tif->tif_flags & TIFF_SWAB) {
  142. tif->tif_postdecode = _TIFFNoPostDecode;
  143. }
  144. /*
  145.  * Allocate buffer to keep the decoded bytes before
  146.  * rearranging in the ight order
  147.  */
  148. }
  149. return 1;
  150. }
  151. static int
  152. PredictorSetupEncode(TIFF* tif)
  153. {
  154. TIFFPredictorState* sp = PredictorState(tif);
  155. TIFFDirectory* td = &tif->tif_dir;
  156. if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
  157. return 0;
  158. if (sp->predictor == 2) {
  159. switch (td->td_bitspersample) {
  160. case 8:  sp->pfunc = horDiff8; break;
  161. case 16: sp->pfunc = horDiff16; break;
  162. }
  163. /*
  164.  * Override default encoding method with one that does the
  165.  * predictor stuff.
  166.  */
  167. sp->coderow = tif->tif_encoderow;
  168. tif->tif_encoderow = PredictorEncodeRow;
  169. sp->codestrip = tif->tif_encodestrip;
  170. tif->tif_encodestrip = PredictorEncodeTile;
  171. sp->codetile = tif->tif_encodetile;
  172. tif->tif_encodetile = PredictorEncodeTile;
  173. }
  174. else if (sp->predictor == 3) {
  175. sp->pfunc = fpDiff;
  176. /*
  177.  * Override default encoding method with one that does the
  178.  * predictor stuff.
  179.  */
  180. sp->coderow = tif->tif_encoderow;
  181. tif->tif_encoderow = PredictorEncodeRow;
  182. sp->codestrip = tif->tif_encodestrip;
  183. tif->tif_encodestrip = PredictorEncodeTile;
  184. sp->codetile = tif->tif_encodetile;
  185. tif->tif_encodetile = PredictorEncodeTile;
  186. }
  187. return 1;
  188. }
  189. #define REPEAT4(n, op)
  190.     switch (n) {
  191.     default: { int i; for (i = n-4; i > 0; i--) { op; } } 
  192.     case 4:  op;
  193.     case 3:  op;
  194.     case 2:  op;
  195.     case 1:  op;
  196.     case 0:  ;
  197.     }
  198. static void
  199. horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc)
  200. {
  201. tsize_t stride = PredictorState(tif)->stride;
  202. char* cp = (char*) cp0;
  203. if (cc > stride) {
  204. cc -= stride;
  205. /*
  206.  * Pipeline the most common cases.
  207.  */
  208. if (stride == 3)  {
  209. unsigned int cr = cp[0];
  210. unsigned int cg = cp[1];
  211. unsigned int cb = cp[2];
  212. do {
  213. cc -= 3, cp += 3;
  214. cp[0] = (char) (cr += cp[0]);
  215. cp[1] = (char) (cg += cp[1]);
  216. cp[2] = (char) (cb += cp[2]);
  217. } while ((int32) cc > 0);
  218. } else if (stride == 4)  {
  219. unsigned int cr = cp[0];
  220. unsigned int cg = cp[1];
  221. unsigned int cb = cp[2];
  222. unsigned int ca = cp[3];
  223. do {
  224. cc -= 4, cp += 4;
  225. cp[0] = (char) (cr += cp[0]);
  226. cp[1] = (char) (cg += cp[1]);
  227. cp[2] = (char) (cb += cp[2]);
  228. cp[3] = (char) (ca += cp[3]);
  229. } while ((int32) cc > 0);
  230. } else  {
  231. do {
  232. REPEAT4(stride, cp[stride] =
  233. (char) (cp[stride] + *cp); cp++)
  234. cc -= stride;
  235. } while ((int32) cc > 0);
  236. }
  237. }
  238. }
  239. static void
  240. swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
  241. {
  242. tsize_t stride = PredictorState(tif)->stride;
  243. uint16* wp = (uint16*) cp0;
  244. tsize_t wc = cc / 2;
  245. if (wc > stride) {
  246. TIFFSwabArrayOfShort(wp, wc);
  247. wc -= stride;
  248. do {
  249. REPEAT4(stride, wp[stride] += wp[0]; wp++)
  250. wc -= stride;
  251. } while ((int32) wc > 0);
  252. }
  253. }
  254. static void
  255. horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
  256. {
  257. tsize_t stride = PredictorState(tif)->stride;
  258. uint16* wp = (uint16*) cp0;
  259. tsize_t wc = cc / 2;
  260. if (wc > stride) {
  261. wc -= stride;
  262. do {
  263. REPEAT4(stride, wp[stride] += wp[0]; wp++)
  264. wc -= stride;
  265. } while ((int32) wc > 0);
  266. }
  267. }
  268. /*
  269.  * Floating point predictor accumulation routine.
  270.  */
  271. static void
  272. fpAcc(TIFF* tif, tidata_t cp0, tsize_t cc)
  273. {
  274. tsize_t stride = PredictorState(tif)->stride;
  275. uint32 bps = tif->tif_dir.td_bitspersample / 8;
  276. tsize_t wc = cc / bps;
  277. tsize_t count = cc;
  278. uint8 *cp = (uint8 *) cp0;
  279. uint8 *tmp = (uint8 *)_TIFFmalloc(cc);
  280. if (!tmp)
  281. return;
  282. while (count > stride) {
  283. REPEAT4(stride, cp[stride] += cp[0]; cp++)
  284. count -= stride;
  285. }
  286. _TIFFmemcpy(tmp, cp0, cc);
  287. cp = (uint8 *) cp0;
  288. for (count = 0; count < wc; count++) {
  289. uint32 byte;
  290. for (byte = 0; byte < bps; byte++) {
  291. #if WORDS_BIGENDIAN
  292. cp[bps * count + byte] = tmp[byte * wc + count];
  293. #else
  294. cp[bps * count + byte] =
  295. tmp[(bps - byte - 1) * wc + count];
  296. #endif
  297. }
  298. }
  299. _TIFFfree(tmp);
  300. }
  301. /*
  302.  * Decode a scanline and apply the predictor routine.
  303.  */
  304. static int
  305. PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
  306. {
  307. TIFFPredictorState *sp = PredictorState(tif);
  308. assert(sp != NULL);
  309. assert(sp->coderow != NULL);
  310. assert(sp->pfunc != NULL);
  311. if ((*sp->coderow)(tif, op0, occ0, s)) {
  312. (*sp->pfunc)(tif, op0, occ0);
  313. return 1;
  314. } else
  315. return 0;
  316. }
  317. /*
  318.  * Decode a tile/strip and apply the predictor routine.
  319.  * Note that horizontal differencing must be done on a
  320.  * row-by-row basis.  The width of a "row" has already
  321.  * been calculated at pre-decode time according to the
  322.  * strip/tile dimensions.
  323.  */
  324. static int
  325. PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
  326. {
  327. TIFFPredictorState *sp = PredictorState(tif);
  328. assert(sp != NULL);
  329. assert(sp->codetile != NULL);
  330. if ((*sp->codetile)(tif, op0, occ0, s)) {
  331. tsize_t rowsize = sp->rowsize;
  332. assert(rowsize > 0);
  333. assert(sp->pfunc != NULL);
  334. while ((long)occ0 > 0) {
  335. (*sp->pfunc)(tif, op0, (tsize_t) rowsize);
  336. occ0 -= rowsize;
  337. op0 += rowsize;
  338. }
  339. return 1;
  340. } else
  341. return 0;
  342. }
  343. static void
  344. horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc)
  345. {
  346. TIFFPredictorState* sp = PredictorState(tif);
  347. tsize_t stride = sp->stride;
  348. char* cp = (char*) cp0;
  349. if (cc > stride) {
  350. cc -= stride;
  351. /*
  352.  * Pipeline the most common cases.
  353.  */
  354. if (stride == 3) {
  355. int r1, g1, b1;
  356. int r2 = cp[0];
  357. int g2 = cp[1];
  358. int b2 = cp[2];
  359. do {
  360. r1 = cp[3]; cp[3] = r1-r2; r2 = r1;
  361. g1 = cp[4]; cp[4] = g1-g2; g2 = g1;
  362. b1 = cp[5]; cp[5] = b1-b2; b2 = b1;
  363. cp += 3;
  364. } while ((int32)(cc -= 3) > 0);
  365. } else if (stride == 4) {
  366. int r1, g1, b1, a1;
  367. int r2 = cp[0];
  368. int g2 = cp[1];
  369. int b2 = cp[2];
  370. int a2 = cp[3];
  371. do {
  372. r1 = cp[4]; cp[4] = r1-r2; r2 = r1;
  373. g1 = cp[5]; cp[5] = g1-g2; g2 = g1;
  374. b1 = cp[6]; cp[6] = b1-b2; b2 = b1;
  375. a1 = cp[7]; cp[7] = a1-a2; a2 = a1;
  376. cp += 4;
  377. } while ((int32)(cc -= 4) > 0);
  378. } else {
  379. cp += cc - 1;
  380. do {
  381. REPEAT4(stride, cp[stride] -= cp[0]; cp--)
  382. } while ((int32)(cc -= stride) > 0);
  383. }
  384. }
  385. }
  386. static void
  387. horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc)
  388. {
  389. TIFFPredictorState* sp = PredictorState(tif);
  390. tsize_t stride = sp->stride;
  391. int16 *wp = (int16*) cp0;
  392. tsize_t wc = cc/2;
  393. if (wc > stride) {
  394. wc -= stride;
  395. wp += wc - 1;
  396. do {
  397. REPEAT4(stride, wp[stride] -= wp[0]; wp--)
  398. wc -= stride;
  399. } while ((int32) wc > 0);
  400. }
  401. }
  402. /*
  403.  * Floating point predictor differencing routine.
  404.  */
  405. static void
  406. fpDiff(TIFF* tif, tidata_t cp0, tsize_t cc)
  407. {
  408. tsize_t stride = PredictorState(tif)->stride;
  409. uint32 bps = tif->tif_dir.td_bitspersample / 8;
  410. tsize_t wc = cc / bps;
  411. tsize_t count;
  412. uint8 *cp = (uint8 *) cp0;
  413. uint8 *tmp = (uint8 *)_TIFFmalloc(cc);
  414. if (!tmp)
  415. return;
  416. _TIFFmemcpy(tmp, cp0, cc);
  417. for (count = 0; count < wc; count++) {
  418. uint32 byte;
  419. for (byte = 0; byte < bps; byte++) {
  420. #if WORDS_BIGENDIAN
  421. cp[byte * wc + count] = tmp[bps * count + byte];
  422. #else
  423. cp[(bps - byte - 1) * wc + count] =
  424. tmp[bps * count + byte];
  425. #endif
  426. }
  427. }
  428. _TIFFfree(tmp);
  429. cp = (uint8 *) cp0;
  430. cp += cc - stride - 1;
  431. for (count = cc; count > stride; count -= stride)
  432. REPEAT4(stride, cp[stride] -= cp[0]; cp--)
  433. }
  434. static int
  435. PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
  436. {
  437. TIFFPredictorState *sp = PredictorState(tif);
  438. assert(sp != NULL);
  439. assert(sp->pfunc != NULL);
  440. assert(sp->coderow != NULL);
  441. /* XXX horizontal differencing alters user's data XXX */
  442. (*sp->pfunc)(tif, bp, cc);
  443. return (*sp->coderow)(tif, bp, cc, s);
  444. }
  445. static int
  446. PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s)
  447. {
  448. TIFFPredictorState *sp = PredictorState(tif);
  449. tsize_t cc = cc0, rowsize;
  450. unsigned char* bp = bp0;
  451. assert(sp != NULL);
  452. assert(sp->pfunc != NULL);
  453. assert(sp->codetile != NULL);
  454. rowsize = sp->rowsize;
  455. assert(rowsize > 0);
  456. while ((long)cc > 0) {
  457. (*sp->pfunc)(tif, bp, (tsize_t) rowsize);
  458. cc -= rowsize;
  459. bp += rowsize;
  460. }
  461. return (*sp->codetile)(tif, bp0, cc0, s);
  462. }
  463. #define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */
  464. static const TIFFFieldInfo predictFieldInfo[] = {
  465.     { TIFFTAG_PREDICTOR,  1, 1, TIFF_SHORT, FIELD_PREDICTOR,
  466.       FALSE, FALSE, "Predictor" },
  467. };
  468. #define N(a) (sizeof (a) / sizeof (a[0]))
  469. static int
  470. PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap)
  471. {
  472. TIFFPredictorState *sp = PredictorState(tif);
  473. assert(sp != NULL);
  474. assert(sp->vsetparent != NULL);
  475. switch (tag) {
  476. case TIFFTAG_PREDICTOR:
  477. sp->predictor = (uint16) va_arg(ap, int);
  478. TIFFSetFieldBit(tif, FIELD_PREDICTOR);
  479. break;
  480. default:
  481. return (*sp->vsetparent)(tif, tag, ap);
  482. }
  483. tif->tif_flags |= TIFF_DIRTYDIRECT;
  484. return 1;
  485. }
  486. static int
  487. PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap)
  488. {
  489. TIFFPredictorState *sp = PredictorState(tif);
  490. assert(sp != NULL);
  491. assert(sp->vgetparent != NULL);
  492. switch (tag) {
  493. case TIFFTAG_PREDICTOR:
  494. *va_arg(ap, uint16*) = sp->predictor;
  495. break;
  496. default:
  497. return (*sp->vgetparent)(tif, tag, ap);
  498. }
  499. return 1;
  500. }
  501. static void
  502. PredictorPrintDir(TIFF* tif, FILE* fd, long flags)
  503. {
  504. TIFFPredictorState* sp = PredictorState(tif);
  505. (void) flags;
  506. if (TIFFFieldSet(tif,FIELD_PREDICTOR)) {
  507. fprintf(fd, "  Predictor: ");
  508. switch (sp->predictor) {
  509. case 1: fprintf(fd, "none "); break;
  510. case 2: fprintf(fd, "horizontal differencing "); break;
  511. case 3: fprintf(fd, "floating point predictor "); break;
  512. }
  513. fprintf(fd, "%u (0x%x)n", sp->predictor, sp->predictor);
  514. }
  515. if (sp->printdir)
  516. (*sp->printdir)(tif, fd, flags);
  517. }
  518. int
  519. TIFFPredictorInit(TIFF* tif)
  520. {
  521. TIFFPredictorState* sp = PredictorState(tif);
  522. assert(sp != 0);
  523. /*
  524.  * Merge codec-specific tag information and
  525.  * override parent get/set field methods.
  526.  */
  527. _TIFFMergeFieldInfo(tif, predictFieldInfo, N(predictFieldInfo));
  528. sp->vgetparent = tif->tif_tagmethods.vgetfield;
  529. tif->tif_tagmethods.vgetfield =
  530.             PredictorVGetField;/* hook for predictor tag */
  531. sp->vsetparent = tif->tif_tagmethods.vsetfield;
  532. tif->tif_tagmethods.vsetfield =
  533.             PredictorVSetField;/* hook for predictor tag */
  534. sp->printdir = tif->tif_tagmethods.printdir;
  535. tif->tif_tagmethods.printdir =
  536.             PredictorPrintDir; /* hook for predictor tag */
  537. sp->setupdecode = tif->tif_setupdecode;
  538. tif->tif_setupdecode = PredictorSetupDecode;
  539. sp->setupencode = tif->tif_setupencode;
  540. tif->tif_setupencode = PredictorSetupEncode;
  541. sp->predictor = 1; /* default value */
  542. sp->pfunc = NULL; /* no predictor routine */
  543. return 1;
  544. }
  545. int
  546. TIFFPredictorCleanup(TIFF* tif)
  547. {
  548. TIFFPredictorState* sp = PredictorState(tif);
  549. assert(sp != 0);
  550. tif->tif_tagmethods.vgetfield = sp->vgetparent;
  551. tif->tif_tagmethods.vsetfield = sp->vsetparent;
  552. tif->tif_tagmethods.printdir = sp->printdir;
  553. tif->tif_setupdecode = sp->setupdecode;
  554. tif->tif_setupencode = sp->setupencode;
  555. return 1;
  556. }
  557. /* vim: set ts=8 sts=8 sw=8 noet: */