OLD | NEW |
1 /* $Id: tif_fax3.c,v 1.74 2012-06-21 02:01:31 fwarmerdam Exp $ */ | 1 /* $Id: tif_fax3.c,v 1.75 2015-08-30 20:49:55 erouault Exp $ */ |
2 | 2 |
3 /* | 3 /* |
4 * Copyright (c) 1990-1997 Sam Leffler | 4 * Copyright (c) 1990-1997 Sam Leffler |
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc. | 5 * Copyright (c) 1991-1997 Silicon Graphics, Inc. |
6 * | 6 * |
7 * Permission to use, copy, modify, distribute, and sell this software and | 7 * Permission to use, copy, modify, distribute, and sell this software and |
8 * its documentation for any purpose is hereby granted without fee, provided | 8 * its documentation for any purpose is hereby granted without fee, provided |
9 * that (i) the above copyright notices and this permission notice appear in | 9 * that (i) the above copyright notices and this permission notice appear in |
10 * all copies of the software and related documentation, and (ii) the names of | 10 * all copies of the software and related documentation, and (ii) the names of |
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or | 11 * Sam Leffler and Silicon Graphics may not be used in any advertising or |
12 * publicity relating to the software without the specific, prior written | 12 * publicity relating to the software without the specific, prior written |
13 * permission of Sam Leffler and Silicon Graphics. | 13 * permission of Sam Leffler and Silicon Graphics. |
14 * | 14 * |
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, | 15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, |
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY | 16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY |
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | 17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
18 * | 18 * |
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR | 19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR |
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, | 20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, |
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF | 22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF |
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | 23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
24 * OF THIS SOFTWARE. | 24 * OF THIS SOFTWARE. |
25 */ | 25 */ |
| 26 |
26 #include "tiffiop.h" | 27 #include "tiffiop.h" |
27 #ifdef CCITT_SUPPORT | 28 #ifdef CCITT_SUPPORT |
28 /* | 29 /* |
29 * TIFF Library. | 30 * TIFF Library. |
30 * | 31 * |
31 * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support. | 32 * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support. |
32 * | 33 * |
33 * This file contains support for decoding and encoding TIFF | 34 * This file contains support for decoding and encoding TIFF |
34 * compression algorithms 2, 3, 4, and 32771. | 35 * compression algorithms 2, 3, 4, and 32771. |
35 * | 36 * |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 /* | 363 /* |
363 * Bit-fill a row according to the white/black | 364 * Bit-fill a row according to the white/black |
364 * runs generated during G3/G4 decoding. | 365 * runs generated during G3/G4 decoding. |
365 */ | 366 */ |
366 void | 367 void |
367 _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) | 368 _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) |
368 { | 369 { |
369 static const unsigned char _fillmasks[] = | 370 static const unsigned char _fillmasks[] = |
370 { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; | 371 { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; |
371 unsigned char* cp; | 372 unsigned char* cp; |
372 » uint32 x, bx, run,bx_;/* add bx_ = 8-bx for avoid ms evc compiler bug*/ | 373 » uint32 x, bx, run; |
373 int32 n, nw; | 374 int32 n, nw; |
374 long* lp; | 375 long* lp; |
375 | 376 |
376 if ((erun-runs)&1) | 377 if ((erun-runs)&1) |
377 *erun++ = 0; | 378 *erun++ = 0; |
378 x = 0; | 379 x = 0; |
379 for (; runs < erun; runs += 2) { | 380 for (; runs < erun; runs += 2) { |
380 run = runs[0]; | 381 run = runs[0]; |
381 if (x+run > lastx || run > lastx ) | 382 if (x+run > lastx || run > lastx ) |
382 run = runs[0] = (uint32) (lastx - x); | 383 run = runs[0] = (uint32) (lastx - x); |
383 if (run) { | 384 if (run) { |
384 cp = buf + (x>>3); | 385 cp = buf + (x>>3); |
385 bx = x&7; | 386 bx = x&7; |
386 // » » if (run > 8-bx) { | 387 » » if (run > 8-bx) { |
387 // » » » if (bx) {» » » /* align to byte boundar
y */ | |
388 // » » » » *cp++ &= 0xff << (8-bx); | |
389 // » » » » run -= 8-bx; | |
390 // » » } | |
391 //Modify by Sunliang.Liu 20090804 | |
392 //Detail: For avoid ms evc compiler bug in WCE ARMV4(I) Release | |
393 » » bx_ = 8-bx; | |
394 » » if (run > bx_) { | |
395 if (bx) { /* align to byte boundary */ | 388 if (bx) { /* align to byte boundary */ |
396 » » » *cp++ &= 0xff << bx_; | 389 » » » *cp++ &= 0xff << (8-bx); |
397 » » » run -= bx_; | 390 » » » run -= 8-bx; |
398 } | 391 } |
399 if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ | 392 if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ |
400 if ((n/sizeof (long)) > 1) { | 393 if ((n/sizeof (long)) > 1) { |
401 /* | 394 /* |
402 * Align to longword boundary and fill. | 395 * Align to longword boundary and fill. |
403 */ | 396 */ |
404 for (; n && !isAligned(cp, long); n--) | 397 for (; n && !isAligned(cp, long); n--) |
405 *cp++ = 0x00; | 398 *cp++ = 0x00; |
406 lp = (long*) cp; | 399 lp = (long*) cp; |
407 nw = (int32)(n / sizeof (long)); | 400 nw = (int32)(n / sizeof (long)); |
408 n -= nw * sizeof (long); | 401 n -= nw * sizeof (long); |
409 do { | 402 do { |
410 *lp++ = 0L; | 403 *lp++ = 0L; |
411 } while (--nw); | 404 } while (--nw); |
412 cp = (unsigned char*) lp; | 405 cp = (unsigned char*) lp; |
413 } | 406 } |
414 #ifdef FAX3_DEBUG | |
415 printf("_TIFFFax3fillruns ZERO: %d\n",n); | |
416 #endif | |
417 ZERO(n, cp); | 407 ZERO(n, cp); |
418 run &= 7; | 408 run &= 7; |
419 } | 409 } |
420 if (run) | 410 if (run) |
421 cp[0] &= 0xff >> run; | 411 cp[0] &= 0xff >> run; |
422 } else | 412 } else |
423 cp[0] &= ~(_fillmasks[run]>>bx); | 413 cp[0] &= ~(_fillmasks[run]>>bx); |
424 x += runs[0]; | 414 x += runs[0]; |
425 } | 415 } |
426 run = runs[1]; | 416 run = runs[1]; |
(...skipping 15 matching lines...) Expand all Loading... |
442 for (; n && !isAligned(cp, long); n--) | 432 for (; n && !isAligned(cp, long); n--) |
443 *cp++ = 0xff; | 433 *cp++ = 0xff; |
444 lp = (long*) cp; | 434 lp = (long*) cp; |
445 nw = (int32)(n / sizeof (long)); | 435 nw = (int32)(n / sizeof (long)); |
446 n -= nw * sizeof (long); | 436 n -= nw * sizeof (long); |
447 do { | 437 do { |
448 *lp++ = -1L; | 438 *lp++ = -1L; |
449 } while (--nw); | 439 } while (--nw); |
450 cp = (unsigned char*) lp; | 440 cp = (unsigned char*) lp; |
451 } | 441 } |
452 #ifdef FAX3_DEBUG | |
453 printf("_TIFFFax3fillruns FILL: %d\n",n); | |
454 #endif | |
455 FILL(n, cp); | 442 FILL(n, cp); |
456 run &= 7; | 443 run &= 7; |
457 } | 444 } |
| 445 /* Explicit 0xff masking to make icc -check=conversions happ
y */ |
458 if (run) | 446 if (run) |
459 » » » cp[0] |= 0xff00 >> run; | 447 » » » cp[0] = (unsigned char)((cp[0] | (0xff00 >> run))&0xff); |
460 } else | 448 } else |
461 cp[0] |= _fillmasks[run]>>bx; | 449 cp[0] |= _fillmasks[run]>>bx; |
462 x += runs[1]; | 450 x += runs[1]; |
463 } | 451 } |
464 } | 452 } |
465 assert(x == lastx); | 453 assert(x == lastx); |
466 } | 454 } |
467 #undef ZERO | 455 #undef ZERO |
468 #undef FILL | 456 #undef FILL |
469 | 457 |
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1386 * Compression Scheme Support. | 1374 * Compression Scheme Support. |
1387 */ | 1375 */ |
1388 | 1376 |
1389 #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } | 1377 #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } |
1390 /* | 1378 /* |
1391 * Decode the requested amount of G4-encoded data. | 1379 * Decode the requested amount of G4-encoded data. |
1392 */ | 1380 */ |
1393 static int | 1381 static int |
1394 Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) | 1382 Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) |
1395 { | 1383 { |
1396 #ifdef FAX3_DEBUG | |
1397 FILE* file; | |
1398 #endif | |
1399 DECLARE_STATE_2D(tif, sp, "Fax4Decode"); | 1384 DECLARE_STATE_2D(tif, sp, "Fax4Decode"); |
1400 | |
1401 (void) s; | 1385 (void) s; |
1402 if (occ % sp->b.rowbytes) | 1386 if (occ % sp->b.rowbytes) |
1403 { | 1387 { |
1404 TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines
cannot be read"); | 1388 TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines
cannot be read"); |
1405 return (-1); | 1389 return (-1); |
1406 } | 1390 } |
1407 CACHE_STATE(tif, sp); | 1391 CACHE_STATE(tif, sp); |
1408 while (occ > 0) { | 1392 while (occ > 0) { |
1409 a0 = 0; | 1393 a0 = 0; |
1410 RunLength = 0; | 1394 RunLength = 0; |
1411 pa = thisrun = sp->curruns; | 1395 pa = thisrun = sp->curruns; |
1412 pb = sp->refruns; | 1396 pb = sp->refruns; |
1413 b1 = *pb++; | 1397 b1 = *pb++; |
1414 #ifdef FAX3_DEBUG | 1398 #ifdef FAX3_DEBUG |
1415 printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); | 1399 printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); |
1416 printf("-------------------- %d\n", tif->tif_row); | 1400 printf("-------------------- %d\n", tif->tif_row); |
1417 fflush(stdout); | 1401 fflush(stdout); |
1418 #endif | 1402 #endif |
1419 EXPAND2D(EOFG4); | 1403 EXPAND2D(EOFG4); |
1420 if (EOLcnt) | 1404 if (EOLcnt) |
1421 goto EOFG4; | 1405 goto EOFG4; |
1422 (*sp->fill)(buf, thisrun, pa, lastx); | 1406 (*sp->fill)(buf, thisrun, pa, lastx); |
1423 #ifdef FAX3_DEBUG | |
1424 file = fopen("fillbuf.txt", "a"); | |
1425 fwrite(buf, sp->b.rowbytes, 1, file); | |
1426 fclose(file); | |
1427 #endif | |
1428 SETVALUE(0); /* imaginary change for reference */ | 1407 SETVALUE(0); /* imaginary change for reference */ |
1429 SWAP(uint32*, sp->curruns, sp->refruns); | 1408 SWAP(uint32*, sp->curruns, sp->refruns); |
1430 buf += sp->b.rowbytes; | 1409 buf += sp->b.rowbytes; |
1431 occ -= sp->b.rowbytes; | 1410 occ -= sp->b.rowbytes; |
1432 sp->line++; | 1411 sp->line++; |
1433 continue; | 1412 continue; |
1434 EOFG4: | 1413 EOFG4: |
1435 NeedBits16( 13, BADG4 ); | 1414 NeedBits16( 13, BADG4 ); |
1436 BADG4: | 1415 BADG4: |
1437 #ifdef FAX3_DEBUG | 1416 #ifdef FAX3_DEBUG |
1438 if( GetBits(13) != 0x1001 ) | 1417 if( GetBits(13) != 0x1001 ) |
1439 fputs( "Bad EOFB\n", stderr ); | 1418 fputs( "Bad EOFB\n", stderr ); |
1440 #endif | 1419 #endif |
1441 ClrBits( 13 ); | 1420 ClrBits( 13 ); |
1442 (*sp->fill)(buf, thisrun, pa, lastx); | 1421 (*sp->fill)(buf, thisrun, pa, lastx); |
1443 #ifdef FAX3_DEBUG | |
1444 file = fopen("fillbuf.txt", "a"); | |
1445 fwrite(buf, sp->b.rowbytes, 1, file); | |
1446 fclose(file); | |
1447 #endif | |
1448 UNCACHE_STATE(tif, sp); | 1422 UNCACHE_STATE(tif, sp); |
1449 return ( sp->line ? 1 : -1); /* don't error on badly-terminat
ed strips */ | 1423 return ( sp->line ? 1 : -1); /* don't error on badly-terminat
ed strips */ |
1450 } | 1424 } |
1451 UNCACHE_STATE(tif, sp); | 1425 UNCACHE_STATE(tif, sp); |
1452 return (1); | 1426 return (1); |
1453 } | 1427 } |
1454 #undef SWAP | 1428 #undef SWAP |
1455 | 1429 |
1456 /* | 1430 /* |
1457 * Encode the requested amount of data. | 1431 * Encode the requested amount of data. |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1613 #endif /* CCITT_SUPPORT */ | 1587 #endif /* CCITT_SUPPORT */ |
1614 | 1588 |
1615 /* vim: set ts=8 sts=8 sw=8 noet: */ | 1589 /* vim: set ts=8 sts=8 sw=8 noet: */ |
1616 /* | 1590 /* |
1617 * Local Variables: | 1591 * Local Variables: |
1618 * mode: c | 1592 * mode: c |
1619 * c-basic-offset: 8 | 1593 * c-basic-offset: 8 |
1620 * fill-column: 78 | 1594 * fill-column: 78 |
1621 * End: | 1595 * End: |
1622 */ | 1596 */ |
1623 | |
OLD | NEW |