| OLD | NEW |
| 1 /* $Id: tif_luv.c,v 1.40 2015-06-21 01:09:09 bfriesen Exp $ */ | 1 /* $Id: tif_luv.c,v 1.40 2015-06-21 01:09:09 bfriesen Exp $ */ |
| 2 | 2 |
| 3 /* | 3 /* |
| 4 * Copyright (c) 1997 Greg Ward Larson | 4 * Copyright (c) 1997 Greg Ward Larson |
| 5 * Copyright (c) 1997 Silicon Graphics, Inc. | 5 * Copyright (c) 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 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 int rc; | 195 int rc; |
| 196 | 196 |
| 197 assert(s == 0); | 197 assert(s == 0); |
| 198 assert(sp != NULL); | 198 assert(sp != NULL); |
| 199 | 199 |
| 200 npixels = occ / sp->pixel_size; | 200 npixels = occ / sp->pixel_size; |
| 201 | 201 |
| 202 if (sp->user_datafmt == SGILOGDATAFMT_16BIT) | 202 if (sp->user_datafmt == SGILOGDATAFMT_16BIT) |
| 203 tp = (int16*) op; | 203 tp = (int16*) op; |
| 204 else { | 204 else { |
| 205 » » assert(sp->tbuflen >= npixels); | 205 » » if(sp->tbuflen < npixels) { |
| 206 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 207 » » » » » » "Translation buffer too short")
; |
| 208 » » » return (0); |
| 209 » » } |
| 206 tp = (int16*) sp->tbuf; | 210 tp = (int16*) sp->tbuf; |
| 207 } | 211 } |
| 208 _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); | 212 _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); |
| 209 | 213 |
| 210 bp = (unsigned char*) tif->tif_rawcp; | 214 bp = (unsigned char*) tif->tif_rawcp; |
| 211 cc = tif->tif_rawcc; | 215 cc = tif->tif_rawcc; |
| 212 /* get each byte string */ | 216 /* get each byte string */ |
| 213 for (shft = 2*8; (shft -= 8) >= 0; ) { | 217 for (shft = 2*8; (shft -= 8) >= 0; ) { |
| 214 » » for (i = 0; i < npixels && cc > 0; ) | 218 » » for (i = 0; i < npixels && cc > 0; ) { |
| 215 if (*bp >= 128) { /* run */ | 219 if (*bp >= 128) { /* run */ |
| 216 » » » » rc = *bp++ + (2-128); /* TODO: potential input
buffer overrun when decoding corrupt or truncated data */ | 220 » » » » if( cc < 2 ) |
| 221 » » » » » break; |
| 222 » » » » rc = *bp++ + (2-128); |
| 217 b = (int16)(*bp++ << shft); | 223 b = (int16)(*bp++ << shft); |
| 218 cc -= 2; | 224 cc -= 2; |
| 219 while (rc-- && i < npixels) | 225 while (rc-- && i < npixels) |
| 220 tp[i++] |= b; | 226 tp[i++] |= b; |
| 221 } else { /* non-run */ | 227 } else { /* non-run */ |
| 222 rc = *bp++; /* nul is noop */ | 228 rc = *bp++; /* nul is noop */ |
| 223 while (--cc && rc-- && i < npixels) | 229 while (--cc && rc-- && i < npixels) |
| 224 tp[i++] |= (int16)*bp++ << shft; | 230 tp[i++] |= (int16)*bp++ << shft; |
| 225 } | 231 } |
| 232 } |
| 226 if (i != npixels) { | 233 if (i != npixels) { |
| 227 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) | 234 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) |
| 228 TIFFErrorExt(tif->tif_clientdata, module, | 235 TIFFErrorExt(tif->tif_clientdata, module, |
| 229 "Not enough data at row %lu (short %I64d pixels)", | 236 "Not enough data at row %lu (short %I64d pixels)", |
| 230 (unsigned long) tif->tif_row, | 237 (unsigned long) tif->tif_row, |
| 231 (unsigned __int64) (npixels - i)); | 238 (unsigned __int64) (npixels - i)); |
| 232 #else | 239 #else |
| 233 TIFFErrorExt(tif->tif_clientdata, module, | 240 TIFFErrorExt(tif->tif_clientdata, module, |
| 234 "Not enough data at row %lu (short %llu pixels)", | 241 "Not enough data at row %lu (short %llu pixels)", |
| 235 (unsigned long) tif->tif_row, | 242 (unsigned long) tif->tif_row, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 261 uint32* tp; | 268 uint32* tp; |
| 262 | 269 |
| 263 assert(s == 0); | 270 assert(s == 0); |
| 264 assert(sp != NULL); | 271 assert(sp != NULL); |
| 265 | 272 |
| 266 npixels = occ / sp->pixel_size; | 273 npixels = occ / sp->pixel_size; |
| 267 | 274 |
| 268 if (sp->user_datafmt == SGILOGDATAFMT_RAW) | 275 if (sp->user_datafmt == SGILOGDATAFMT_RAW) |
| 269 tp = (uint32 *)op; | 276 tp = (uint32 *)op; |
| 270 else { | 277 else { |
| 271 » » assert(sp->tbuflen >= npixels); | 278 » » if(sp->tbuflen < npixels) { |
| 279 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 280 » » » » » » "Translation buffer too short")
; |
| 281 » » » return (0); |
| 282 » » } |
| 272 tp = (uint32 *) sp->tbuf; | 283 tp = (uint32 *) sp->tbuf; |
| 273 } | 284 } |
| 274 /* copy to array of uint32 */ | 285 /* copy to array of uint32 */ |
| 275 bp = (unsigned char*) tif->tif_rawcp; | 286 bp = (unsigned char*) tif->tif_rawcp; |
| 276 cc = tif->tif_rawcc; | 287 cc = tif->tif_rawcc; |
| 277 » for (i = 0; i < npixels && cc > 0; i++) { | 288 » for (i = 0; i < npixels && cc >= 3; i++) { |
| 278 tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2]; | 289 tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2]; |
| 279 bp += 3; | 290 bp += 3; |
| 280 cc -= 3; | 291 cc -= 3; |
| 281 } | 292 } |
| 282 tif->tif_rawcp = (uint8*) bp; | 293 tif->tif_rawcp = (uint8*) bp; |
| 283 tif->tif_rawcc = cc; | 294 tif->tif_rawcc = cc; |
| 284 if (i != npixels) { | 295 if (i != npixels) { |
| 285 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) | 296 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) |
| 286 TIFFErrorExt(tif->tif_clientdata, module, | 297 TIFFErrorExt(tif->tif_clientdata, module, |
| 287 "Not enough data at row %lu (short %I64d pixels)", | 298 "Not enough data at row %lu (short %I64d pixels)", |
| (...skipping 30 matching lines...) Expand all Loading... |
| 318 | 329 |
| 319 assert(s == 0); | 330 assert(s == 0); |
| 320 sp = DecoderState(tif); | 331 sp = DecoderState(tif); |
| 321 assert(sp != NULL); | 332 assert(sp != NULL); |
| 322 | 333 |
| 323 npixels = occ / sp->pixel_size; | 334 npixels = occ / sp->pixel_size; |
| 324 | 335 |
| 325 if (sp->user_datafmt == SGILOGDATAFMT_RAW) | 336 if (sp->user_datafmt == SGILOGDATAFMT_RAW) |
| 326 tp = (uint32*) op; | 337 tp = (uint32*) op; |
| 327 else { | 338 else { |
| 328 » » assert(sp->tbuflen >= npixels); | 339 » » if(sp->tbuflen < npixels) { |
| 340 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 341 » » » » » » "Translation buffer too short")
; |
| 342 » » » return (0); |
| 343 » » } |
| 329 tp = (uint32*) sp->tbuf; | 344 tp = (uint32*) sp->tbuf; |
| 330 } | 345 } |
| 331 _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); | 346 _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0])); |
| 332 | 347 |
| 333 bp = (unsigned char*) tif->tif_rawcp; | 348 bp = (unsigned char*) tif->tif_rawcp; |
| 334 cc = tif->tif_rawcc; | 349 cc = tif->tif_rawcc; |
| 335 /* get each byte string */ | 350 /* get each byte string */ |
| 336 for (shft = 4*8; (shft -= 8) >= 0; ) { | 351 for (shft = 4*8; (shft -= 8) >= 0; ) { |
| 337 » » for (i = 0; i < npixels && cc > 0; ) | 352 » » for (i = 0; i < npixels && cc > 0; ) { |
| 338 if (*bp >= 128) { /* run */ | 353 if (*bp >= 128) { /* run */ |
| 354 if( cc < 2 ) |
| 355 break; |
| 339 rc = *bp++ + (2-128); | 356 rc = *bp++ + (2-128); |
| 340 b = (uint32)*bp++ << shft; | 357 b = (uint32)*bp++ << shft; |
| 341 » » » » cc -= 2; /* TODO: potential input
buffer overrun when decoding corrupt or truncated data */ | 358 » » » » cc -= 2; |
| 342 while (rc-- && i < npixels) | 359 while (rc-- && i < npixels) |
| 343 tp[i++] |= b; | 360 tp[i++] |= b; |
| 344 } else { /* non-run */ | 361 } else { /* non-run */ |
| 345 rc = *bp++; /* nul is noop */ | 362 rc = *bp++; /* nul is noop */ |
| 346 while (--cc && rc-- && i < npixels) | 363 while (--cc && rc-- && i < npixels) |
| 347 tp[i++] |= (uint32)*bp++ << shft; | 364 tp[i++] |= (uint32)*bp++ << shft; |
| 348 } | 365 } |
| 366 } |
| 349 if (i != npixels) { | 367 if (i != npixels) { |
| 350 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) | 368 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) |
| 351 TIFFErrorExt(tif->tif_clientdata, module, | 369 TIFFErrorExt(tif->tif_clientdata, module, |
| 352 "Not enough data at row %lu (short %I64d pixels)", | 370 "Not enough data at row %lu (short %I64d pixels)", |
| 353 (unsigned long) tif->tif_row, | 371 (unsigned long) tif->tif_row, |
| 354 (unsigned __int64) (npixels - i)); | 372 (unsigned __int64) (npixels - i)); |
| 355 #else | 373 #else |
| 356 TIFFErrorExt(tif->tif_clientdata, module, | 374 TIFFErrorExt(tif->tif_clientdata, module, |
| 357 "Not enough data at row %lu (short %llu pixels)", | 375 "Not enough data at row %lu (short %llu pixels)", |
| 358 (unsigned long) tif->tif_row, | 376 (unsigned long) tif->tif_row, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 bp += rowlen, cc -= rowlen; | 424 bp += rowlen, cc -= rowlen; |
| 407 return (cc == 0); | 425 return (cc == 0); |
| 408 } | 426 } |
| 409 | 427 |
| 410 /* | 428 /* |
| 411 * Encode a row of 16-bit pixels. | 429 * Encode a row of 16-bit pixels. |
| 412 */ | 430 */ |
| 413 static int | 431 static int |
| 414 LogL16Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) | 432 LogL16Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) |
| 415 { | 433 { |
| 434 static const char module[] = "LogL16Encode"; |
| 416 LogLuvState* sp = EncoderState(tif); | 435 LogLuvState* sp = EncoderState(tif); |
| 417 int shft; | 436 int shft; |
| 418 tmsize_t i; | 437 tmsize_t i; |
| 419 tmsize_t j; | 438 tmsize_t j; |
| 420 tmsize_t npixels; | 439 tmsize_t npixels; |
| 421 uint8* op; | 440 uint8* op; |
| 422 int16* tp; | 441 int16* tp; |
| 423 int16 b; | 442 int16 b; |
| 424 tmsize_t occ; | 443 tmsize_t occ; |
| 425 int rc=0, mask; | 444 int rc=0, mask; |
| 426 tmsize_t beg; | 445 tmsize_t beg; |
| 427 | 446 |
| 428 assert(s == 0); | 447 assert(s == 0); |
| 429 assert(sp != NULL); | 448 assert(sp != NULL); |
| 430 npixels = cc / sp->pixel_size; | 449 npixels = cc / sp->pixel_size; |
| 431 | 450 |
| 432 if (sp->user_datafmt == SGILOGDATAFMT_16BIT) | 451 if (sp->user_datafmt == SGILOGDATAFMT_16BIT) |
| 433 tp = (int16*) bp; | 452 tp = (int16*) bp; |
| 434 else { | 453 else { |
| 435 tp = (int16*) sp->tbuf; | 454 tp = (int16*) sp->tbuf; |
| 436 » » assert(sp->tbuflen >= npixels); | 455 » » if(sp->tbuflen < npixels) { |
| 456 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 457 » » » » » » "Translation buffer too short")
; |
| 458 » » » return (0); |
| 459 » » } |
| 437 (*sp->tfunc)(sp, bp, npixels); | 460 (*sp->tfunc)(sp, bp, npixels); |
| 438 } | 461 } |
| 439 /* compress each byte string */ | 462 /* compress each byte string */ |
| 440 op = tif->tif_rawcp; | 463 op = tif->tif_rawcp; |
| 441 occ = tif->tif_rawdatasize - tif->tif_rawcc; | 464 occ = tif->tif_rawdatasize - tif->tif_rawcc; |
| 442 for (shft = 2*8; (shft -= 8) >= 0; ) | 465 for (shft = 2*8; (shft -= 8) >= 0; ) |
| 443 for (i = 0; i < npixels; i += rc) { | 466 for (i = 0; i < npixels; i += rc) { |
| 444 if (occ < 4) { | 467 if (occ < 4) { |
| 445 tif->tif_rawcp = op; | 468 tif->tif_rawcp = op; |
| 446 tif->tif_rawcc = tif->tif_rawdatasize - occ; | 469 tif->tif_rawcc = tif->tif_rawdatasize - occ; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 | 522 |
| 500 return (1); | 523 return (1); |
| 501 } | 524 } |
| 502 | 525 |
| 503 /* | 526 /* |
| 504 * Encode a row of 24-bit pixels. | 527 * Encode a row of 24-bit pixels. |
| 505 */ | 528 */ |
| 506 static int | 529 static int |
| 507 LogLuvEncode24(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) | 530 LogLuvEncode24(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) |
| 508 { | 531 { |
| 532 static const char module[] = "LogLuvEncode24"; |
| 509 LogLuvState* sp = EncoderState(tif); | 533 LogLuvState* sp = EncoderState(tif); |
| 510 tmsize_t i; | 534 tmsize_t i; |
| 511 tmsize_t npixels; | 535 tmsize_t npixels; |
| 512 tmsize_t occ; | 536 tmsize_t occ; |
| 513 uint8* op; | 537 uint8* op; |
| 514 uint32* tp; | 538 uint32* tp; |
| 515 | 539 |
| 516 assert(s == 0); | 540 assert(s == 0); |
| 517 assert(sp != NULL); | 541 assert(sp != NULL); |
| 518 npixels = cc / sp->pixel_size; | 542 npixels = cc / sp->pixel_size; |
| 519 | 543 |
| 520 if (sp->user_datafmt == SGILOGDATAFMT_RAW) | 544 if (sp->user_datafmt == SGILOGDATAFMT_RAW) |
| 521 tp = (uint32*) bp; | 545 tp = (uint32*) bp; |
| 522 else { | 546 else { |
| 523 tp = (uint32*) sp->tbuf; | 547 tp = (uint32*) sp->tbuf; |
| 524 » » assert(sp->tbuflen >= npixels); | 548 » » if(sp->tbuflen < npixels) { |
| 549 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 550 » » » » » » "Translation buffer too short")
; |
| 551 » » » return (0); |
| 552 » » } |
| 525 (*sp->tfunc)(sp, bp, npixels); | 553 (*sp->tfunc)(sp, bp, npixels); |
| 526 } | 554 } |
| 527 /* write out encoded pixels */ | 555 /* write out encoded pixels */ |
| 528 op = tif->tif_rawcp; | 556 op = tif->tif_rawcp; |
| 529 occ = tif->tif_rawdatasize - tif->tif_rawcc; | 557 occ = tif->tif_rawdatasize - tif->tif_rawcc; |
| 530 for (i = npixels; i--; ) { | 558 for (i = npixels; i--; ) { |
| 531 if (occ < 3) { | 559 if (occ < 3) { |
| 532 tif->tif_rawcp = op; | 560 tif->tif_rawcp = op; |
| 533 tif->tif_rawcc = tif->tif_rawdatasize - occ; | 561 tif->tif_rawcc = tif->tif_rawdatasize - occ; |
| 534 if (!TIFFFlushData1(tif)) | 562 if (!TIFFFlushData1(tif)) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 546 | 574 |
| 547 return (1); | 575 return (1); |
| 548 } | 576 } |
| 549 | 577 |
| 550 /* | 578 /* |
| 551 * Encode a row of 32-bit pixels. | 579 * Encode a row of 32-bit pixels. |
| 552 */ | 580 */ |
| 553 static int | 581 static int |
| 554 LogLuvEncode32(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) | 582 LogLuvEncode32(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) |
| 555 { | 583 { |
| 584 static const char module[] = "LogLuvEncode32"; |
| 556 LogLuvState* sp = EncoderState(tif); | 585 LogLuvState* sp = EncoderState(tif); |
| 557 int shft; | 586 int shft; |
| 558 tmsize_t i; | 587 tmsize_t i; |
| 559 tmsize_t j; | 588 tmsize_t j; |
| 560 tmsize_t npixels; | 589 tmsize_t npixels; |
| 561 uint8* op; | 590 uint8* op; |
| 562 uint32* tp; | 591 uint32* tp; |
| 563 uint32 b; | 592 uint32 b; |
| 564 tmsize_t occ; | 593 tmsize_t occ; |
| 565 int rc=0, mask; | 594 int rc=0, mask; |
| 566 tmsize_t beg; | 595 tmsize_t beg; |
| 567 | 596 |
| 568 assert(s == 0); | 597 assert(s == 0); |
| 569 assert(sp != NULL); | 598 assert(sp != NULL); |
| 570 | 599 |
| 571 npixels = cc / sp->pixel_size; | 600 npixels = cc / sp->pixel_size; |
| 572 | 601 |
| 573 if (sp->user_datafmt == SGILOGDATAFMT_RAW) | 602 if (sp->user_datafmt == SGILOGDATAFMT_RAW) |
| 574 tp = (uint32*) bp; | 603 tp = (uint32*) bp; |
| 575 else { | 604 else { |
| 576 tp = (uint32*) sp->tbuf; | 605 tp = (uint32*) sp->tbuf; |
| 577 » » assert(sp->tbuflen >= npixels); | 606 » » if(sp->tbuflen < npixels) { |
| 607 » » » TIFFErrorExt(tif->tif_clientdata, module, |
| 608 » » » » » » "Translation buffer too short")
; |
| 609 » » » return (0); |
| 610 » » } |
| 578 (*sp->tfunc)(sp, bp, npixels); | 611 (*sp->tfunc)(sp, bp, npixels); |
| 579 } | 612 } |
| 580 /* compress each byte string */ | 613 /* compress each byte string */ |
| 581 op = tif->tif_rawcp; | 614 op = tif->tif_rawcp; |
| 582 occ = tif->tif_rawdatasize - tif->tif_rawcc; | 615 occ = tif->tif_rawdatasize - tif->tif_rawcc; |
| 583 for (shft = 4*8; (shft -= 8) >= 0; ) | 616 for (shft = 4*8; (shft -= 8) >= 0; ) |
| 584 for (i = 0; i < npixels; i += rc) { | 617 for (i = 0; i < npixels; i += rc) { |
| 585 if (occ < 4) { | 618 if (occ < 4) { |
| 586 tif->tif_rawcp = op; | 619 tif->tif_rawcp = op; |
| 587 tif->tif_rawcc = tif->tif_rawdatasize - occ; | 620 tif->tif_rawcc = tif->tif_rawdatasize - occ; |
| (...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1688 #endif /* LOGLUV_SUPPORT */ | 1721 #endif /* LOGLUV_SUPPORT */ |
| 1689 | 1722 |
| 1690 /* vim: set ts=8 sts=8 sw=8 noet: */ | 1723 /* vim: set ts=8 sts=8 sw=8 noet: */ |
| 1691 /* | 1724 /* |
| 1692 * Local Variables: | 1725 * Local Variables: |
| 1693 * mode: c | 1726 * mode: c |
| 1694 * c-basic-offset: 8 | 1727 * c-basic-offset: 8 |
| 1695 * fill-column: 78 | 1728 * fill-column: 78 |
| 1696 * End: | 1729 * End: |
| 1697 */ | 1730 */ |
| OLD | NEW |