mirror of
https://gitlab.com/libtiff/libtiff.git
synced 2026-01-18 21:51:18 +01:00
Reformatting in libtiff/ using 'pre-commit run'
This commit is contained in:
committed by
Even Rouault
parent
5e6a5fd6fa
commit
42173d6ace
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -27,390 +27,214 @@
|
||||
* in Frank Cringle's viewfax program;
|
||||
* Copyright (C) 1990, 1995 Frank D. Cringle.
|
||||
*/
|
||||
#include "tif_config.h"
|
||||
#include "libport.h"
|
||||
#include "tif_config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "tif_fax3.h"
|
||||
|
||||
#define streq(a,b) (strcmp(a,b) == 0)
|
||||
#define streq(a, b) (strcmp(a, b) == 0)
|
||||
|
||||
/* NB: can't use names in tif_fax3.h 'cuz they are declared const */
|
||||
TIFFFaxTabEnt MainTable[128];
|
||||
TIFFFaxTabEnt WhiteTable[4096];
|
||||
TIFFFaxTabEnt BlackTable[8192];
|
||||
|
||||
struct proto {
|
||||
uint16_t code; /* right justified, lsb-first, zero filled */
|
||||
uint16_t val; /* (pixel count)<<4 + code width */
|
||||
struct proto
|
||||
{
|
||||
uint16_t code; /* right justified, lsb-first, zero filled */
|
||||
uint16_t val; /* (pixel count)<<4 + code width */
|
||||
};
|
||||
|
||||
static struct proto Pass[] = {
|
||||
{ 0x0008, 4 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto Pass[] = {{0x0008, 4}, {0, 0}};
|
||||
|
||||
static struct proto Horiz[] = {
|
||||
{ 0x0004, 3 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto Horiz[] = {{0x0004, 3}, {0, 0}};
|
||||
|
||||
static struct proto V0[] = {
|
||||
{ 0x0001, 1 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto V0[] = {{0x0001, 1}, {0, 0}};
|
||||
|
||||
static struct proto VR[] = {
|
||||
{ 0x0006, (1<<4)+3 },
|
||||
{ 0x0030, (2<<4)+6 },
|
||||
{ 0x0060, (3<<4)+7 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto VR[] = {{0x0006, (1 << 4) + 3},
|
||||
{0x0030, (2 << 4) + 6},
|
||||
{0x0060, (3 << 4) + 7},
|
||||
{0, 0}};
|
||||
|
||||
static struct proto VL[] = {
|
||||
{ 0x0002, (1<<4)+3 },
|
||||
{ 0x0010, (2<<4)+6 },
|
||||
{ 0x0020, (3<<4)+7 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto VL[] = {{0x0002, (1 << 4) + 3},
|
||||
{0x0010, (2 << 4) + 6},
|
||||
{0x0020, (3 << 4) + 7},
|
||||
{0, 0}};
|
||||
|
||||
static struct proto Ext[] = {
|
||||
{ 0x0040, 7 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto Ext[] = {{0x0040, 7}, {0, 0}};
|
||||
|
||||
static struct proto EOLV[] = {
|
||||
{ 0x0000, 7 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto EOLV[] = {{0x0000, 7}, {0, 0}};
|
||||
|
||||
static struct proto MakeUpW[] = {
|
||||
{ 0x001b, 1029 },
|
||||
{ 0x0009, 2053 },
|
||||
{ 0x003a, 3078 },
|
||||
{ 0x0076, 4103 },
|
||||
{ 0x006c, 5128 },
|
||||
{ 0x00ec, 6152 },
|
||||
{ 0x0026, 7176 },
|
||||
{ 0x00a6, 8200 },
|
||||
{ 0x0016, 9224 },
|
||||
{ 0x00e6, 10248 },
|
||||
{ 0x0066, 11273 },
|
||||
{ 0x0166, 12297 },
|
||||
{ 0x0096, 13321 },
|
||||
{ 0x0196, 14345 },
|
||||
{ 0x0056, 15369 },
|
||||
{ 0x0156, 16393 },
|
||||
{ 0x00d6, 17417 },
|
||||
{ 0x01d6, 18441 },
|
||||
{ 0x0036, 19465 },
|
||||
{ 0x0136, 20489 },
|
||||
{ 0x00b6, 21513 },
|
||||
{ 0x01b6, 22537 },
|
||||
{ 0x0032, 23561 },
|
||||
{ 0x0132, 24585 },
|
||||
{ 0x00b2, 25609 },
|
||||
{ 0x0006, 26630 },
|
||||
{ 0x01b2, 27657 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
{0x001b, 1029}, {0x0009, 2053}, {0x003a, 3078}, {0x0076, 4103},
|
||||
{0x006c, 5128}, {0x00ec, 6152}, {0x0026, 7176}, {0x00a6, 8200},
|
||||
{0x0016, 9224}, {0x00e6, 10248}, {0x0066, 11273}, {0x0166, 12297},
|
||||
{0x0096, 13321}, {0x0196, 14345}, {0x0056, 15369}, {0x0156, 16393},
|
||||
{0x00d6, 17417}, {0x01d6, 18441}, {0x0036, 19465}, {0x0136, 20489},
|
||||
{0x00b6, 21513}, {0x01b6, 22537}, {0x0032, 23561}, {0x0132, 24585},
|
||||
{0x00b2, 25609}, {0x0006, 26630}, {0x01b2, 27657}, {0, 0}};
|
||||
|
||||
static struct proto MakeUpB[] = {
|
||||
{ 0x03c0, 1034 },
|
||||
{ 0x0130, 2060 },
|
||||
{ 0x0930, 3084 },
|
||||
{ 0x0da0, 4108 },
|
||||
{ 0x0cc0, 5132 },
|
||||
{ 0x02c0, 6156 },
|
||||
{ 0x0ac0, 7180 },
|
||||
{ 0x06c0, 8205 },
|
||||
{ 0x16c0, 9229 },
|
||||
{ 0x0a40, 10253 },
|
||||
{ 0x1a40, 11277 },
|
||||
{ 0x0640, 12301 },
|
||||
{ 0x1640, 13325 },
|
||||
{ 0x09c0, 14349 },
|
||||
{ 0x19c0, 15373 },
|
||||
{ 0x05c0, 16397 },
|
||||
{ 0x15c0, 17421 },
|
||||
{ 0x0dc0, 18445 },
|
||||
{ 0x1dc0, 19469 },
|
||||
{ 0x0940, 20493 },
|
||||
{ 0x1940, 21517 },
|
||||
{ 0x0540, 22541 },
|
||||
{ 0x1540, 23565 },
|
||||
{ 0x0b40, 24589 },
|
||||
{ 0x1b40, 25613 },
|
||||
{ 0x04c0, 26637 },
|
||||
{ 0x14c0, 27661 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
{0x03c0, 1034}, {0x0130, 2060}, {0x0930, 3084}, {0x0da0, 4108},
|
||||
{0x0cc0, 5132}, {0x02c0, 6156}, {0x0ac0, 7180}, {0x06c0, 8205},
|
||||
{0x16c0, 9229}, {0x0a40, 10253}, {0x1a40, 11277}, {0x0640, 12301},
|
||||
{0x1640, 13325}, {0x09c0, 14349}, {0x19c0, 15373}, {0x05c0, 16397},
|
||||
{0x15c0, 17421}, {0x0dc0, 18445}, {0x1dc0, 19469}, {0x0940, 20493},
|
||||
{0x1940, 21517}, {0x0540, 22541}, {0x1540, 23565}, {0x0b40, 24589},
|
||||
{0x1b40, 25613}, {0x04c0, 26637}, {0x14c0, 27661}, {0, 0}};
|
||||
|
||||
static struct proto MakeUp[] = {
|
||||
{ 0x0080, 28683 },
|
||||
{ 0x0180, 29707 },
|
||||
{ 0x0580, 30731 },
|
||||
{ 0x0480, 31756 },
|
||||
{ 0x0c80, 32780 },
|
||||
{ 0x0280, 33804 },
|
||||
{ 0x0a80, 34828 },
|
||||
{ 0x0680, 35852 },
|
||||
{ 0x0e80, 36876 },
|
||||
{ 0x0380, 37900 },
|
||||
{ 0x0b80, 38924 },
|
||||
{ 0x0780, 39948 },
|
||||
{ 0x0f80, 40972 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
{0x0080, 28683}, {0x0180, 29707}, {0x0580, 30731}, {0x0480, 31756},
|
||||
{0x0c80, 32780}, {0x0280, 33804}, {0x0a80, 34828}, {0x0680, 35852},
|
||||
{0x0e80, 36876}, {0x0380, 37900}, {0x0b80, 38924}, {0x0780, 39948},
|
||||
{0x0f80, 40972}, {0, 0}};
|
||||
|
||||
static struct proto TermW[] = {
|
||||
{ 0x00ac, 8 },
|
||||
{ 0x0038, 22 },
|
||||
{ 0x000e, 36 },
|
||||
{ 0x0001, 52 },
|
||||
{ 0x000d, 68 },
|
||||
{ 0x0003, 84 },
|
||||
{ 0x0007, 100 },
|
||||
{ 0x000f, 116 },
|
||||
{ 0x0019, 133 },
|
||||
{ 0x0005, 149 },
|
||||
{ 0x001c, 165 },
|
||||
{ 0x0002, 181 },
|
||||
{ 0x0004, 198 },
|
||||
{ 0x0030, 214 },
|
||||
{ 0x000b, 230 },
|
||||
{ 0x002b, 246 },
|
||||
{ 0x0015, 262 },
|
||||
{ 0x0035, 278 },
|
||||
{ 0x0072, 295 },
|
||||
{ 0x0018, 311 },
|
||||
{ 0x0008, 327 },
|
||||
{ 0x0074, 343 },
|
||||
{ 0x0060, 359 },
|
||||
{ 0x0010, 375 },
|
||||
{ 0x000a, 391 },
|
||||
{ 0x006a, 407 },
|
||||
{ 0x0064, 423 },
|
||||
{ 0x0012, 439 },
|
||||
{ 0x000c, 455 },
|
||||
{ 0x0040, 472 },
|
||||
{ 0x00c0, 488 },
|
||||
{ 0x0058, 504 },
|
||||
{ 0x00d8, 520 },
|
||||
{ 0x0048, 536 },
|
||||
{ 0x00c8, 552 },
|
||||
{ 0x0028, 568 },
|
||||
{ 0x00a8, 584 },
|
||||
{ 0x0068, 600 },
|
||||
{ 0x00e8, 616 },
|
||||
{ 0x0014, 632 },
|
||||
{ 0x0094, 648 },
|
||||
{ 0x0054, 664 },
|
||||
{ 0x00d4, 680 },
|
||||
{ 0x0034, 696 },
|
||||
{ 0x00b4, 712 },
|
||||
{ 0x0020, 728 },
|
||||
{ 0x00a0, 744 },
|
||||
{ 0x0050, 760 },
|
||||
{ 0x00d0, 776 },
|
||||
{ 0x004a, 792 },
|
||||
{ 0x00ca, 808 },
|
||||
{ 0x002a, 824 },
|
||||
{ 0x00aa, 840 },
|
||||
{ 0x0024, 856 },
|
||||
{ 0x00a4, 872 },
|
||||
{ 0x001a, 888 },
|
||||
{ 0x009a, 904 },
|
||||
{ 0x005a, 920 },
|
||||
{ 0x00da, 936 },
|
||||
{ 0x0052, 952 },
|
||||
{ 0x00d2, 968 },
|
||||
{ 0x004c, 984 },
|
||||
{ 0x00cc, 1000 },
|
||||
{ 0x002c, 1016 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
{0x00ac, 8}, {0x0038, 22}, {0x000e, 36}, {0x0001, 52}, {0x000d, 68},
|
||||
{0x0003, 84}, {0x0007, 100}, {0x000f, 116}, {0x0019, 133}, {0x0005, 149},
|
||||
{0x001c, 165}, {0x0002, 181}, {0x0004, 198}, {0x0030, 214}, {0x000b, 230},
|
||||
{0x002b, 246}, {0x0015, 262}, {0x0035, 278}, {0x0072, 295}, {0x0018, 311},
|
||||
{0x0008, 327}, {0x0074, 343}, {0x0060, 359}, {0x0010, 375}, {0x000a, 391},
|
||||
{0x006a, 407}, {0x0064, 423}, {0x0012, 439}, {0x000c, 455}, {0x0040, 472},
|
||||
{0x00c0, 488}, {0x0058, 504}, {0x00d8, 520}, {0x0048, 536}, {0x00c8, 552},
|
||||
{0x0028, 568}, {0x00a8, 584}, {0x0068, 600}, {0x00e8, 616}, {0x0014, 632},
|
||||
{0x0094, 648}, {0x0054, 664}, {0x00d4, 680}, {0x0034, 696}, {0x00b4, 712},
|
||||
{0x0020, 728}, {0x00a0, 744}, {0x0050, 760}, {0x00d0, 776}, {0x004a, 792},
|
||||
{0x00ca, 808}, {0x002a, 824}, {0x00aa, 840}, {0x0024, 856}, {0x00a4, 872},
|
||||
{0x001a, 888}, {0x009a, 904}, {0x005a, 920}, {0x00da, 936}, {0x0052, 952},
|
||||
{0x00d2, 968}, {0x004c, 984}, {0x00cc, 1000}, {0x002c, 1016}, {0, 0}};
|
||||
|
||||
static struct proto TermB[] = {
|
||||
{ 0x03b0, 10 },
|
||||
{ 0x0002, 19 },
|
||||
{ 0x0003, 34 },
|
||||
{ 0x0001, 50 },
|
||||
{ 0x0006, 67 },
|
||||
{ 0x000c, 84 },
|
||||
{ 0x0004, 100 },
|
||||
{ 0x0018, 117 },
|
||||
{ 0x0028, 134 },
|
||||
{ 0x0008, 150 },
|
||||
{ 0x0010, 167 },
|
||||
{ 0x0050, 183 },
|
||||
{ 0x0070, 199 },
|
||||
{ 0x0020, 216 },
|
||||
{ 0x00e0, 232 },
|
||||
{ 0x0030, 249 },
|
||||
{ 0x03a0, 266 },
|
||||
{ 0x0060, 282 },
|
||||
{ 0x0040, 298 },
|
||||
{ 0x0730, 315 },
|
||||
{ 0x00b0, 331 },
|
||||
{ 0x01b0, 347 },
|
||||
{ 0x0760, 363 },
|
||||
{ 0x00a0, 379 },
|
||||
{ 0x0740, 395 },
|
||||
{ 0x00c0, 411 },
|
||||
{ 0x0530, 428 },
|
||||
{ 0x0d30, 444 },
|
||||
{ 0x0330, 460 },
|
||||
{ 0x0b30, 476 },
|
||||
{ 0x0160, 492 },
|
||||
{ 0x0960, 508 },
|
||||
{ 0x0560, 524 },
|
||||
{ 0x0d60, 540 },
|
||||
{ 0x04b0, 556 },
|
||||
{ 0x0cb0, 572 },
|
||||
{ 0x02b0, 588 },
|
||||
{ 0x0ab0, 604 },
|
||||
{ 0x06b0, 620 },
|
||||
{ 0x0eb0, 636 },
|
||||
{ 0x0360, 652 },
|
||||
{ 0x0b60, 668 },
|
||||
{ 0x05b0, 684 },
|
||||
{ 0x0db0, 700 },
|
||||
{ 0x02a0, 716 },
|
||||
{ 0x0aa0, 732 },
|
||||
{ 0x06a0, 748 },
|
||||
{ 0x0ea0, 764 },
|
||||
{ 0x0260, 780 },
|
||||
{ 0x0a60, 796 },
|
||||
{ 0x04a0, 812 },
|
||||
{ 0x0ca0, 828 },
|
||||
{ 0x0240, 844 },
|
||||
{ 0x0ec0, 860 },
|
||||
{ 0x01c0, 876 },
|
||||
{ 0x0e40, 892 },
|
||||
{ 0x0140, 908 },
|
||||
{ 0x01a0, 924 },
|
||||
{ 0x09a0, 940 },
|
||||
{ 0x0d40, 956 },
|
||||
{ 0x0340, 972 },
|
||||
{ 0x05a0, 988 },
|
||||
{ 0x0660, 1004 },
|
||||
{ 0x0e60, 1020 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
{0x03b0, 10}, {0x0002, 19}, {0x0003, 34}, {0x0001, 50}, {0x0006, 67},
|
||||
{0x000c, 84}, {0x0004, 100}, {0x0018, 117}, {0x0028, 134}, {0x0008, 150},
|
||||
{0x0010, 167}, {0x0050, 183}, {0x0070, 199}, {0x0020, 216}, {0x00e0, 232},
|
||||
{0x0030, 249}, {0x03a0, 266}, {0x0060, 282}, {0x0040, 298}, {0x0730, 315},
|
||||
{0x00b0, 331}, {0x01b0, 347}, {0x0760, 363}, {0x00a0, 379}, {0x0740, 395},
|
||||
{0x00c0, 411}, {0x0530, 428}, {0x0d30, 444}, {0x0330, 460}, {0x0b30, 476},
|
||||
{0x0160, 492}, {0x0960, 508}, {0x0560, 524}, {0x0d60, 540}, {0x04b0, 556},
|
||||
{0x0cb0, 572}, {0x02b0, 588}, {0x0ab0, 604}, {0x06b0, 620}, {0x0eb0, 636},
|
||||
{0x0360, 652}, {0x0b60, 668}, {0x05b0, 684}, {0x0db0, 700}, {0x02a0, 716},
|
||||
{0x0aa0, 732}, {0x06a0, 748}, {0x0ea0, 764}, {0x0260, 780}, {0x0a60, 796},
|
||||
{0x04a0, 812}, {0x0ca0, 828}, {0x0240, 844}, {0x0ec0, 860}, {0x01c0, 876},
|
||||
{0x0e40, 892}, {0x0140, 908}, {0x01a0, 924}, {0x09a0, 940}, {0x0d40, 956},
|
||||
{0x0340, 972}, {0x05a0, 988}, {0x0660, 1004}, {0x0e60, 1020}, {0, 0}};
|
||||
|
||||
static struct proto EOLH[] = {
|
||||
{ 0x0000, 11 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
static struct proto EOLH[] = {{0x0000, 11}, {0, 0}};
|
||||
|
||||
static void
|
||||
FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State)
|
||||
static void FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State)
|
||||
{
|
||||
int limit = 1 << Size;
|
||||
|
||||
while (P->val) {
|
||||
int width = P->val & 15;
|
||||
int param = P->val >> 4;
|
||||
int incr = 1 << width;
|
||||
int code;
|
||||
for (code = P->code; code < limit; code += incr) {
|
||||
TIFFFaxTabEnt *E = T+code;
|
||||
E->State = State;
|
||||
E->Width = width;
|
||||
E->Param = param;
|
||||
}
|
||||
P++;
|
||||
while (P->val)
|
||||
{
|
||||
int width = P->val & 15;
|
||||
int param = P->val >> 4;
|
||||
int incr = 1 << width;
|
||||
int code;
|
||||
for (code = P->code; code < limit; code += incr)
|
||||
{
|
||||
TIFFFaxTabEnt *E = T + code;
|
||||
E->State = State;
|
||||
E->Width = width;
|
||||
E->Param = param;
|
||||
}
|
||||
P++;
|
||||
}
|
||||
}
|
||||
|
||||
static char* storage_class = "";
|
||||
static char* const_class = "";
|
||||
static int packoutput = 1;
|
||||
static char* prebrace = "";
|
||||
static char* postbrace = "";
|
||||
static char *storage_class = "";
|
||||
static char *const_class = "";
|
||||
static int packoutput = 1;
|
||||
static char *prebrace = "";
|
||||
static char *postbrace = "";
|
||||
|
||||
void
|
||||
WriteTable(FILE* fd, const TIFFFaxTabEnt* T, int Size, const char* name)
|
||||
void WriteTable(FILE *fd, const TIFFFaxTabEnt *T, int Size, const char *name)
|
||||
{
|
||||
int i;
|
||||
char* sep;
|
||||
char *sep;
|
||||
|
||||
fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {",
|
||||
storage_class, const_class, name, Size);
|
||||
if (packoutput) {
|
||||
sep = "\n";
|
||||
for (i = 0; i < Size; i++) {
|
||||
fprintf(fd, "%s%s%d,%d,%d%s",
|
||||
sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
|
||||
if (((i+1) % 10) == 0)
|
||||
sep = ",\n";
|
||||
else
|
||||
sep = ",";
|
||||
T++;
|
||||
}
|
||||
} else {
|
||||
sep = "\n ";
|
||||
for (i = 0; i < Size; i++) {
|
||||
fprintf(fd, "%s%s%3d,%3d,%4d%s",
|
||||
sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
|
||||
if (((i+1) % 6) == 0)
|
||||
sep = ",\n ";
|
||||
else
|
||||
sep = ",";
|
||||
T++;
|
||||
}
|
||||
fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {", storage_class, const_class,
|
||||
name, Size);
|
||||
if (packoutput)
|
||||
{
|
||||
sep = "\n";
|
||||
for (i = 0; i < Size; i++)
|
||||
{
|
||||
fprintf(fd, "%s%s%d,%d,%d%s", sep, prebrace, T->State, T->Width,
|
||||
(int)T->Param, postbrace);
|
||||
if (((i + 1) % 10) == 0)
|
||||
sep = ",\n";
|
||||
else
|
||||
sep = ",";
|
||||
T++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sep = "\n ";
|
||||
for (i = 0; i < Size; i++)
|
||||
{
|
||||
fprintf(fd, "%s%s%3d,%3d,%4d%s", sep, prebrace, T->State, T->Width,
|
||||
(int)T->Param, postbrace);
|
||||
if (((i + 1) % 6) == 0)
|
||||
sep = ",\n ";
|
||||
else
|
||||
sep = ",";
|
||||
T++;
|
||||
}
|
||||
}
|
||||
fprintf(fd, "\n};\n");
|
||||
}
|
||||
|
||||
/* initialise the huffman code tables */
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE* fd;
|
||||
char* outputfile;
|
||||
FILE *fd;
|
||||
char *outputfile;
|
||||
int c;
|
||||
|
||||
#if !HAVE_DECL_OPTARG
|
||||
extern int optind;
|
||||
extern char* optarg;
|
||||
extern char *optarg;
|
||||
#endif
|
||||
|
||||
while ((c = getopt(argc, argv, "c:s:bp")) != -1)
|
||||
switch (c) {
|
||||
case 'c':
|
||||
const_class = optarg;
|
||||
break;
|
||||
case 's':
|
||||
storage_class = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
packoutput = 0;
|
||||
break;
|
||||
case 'b':
|
||||
prebrace = "{";
|
||||
postbrace = "}";
|
||||
break;
|
||||
case '?':
|
||||
fprintf(stderr,
|
||||
"usage: %s [-c const] [-s storage] [-p] [-b] file\n",
|
||||
argv[0]);
|
||||
return (-1);
|
||||
}
|
||||
switch (c)
|
||||
{
|
||||
case 'c':
|
||||
const_class = optarg;
|
||||
break;
|
||||
case 's':
|
||||
storage_class = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
packoutput = 0;
|
||||
break;
|
||||
case 'b':
|
||||
prebrace = "{";
|
||||
postbrace = "}";
|
||||
break;
|
||||
case '?':
|
||||
fprintf(stderr,
|
||||
"usage: %s [-c const] [-s storage] [-p] [-b] file\n",
|
||||
argv[0]);
|
||||
return (-1);
|
||||
}
|
||||
outputfile = optind < argc ? argv[optind] : "g3states.h";
|
||||
fd = fopen(outputfile, "w");
|
||||
if (fd == NULL) {
|
||||
fprintf(stderr, "%s: %s: Cannot create output file.\n",
|
||||
argv[0], outputfile);
|
||||
return (-2);
|
||||
if (fd == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: %s: Cannot create output file.\n", argv[0],
|
||||
outputfile);
|
||||
return (-2);
|
||||
}
|
||||
FillTable(MainTable, 7, Pass, S_Pass);
|
||||
FillTable(MainTable, 7, Horiz, S_Horiz);
|
||||
|
||||
@@ -2,70 +2,75 @@
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Hack program to construct tables used to find
|
||||
* runs of zeros and ones in Group 3 Fax encoding.
|
||||
*/
|
||||
|
||||
dumparray(name, runs)
|
||||
char *name;
|
||||
unsigned char runs[256];
|
||||
dumparray(name, runs) char *name;
|
||||
unsigned char runs[256];
|
||||
{
|
||||
int i;
|
||||
char *sep;
|
||||
printf("static unsigned char %s[256] = {\n", name);
|
||||
sep = " ";
|
||||
for (i = 0; i < 256; i++) {
|
||||
printf("%s%d", sep, runs[i]);
|
||||
if (((i + 1) % 16) == 0) {
|
||||
printf(", /* 0x%02x - 0x%02x */\n", i-15, i);
|
||||
sep = " ";
|
||||
} else
|
||||
sep = ", ";
|
||||
}
|
||||
printf("\n};\n");
|
||||
int i;
|
||||
char *sep;
|
||||
printf("static unsigned char %s[256] = {\n", name);
|
||||
sep = " ";
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
printf("%s%d", sep, runs[i]);
|
||||
if (((i + 1) % 16) == 0)
|
||||
{
|
||||
printf(", /* 0x%02x - 0x%02x */\n", i - 15, i);
|
||||
sep = " ";
|
||||
}
|
||||
else
|
||||
sep = ", ";
|
||||
}
|
||||
printf("\n};\n");
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
unsigned char runs[2][256];
|
||||
unsigned char runs[2][256];
|
||||
|
||||
memset(runs[0], 0, 256*sizeof (char));
|
||||
memset(runs[1], 0, 256*sizeof (char));
|
||||
{ register int run, runlen, i;
|
||||
runlen = 1;
|
||||
for (run = 0x80; run != 0xff; run = (run>>1)|0x80) {
|
||||
for (i = run-1; i >= 0; i--) {
|
||||
runs[1][run|i] = runlen;
|
||||
runs[0][(~(run|i)) & 0xff] = runlen;
|
||||
}
|
||||
runlen++;
|
||||
}
|
||||
runs[1][0xff] = runs[0][0] = 8;
|
||||
}
|
||||
dumparray("bruns", runs[0]);
|
||||
dumparray("wruns", runs[1]);
|
||||
memset(runs[0], 0, 256 * sizeof(char));
|
||||
memset(runs[1], 0, 256 * sizeof(char));
|
||||
{
|
||||
register int run, runlen, i;
|
||||
runlen = 1;
|
||||
for (run = 0x80; run != 0xff; run = (run >> 1) | 0x80)
|
||||
{
|
||||
for (i = run - 1; i >= 0; i--)
|
||||
{
|
||||
runs[1][run | i] = runlen;
|
||||
runs[0][(~(run | i)) & 0xff] = runlen;
|
||||
}
|
||||
runlen++;
|
||||
}
|
||||
runs[1][0xff] = runs[0][0] = 8;
|
||||
}
|
||||
dumparray("bruns", runs[0]);
|
||||
dumparray("wruns", runs[1]);
|
||||
}
|
||||
|
||||
457
libtiff/t4.h
457
libtiff/t4.h
@@ -23,26 +23,27 @@
|
||||
*/
|
||||
|
||||
#ifndef _T4_
|
||||
#define _T4_
|
||||
#define _T4_
|
||||
/*
|
||||
* CCITT T.4 1D Huffman runlength codes and
|
||||
* related definitions. Given the small sizes
|
||||
* of these tables it does not seem
|
||||
* worthwhile to make code & length 8 bits.
|
||||
*/
|
||||
typedef struct tableentry {
|
||||
unsigned short length; /* bit length of g3 code */
|
||||
unsigned short code; /* g3 code */
|
||||
short runlen; /* run length in bits */
|
||||
typedef struct tableentry
|
||||
{
|
||||
unsigned short length; /* bit length of g3 code */
|
||||
unsigned short code; /* g3 code */
|
||||
short runlen; /* run length in bits */
|
||||
} tableentry;
|
||||
|
||||
#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
|
||||
#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
|
||||
|
||||
/* status values returned instead of a run length */
|
||||
#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
|
||||
#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
|
||||
#define G3CODE_EOF -3 /* end of input data */
|
||||
#define G3CODE_INCOMP -4 /* incomplete run code */
|
||||
#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
|
||||
#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
|
||||
#define G3CODE_EOF -3 /* end of input data */
|
||||
#define G3CODE_INCOMP -4 /* incomplete run code */
|
||||
|
||||
/*
|
||||
* Note that these tables are ordered such that the
|
||||
@@ -54,227 +55,227 @@ typedef struct tableentry {
|
||||
*/
|
||||
#ifdef G3CODES
|
||||
const tableentry TIFFFaxWhiteCodes[] = {
|
||||
{ 8, 0x35, 0 }, /* 0011 0101 */
|
||||
{ 6, 0x7, 1 }, /* 0001 11 */
|
||||
{ 4, 0x7, 2 }, /* 0111 */
|
||||
{ 4, 0x8, 3 }, /* 1000 */
|
||||
{ 4, 0xB, 4 }, /* 1011 */
|
||||
{ 4, 0xC, 5 }, /* 1100 */
|
||||
{ 4, 0xE, 6 }, /* 1110 */
|
||||
{ 4, 0xF, 7 }, /* 1111 */
|
||||
{ 5, 0x13, 8 }, /* 1001 1 */
|
||||
{ 5, 0x14, 9 }, /* 1010 0 */
|
||||
{ 5, 0x7, 10 }, /* 0011 1 */
|
||||
{ 5, 0x8, 11 }, /* 0100 0 */
|
||||
{ 6, 0x8, 12 }, /* 0010 00 */
|
||||
{ 6, 0x3, 13 }, /* 0000 11 */
|
||||
{ 6, 0x34, 14 }, /* 1101 00 */
|
||||
{ 6, 0x35, 15 }, /* 1101 01 */
|
||||
{ 6, 0x2A, 16 }, /* 1010 10 */
|
||||
{ 6, 0x2B, 17 }, /* 1010 11 */
|
||||
{ 7, 0x27, 18 }, /* 0100 111 */
|
||||
{ 7, 0xC, 19 }, /* 0001 100 */
|
||||
{ 7, 0x8, 20 }, /* 0001 000 */
|
||||
{ 7, 0x17, 21 }, /* 0010 111 */
|
||||
{ 7, 0x3, 22 }, /* 0000 011 */
|
||||
{ 7, 0x4, 23 }, /* 0000 100 */
|
||||
{ 7, 0x28, 24 }, /* 0101 000 */
|
||||
{ 7, 0x2B, 25 }, /* 0101 011 */
|
||||
{ 7, 0x13, 26 }, /* 0010 011 */
|
||||
{ 7, 0x24, 27 }, /* 0100 100 */
|
||||
{ 7, 0x18, 28 }, /* 0011 000 */
|
||||
{ 8, 0x2, 29 }, /* 0000 0010 */
|
||||
{ 8, 0x3, 30 }, /* 0000 0011 */
|
||||
{ 8, 0x1A, 31 }, /* 0001 1010 */
|
||||
{ 8, 0x1B, 32 }, /* 0001 1011 */
|
||||
{ 8, 0x12, 33 }, /* 0001 0010 */
|
||||
{ 8, 0x13, 34 }, /* 0001 0011 */
|
||||
{ 8, 0x14, 35 }, /* 0001 0100 */
|
||||
{ 8, 0x15, 36 }, /* 0001 0101 */
|
||||
{ 8, 0x16, 37 }, /* 0001 0110 */
|
||||
{ 8, 0x17, 38 }, /* 0001 0111 */
|
||||
{ 8, 0x28, 39 }, /* 0010 1000 */
|
||||
{ 8, 0x29, 40 }, /* 0010 1001 */
|
||||
{ 8, 0x2A, 41 }, /* 0010 1010 */
|
||||
{ 8, 0x2B, 42 }, /* 0010 1011 */
|
||||
{ 8, 0x2C, 43 }, /* 0010 1100 */
|
||||
{ 8, 0x2D, 44 }, /* 0010 1101 */
|
||||
{ 8, 0x4, 45 }, /* 0000 0100 */
|
||||
{ 8, 0x5, 46 }, /* 0000 0101 */
|
||||
{ 8, 0xA, 47 }, /* 0000 1010 */
|
||||
{ 8, 0xB, 48 }, /* 0000 1011 */
|
||||
{ 8, 0x52, 49 }, /* 0101 0010 */
|
||||
{ 8, 0x53, 50 }, /* 0101 0011 */
|
||||
{ 8, 0x54, 51 }, /* 0101 0100 */
|
||||
{ 8, 0x55, 52 }, /* 0101 0101 */
|
||||
{ 8, 0x24, 53 }, /* 0010 0100 */
|
||||
{ 8, 0x25, 54 }, /* 0010 0101 */
|
||||
{ 8, 0x58, 55 }, /* 0101 1000 */
|
||||
{ 8, 0x59, 56 }, /* 0101 1001 */
|
||||
{ 8, 0x5A, 57 }, /* 0101 1010 */
|
||||
{ 8, 0x5B, 58 }, /* 0101 1011 */
|
||||
{ 8, 0x4A, 59 }, /* 0100 1010 */
|
||||
{ 8, 0x4B, 60 }, /* 0100 1011 */
|
||||
{ 8, 0x32, 61 }, /* 0011 0010 */
|
||||
{ 8, 0x33, 62 }, /* 0011 0011 */
|
||||
{ 8, 0x34, 63 }, /* 0011 0100 */
|
||||
{ 5, 0x1B, 64 }, /* 1101 1 */
|
||||
{ 5, 0x12, 128 }, /* 1001 0 */
|
||||
{ 6, 0x17, 192 }, /* 0101 11 */
|
||||
{ 7, 0x37, 256 }, /* 0110 111 */
|
||||
{ 8, 0x36, 320 }, /* 0011 0110 */
|
||||
{ 8, 0x37, 384 }, /* 0011 0111 */
|
||||
{ 8, 0x64, 448 }, /* 0110 0100 */
|
||||
{ 8, 0x65, 512 }, /* 0110 0101 */
|
||||
{ 8, 0x68, 576 }, /* 0110 1000 */
|
||||
{ 8, 0x67, 640 }, /* 0110 0111 */
|
||||
{ 9, 0xCC, 704 }, /* 0110 0110 0 */
|
||||
{ 9, 0xCD, 768 }, /* 0110 0110 1 */
|
||||
{ 9, 0xD2, 832 }, /* 0110 1001 0 */
|
||||
{ 9, 0xD3, 896 }, /* 0110 1001 1 */
|
||||
{ 9, 0xD4, 960 }, /* 0110 1010 0 */
|
||||
{ 9, 0xD5, 1024 }, /* 0110 1010 1 */
|
||||
{ 9, 0xD6, 1088 }, /* 0110 1011 0 */
|
||||
{ 9, 0xD7, 1152 }, /* 0110 1011 1 */
|
||||
{ 9, 0xD8, 1216 }, /* 0110 1100 0 */
|
||||
{ 9, 0xD9, 1280 }, /* 0110 1100 1 */
|
||||
{ 9, 0xDA, 1344 }, /* 0110 1101 0 */
|
||||
{ 9, 0xDB, 1408 }, /* 0110 1101 1 */
|
||||
{ 9, 0x98, 1472 }, /* 0100 1100 0 */
|
||||
{ 9, 0x99, 1536 }, /* 0100 1100 1 */
|
||||
{ 9, 0x9A, 1600 }, /* 0100 1101 0 */
|
||||
{ 6, 0x18, 1664 }, /* 0110 00 */
|
||||
{ 9, 0x9B, 1728 }, /* 0100 1101 1 */
|
||||
{ 11, 0x8, 1792 }, /* 0000 0001 000 */
|
||||
{ 11, 0xC, 1856 }, /* 0000 0001 100 */
|
||||
{ 11, 0xD, 1920 }, /* 0000 0001 101 */
|
||||
{ 12, 0x12, 1984 }, /* 0000 0001 0010 */
|
||||
{ 12, 0x13, 2048 }, /* 0000 0001 0011 */
|
||||
{ 12, 0x14, 2112 }, /* 0000 0001 0100 */
|
||||
{ 12, 0x15, 2176 }, /* 0000 0001 0101 */
|
||||
{ 12, 0x16, 2240 }, /* 0000 0001 0110 */
|
||||
{ 12, 0x17, 2304 }, /* 0000 0001 0111 */
|
||||
{ 12, 0x1C, 2368 }, /* 0000 0001 1100 */
|
||||
{ 12, 0x1D, 2432 }, /* 0000 0001 1101 */
|
||||
{ 12, 0x1E, 2496 }, /* 0000 0001 1110 */
|
||||
{ 12, 0x1F, 2560 }, /* 0000 0001 1111 */
|
||||
{ 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
|
||||
{ 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
|
||||
{ 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
|
||||
{ 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
|
||||
{ 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
|
||||
{8, 0x35, 0}, /* 0011 0101 */
|
||||
{6, 0x7, 1}, /* 0001 11 */
|
||||
{4, 0x7, 2}, /* 0111 */
|
||||
{4, 0x8, 3}, /* 1000 */
|
||||
{4, 0xB, 4}, /* 1011 */
|
||||
{4, 0xC, 5}, /* 1100 */
|
||||
{4, 0xE, 6}, /* 1110 */
|
||||
{4, 0xF, 7}, /* 1111 */
|
||||
{5, 0x13, 8}, /* 1001 1 */
|
||||
{5, 0x14, 9}, /* 1010 0 */
|
||||
{5, 0x7, 10}, /* 0011 1 */
|
||||
{5, 0x8, 11}, /* 0100 0 */
|
||||
{6, 0x8, 12}, /* 0010 00 */
|
||||
{6, 0x3, 13}, /* 0000 11 */
|
||||
{6, 0x34, 14}, /* 1101 00 */
|
||||
{6, 0x35, 15}, /* 1101 01 */
|
||||
{6, 0x2A, 16}, /* 1010 10 */
|
||||
{6, 0x2B, 17}, /* 1010 11 */
|
||||
{7, 0x27, 18}, /* 0100 111 */
|
||||
{7, 0xC, 19}, /* 0001 100 */
|
||||
{7, 0x8, 20}, /* 0001 000 */
|
||||
{7, 0x17, 21}, /* 0010 111 */
|
||||
{7, 0x3, 22}, /* 0000 011 */
|
||||
{7, 0x4, 23}, /* 0000 100 */
|
||||
{7, 0x28, 24}, /* 0101 000 */
|
||||
{7, 0x2B, 25}, /* 0101 011 */
|
||||
{7, 0x13, 26}, /* 0010 011 */
|
||||
{7, 0x24, 27}, /* 0100 100 */
|
||||
{7, 0x18, 28}, /* 0011 000 */
|
||||
{8, 0x2, 29}, /* 0000 0010 */
|
||||
{8, 0x3, 30}, /* 0000 0011 */
|
||||
{8, 0x1A, 31}, /* 0001 1010 */
|
||||
{8, 0x1B, 32}, /* 0001 1011 */
|
||||
{8, 0x12, 33}, /* 0001 0010 */
|
||||
{8, 0x13, 34}, /* 0001 0011 */
|
||||
{8, 0x14, 35}, /* 0001 0100 */
|
||||
{8, 0x15, 36}, /* 0001 0101 */
|
||||
{8, 0x16, 37}, /* 0001 0110 */
|
||||
{8, 0x17, 38}, /* 0001 0111 */
|
||||
{8, 0x28, 39}, /* 0010 1000 */
|
||||
{8, 0x29, 40}, /* 0010 1001 */
|
||||
{8, 0x2A, 41}, /* 0010 1010 */
|
||||
{8, 0x2B, 42}, /* 0010 1011 */
|
||||
{8, 0x2C, 43}, /* 0010 1100 */
|
||||
{8, 0x2D, 44}, /* 0010 1101 */
|
||||
{8, 0x4, 45}, /* 0000 0100 */
|
||||
{8, 0x5, 46}, /* 0000 0101 */
|
||||
{8, 0xA, 47}, /* 0000 1010 */
|
||||
{8, 0xB, 48}, /* 0000 1011 */
|
||||
{8, 0x52, 49}, /* 0101 0010 */
|
||||
{8, 0x53, 50}, /* 0101 0011 */
|
||||
{8, 0x54, 51}, /* 0101 0100 */
|
||||
{8, 0x55, 52}, /* 0101 0101 */
|
||||
{8, 0x24, 53}, /* 0010 0100 */
|
||||
{8, 0x25, 54}, /* 0010 0101 */
|
||||
{8, 0x58, 55}, /* 0101 1000 */
|
||||
{8, 0x59, 56}, /* 0101 1001 */
|
||||
{8, 0x5A, 57}, /* 0101 1010 */
|
||||
{8, 0x5B, 58}, /* 0101 1011 */
|
||||
{8, 0x4A, 59}, /* 0100 1010 */
|
||||
{8, 0x4B, 60}, /* 0100 1011 */
|
||||
{8, 0x32, 61}, /* 0011 0010 */
|
||||
{8, 0x33, 62}, /* 0011 0011 */
|
||||
{8, 0x34, 63}, /* 0011 0100 */
|
||||
{5, 0x1B, 64}, /* 1101 1 */
|
||||
{5, 0x12, 128}, /* 1001 0 */
|
||||
{6, 0x17, 192}, /* 0101 11 */
|
||||
{7, 0x37, 256}, /* 0110 111 */
|
||||
{8, 0x36, 320}, /* 0011 0110 */
|
||||
{8, 0x37, 384}, /* 0011 0111 */
|
||||
{8, 0x64, 448}, /* 0110 0100 */
|
||||
{8, 0x65, 512}, /* 0110 0101 */
|
||||
{8, 0x68, 576}, /* 0110 1000 */
|
||||
{8, 0x67, 640}, /* 0110 0111 */
|
||||
{9, 0xCC, 704}, /* 0110 0110 0 */
|
||||
{9, 0xCD, 768}, /* 0110 0110 1 */
|
||||
{9, 0xD2, 832}, /* 0110 1001 0 */
|
||||
{9, 0xD3, 896}, /* 0110 1001 1 */
|
||||
{9, 0xD4, 960}, /* 0110 1010 0 */
|
||||
{9, 0xD5, 1024}, /* 0110 1010 1 */
|
||||
{9, 0xD6, 1088}, /* 0110 1011 0 */
|
||||
{9, 0xD7, 1152}, /* 0110 1011 1 */
|
||||
{9, 0xD8, 1216}, /* 0110 1100 0 */
|
||||
{9, 0xD9, 1280}, /* 0110 1100 1 */
|
||||
{9, 0xDA, 1344}, /* 0110 1101 0 */
|
||||
{9, 0xDB, 1408}, /* 0110 1101 1 */
|
||||
{9, 0x98, 1472}, /* 0100 1100 0 */
|
||||
{9, 0x99, 1536}, /* 0100 1100 1 */
|
||||
{9, 0x9A, 1600}, /* 0100 1101 0 */
|
||||
{6, 0x18, 1664}, /* 0110 00 */
|
||||
{9, 0x9B, 1728}, /* 0100 1101 1 */
|
||||
{11, 0x8, 1792}, /* 0000 0001 000 */
|
||||
{11, 0xC, 1856}, /* 0000 0001 100 */
|
||||
{11, 0xD, 1920}, /* 0000 0001 101 */
|
||||
{12, 0x12, 1984}, /* 0000 0001 0010 */
|
||||
{12, 0x13, 2048}, /* 0000 0001 0011 */
|
||||
{12, 0x14, 2112}, /* 0000 0001 0100 */
|
||||
{12, 0x15, 2176}, /* 0000 0001 0101 */
|
||||
{12, 0x16, 2240}, /* 0000 0001 0110 */
|
||||
{12, 0x17, 2304}, /* 0000 0001 0111 */
|
||||
{12, 0x1C, 2368}, /* 0000 0001 1100 */
|
||||
{12, 0x1D, 2432}, /* 0000 0001 1101 */
|
||||
{12, 0x1E, 2496}, /* 0000 0001 1110 */
|
||||
{12, 0x1F, 2560}, /* 0000 0001 1111 */
|
||||
{12, 0x1, G3CODE_EOL}, /* 0000 0000 0001 */
|
||||
{9, 0x1, G3CODE_INVALID}, /* 0000 0000 1 */
|
||||
{10, 0x1, G3CODE_INVALID}, /* 0000 0000 01 */
|
||||
{11, 0x1, G3CODE_INVALID}, /* 0000 0000 001 */
|
||||
{12, 0x0, G3CODE_INVALID}, /* 0000 0000 0000 */
|
||||
};
|
||||
|
||||
const tableentry TIFFFaxBlackCodes[] = {
|
||||
{ 10, 0x37, 0 }, /* 0000 1101 11 */
|
||||
{ 3, 0x2, 1 }, /* 010 */
|
||||
{ 2, 0x3, 2 }, /* 11 */
|
||||
{ 2, 0x2, 3 }, /* 10 */
|
||||
{ 3, 0x3, 4 }, /* 011 */
|
||||
{ 4, 0x3, 5 }, /* 0011 */
|
||||
{ 4, 0x2, 6 }, /* 0010 */
|
||||
{ 5, 0x3, 7 }, /* 0001 1 */
|
||||
{ 6, 0x5, 8 }, /* 0001 01 */
|
||||
{ 6, 0x4, 9 }, /* 0001 00 */
|
||||
{ 7, 0x4, 10 }, /* 0000 100 */
|
||||
{ 7, 0x5, 11 }, /* 0000 101 */
|
||||
{ 7, 0x7, 12 }, /* 0000 111 */
|
||||
{ 8, 0x4, 13 }, /* 0000 0100 */
|
||||
{ 8, 0x7, 14 }, /* 0000 0111 */
|
||||
{ 9, 0x18, 15 }, /* 0000 1100 0 */
|
||||
{ 10, 0x17, 16 }, /* 0000 0101 11 */
|
||||
{ 10, 0x18, 17 }, /* 0000 0110 00 */
|
||||
{ 10, 0x8, 18 }, /* 0000 0010 00 */
|
||||
{ 11, 0x67, 19 }, /* 0000 1100 111 */
|
||||
{ 11, 0x68, 20 }, /* 0000 1101 000 */
|
||||
{ 11, 0x6C, 21 }, /* 0000 1101 100 */
|
||||
{ 11, 0x37, 22 }, /* 0000 0110 111 */
|
||||
{ 11, 0x28, 23 }, /* 0000 0101 000 */
|
||||
{ 11, 0x17, 24 }, /* 0000 0010 111 */
|
||||
{ 11, 0x18, 25 }, /* 0000 0011 000 */
|
||||
{ 12, 0xCA, 26 }, /* 0000 1100 1010 */
|
||||
{ 12, 0xCB, 27 }, /* 0000 1100 1011 */
|
||||
{ 12, 0xCC, 28 }, /* 0000 1100 1100 */
|
||||
{ 12, 0xCD, 29 }, /* 0000 1100 1101 */
|
||||
{ 12, 0x68, 30 }, /* 0000 0110 1000 */
|
||||
{ 12, 0x69, 31 }, /* 0000 0110 1001 */
|
||||
{ 12, 0x6A, 32 }, /* 0000 0110 1010 */
|
||||
{ 12, 0x6B, 33 }, /* 0000 0110 1011 */
|
||||
{ 12, 0xD2, 34 }, /* 0000 1101 0010 */
|
||||
{ 12, 0xD3, 35 }, /* 0000 1101 0011 */
|
||||
{ 12, 0xD4, 36 }, /* 0000 1101 0100 */
|
||||
{ 12, 0xD5, 37 }, /* 0000 1101 0101 */
|
||||
{ 12, 0xD6, 38 }, /* 0000 1101 0110 */
|
||||
{ 12, 0xD7, 39 }, /* 0000 1101 0111 */
|
||||
{ 12, 0x6C, 40 }, /* 0000 0110 1100 */
|
||||
{ 12, 0x6D, 41 }, /* 0000 0110 1101 */
|
||||
{ 12, 0xDA, 42 }, /* 0000 1101 1010 */
|
||||
{ 12, 0xDB, 43 }, /* 0000 1101 1011 */
|
||||
{ 12, 0x54, 44 }, /* 0000 0101 0100 */
|
||||
{ 12, 0x55, 45 }, /* 0000 0101 0101 */
|
||||
{ 12, 0x56, 46 }, /* 0000 0101 0110 */
|
||||
{ 12, 0x57, 47 }, /* 0000 0101 0111 */
|
||||
{ 12, 0x64, 48 }, /* 0000 0110 0100 */
|
||||
{ 12, 0x65, 49 }, /* 0000 0110 0101 */
|
||||
{ 12, 0x52, 50 }, /* 0000 0101 0010 */
|
||||
{ 12, 0x53, 51 }, /* 0000 0101 0011 */
|
||||
{ 12, 0x24, 52 }, /* 0000 0010 0100 */
|
||||
{ 12, 0x37, 53 }, /* 0000 0011 0111 */
|
||||
{ 12, 0x38, 54 }, /* 0000 0011 1000 */
|
||||
{ 12, 0x27, 55 }, /* 0000 0010 0111 */
|
||||
{ 12, 0x28, 56 }, /* 0000 0010 1000 */
|
||||
{ 12, 0x58, 57 }, /* 0000 0101 1000 */
|
||||
{ 12, 0x59, 58 }, /* 0000 0101 1001 */
|
||||
{ 12, 0x2B, 59 }, /* 0000 0010 1011 */
|
||||
{ 12, 0x2C, 60 }, /* 0000 0010 1100 */
|
||||
{ 12, 0x5A, 61 }, /* 0000 0101 1010 */
|
||||
{ 12, 0x66, 62 }, /* 0000 0110 0110 */
|
||||
{ 12, 0x67, 63 }, /* 0000 0110 0111 */
|
||||
{ 10, 0xF, 64 }, /* 0000 0011 11 */
|
||||
{ 12, 0xC8, 128 }, /* 0000 1100 1000 */
|
||||
{ 12, 0xC9, 192 }, /* 0000 1100 1001 */
|
||||
{ 12, 0x5B, 256 }, /* 0000 0101 1011 */
|
||||
{ 12, 0x33, 320 }, /* 0000 0011 0011 */
|
||||
{ 12, 0x34, 384 }, /* 0000 0011 0100 */
|
||||
{ 12, 0x35, 448 }, /* 0000 0011 0101 */
|
||||
{ 13, 0x6C, 512 }, /* 0000 0011 0110 0 */
|
||||
{ 13, 0x6D, 576 }, /* 0000 0011 0110 1 */
|
||||
{ 13, 0x4A, 640 }, /* 0000 0010 0101 0 */
|
||||
{ 13, 0x4B, 704 }, /* 0000 0010 0101 1 */
|
||||
{ 13, 0x4C, 768 }, /* 0000 0010 0110 0 */
|
||||
{ 13, 0x4D, 832 }, /* 0000 0010 0110 1 */
|
||||
{ 13, 0x72, 896 }, /* 0000 0011 1001 0 */
|
||||
{ 13, 0x73, 960 }, /* 0000 0011 1001 1 */
|
||||
{ 13, 0x74, 1024 }, /* 0000 0011 1010 0 */
|
||||
{ 13, 0x75, 1088 }, /* 0000 0011 1010 1 */
|
||||
{ 13, 0x76, 1152 }, /* 0000 0011 1011 0 */
|
||||
{ 13, 0x77, 1216 }, /* 0000 0011 1011 1 */
|
||||
{ 13, 0x52, 1280 }, /* 0000 0010 1001 0 */
|
||||
{ 13, 0x53, 1344 }, /* 0000 0010 1001 1 */
|
||||
{ 13, 0x54, 1408 }, /* 0000 0010 1010 0 */
|
||||
{ 13, 0x55, 1472 }, /* 0000 0010 1010 1 */
|
||||
{ 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */
|
||||
{ 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */
|
||||
{ 13, 0x64, 1664 }, /* 0000 0011 0010 0 */
|
||||
{ 13, 0x65, 1728 }, /* 0000 0011 0010 1 */
|
||||
{ 11, 0x8, 1792 }, /* 0000 0001 000 */
|
||||
{ 11, 0xC, 1856 }, /* 0000 0001 100 */
|
||||
{ 11, 0xD, 1920 }, /* 0000 0001 101 */
|
||||
{ 12, 0x12, 1984 }, /* 0000 0001 0010 */
|
||||
{ 12, 0x13, 2048 }, /* 0000 0001 0011 */
|
||||
{ 12, 0x14, 2112 }, /* 0000 0001 0100 */
|
||||
{ 12, 0x15, 2176 }, /* 0000 0001 0101 */
|
||||
{ 12, 0x16, 2240 }, /* 0000 0001 0110 */
|
||||
{ 12, 0x17, 2304 }, /* 0000 0001 0111 */
|
||||
{ 12, 0x1C, 2368 }, /* 0000 0001 1100 */
|
||||
{ 12, 0x1D, 2432 }, /* 0000 0001 1101 */
|
||||
{ 12, 0x1E, 2496 }, /* 0000 0001 1110 */
|
||||
{ 12, 0x1F, 2560 }, /* 0000 0001 1111 */
|
||||
{ 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
|
||||
{ 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
|
||||
{ 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
|
||||
{ 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
|
||||
{ 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
|
||||
{10, 0x37, 0}, /* 0000 1101 11 */
|
||||
{3, 0x2, 1}, /* 010 */
|
||||
{2, 0x3, 2}, /* 11 */
|
||||
{2, 0x2, 3}, /* 10 */
|
||||
{3, 0x3, 4}, /* 011 */
|
||||
{4, 0x3, 5}, /* 0011 */
|
||||
{4, 0x2, 6}, /* 0010 */
|
||||
{5, 0x3, 7}, /* 0001 1 */
|
||||
{6, 0x5, 8}, /* 0001 01 */
|
||||
{6, 0x4, 9}, /* 0001 00 */
|
||||
{7, 0x4, 10}, /* 0000 100 */
|
||||
{7, 0x5, 11}, /* 0000 101 */
|
||||
{7, 0x7, 12}, /* 0000 111 */
|
||||
{8, 0x4, 13}, /* 0000 0100 */
|
||||
{8, 0x7, 14}, /* 0000 0111 */
|
||||
{9, 0x18, 15}, /* 0000 1100 0 */
|
||||
{10, 0x17, 16}, /* 0000 0101 11 */
|
||||
{10, 0x18, 17}, /* 0000 0110 00 */
|
||||
{10, 0x8, 18}, /* 0000 0010 00 */
|
||||
{11, 0x67, 19}, /* 0000 1100 111 */
|
||||
{11, 0x68, 20}, /* 0000 1101 000 */
|
||||
{11, 0x6C, 21}, /* 0000 1101 100 */
|
||||
{11, 0x37, 22}, /* 0000 0110 111 */
|
||||
{11, 0x28, 23}, /* 0000 0101 000 */
|
||||
{11, 0x17, 24}, /* 0000 0010 111 */
|
||||
{11, 0x18, 25}, /* 0000 0011 000 */
|
||||
{12, 0xCA, 26}, /* 0000 1100 1010 */
|
||||
{12, 0xCB, 27}, /* 0000 1100 1011 */
|
||||
{12, 0xCC, 28}, /* 0000 1100 1100 */
|
||||
{12, 0xCD, 29}, /* 0000 1100 1101 */
|
||||
{12, 0x68, 30}, /* 0000 0110 1000 */
|
||||
{12, 0x69, 31}, /* 0000 0110 1001 */
|
||||
{12, 0x6A, 32}, /* 0000 0110 1010 */
|
||||
{12, 0x6B, 33}, /* 0000 0110 1011 */
|
||||
{12, 0xD2, 34}, /* 0000 1101 0010 */
|
||||
{12, 0xD3, 35}, /* 0000 1101 0011 */
|
||||
{12, 0xD4, 36}, /* 0000 1101 0100 */
|
||||
{12, 0xD5, 37}, /* 0000 1101 0101 */
|
||||
{12, 0xD6, 38}, /* 0000 1101 0110 */
|
||||
{12, 0xD7, 39}, /* 0000 1101 0111 */
|
||||
{12, 0x6C, 40}, /* 0000 0110 1100 */
|
||||
{12, 0x6D, 41}, /* 0000 0110 1101 */
|
||||
{12, 0xDA, 42}, /* 0000 1101 1010 */
|
||||
{12, 0xDB, 43}, /* 0000 1101 1011 */
|
||||
{12, 0x54, 44}, /* 0000 0101 0100 */
|
||||
{12, 0x55, 45}, /* 0000 0101 0101 */
|
||||
{12, 0x56, 46}, /* 0000 0101 0110 */
|
||||
{12, 0x57, 47}, /* 0000 0101 0111 */
|
||||
{12, 0x64, 48}, /* 0000 0110 0100 */
|
||||
{12, 0x65, 49}, /* 0000 0110 0101 */
|
||||
{12, 0x52, 50}, /* 0000 0101 0010 */
|
||||
{12, 0x53, 51}, /* 0000 0101 0011 */
|
||||
{12, 0x24, 52}, /* 0000 0010 0100 */
|
||||
{12, 0x37, 53}, /* 0000 0011 0111 */
|
||||
{12, 0x38, 54}, /* 0000 0011 1000 */
|
||||
{12, 0x27, 55}, /* 0000 0010 0111 */
|
||||
{12, 0x28, 56}, /* 0000 0010 1000 */
|
||||
{12, 0x58, 57}, /* 0000 0101 1000 */
|
||||
{12, 0x59, 58}, /* 0000 0101 1001 */
|
||||
{12, 0x2B, 59}, /* 0000 0010 1011 */
|
||||
{12, 0x2C, 60}, /* 0000 0010 1100 */
|
||||
{12, 0x5A, 61}, /* 0000 0101 1010 */
|
||||
{12, 0x66, 62}, /* 0000 0110 0110 */
|
||||
{12, 0x67, 63}, /* 0000 0110 0111 */
|
||||
{10, 0xF, 64}, /* 0000 0011 11 */
|
||||
{12, 0xC8, 128}, /* 0000 1100 1000 */
|
||||
{12, 0xC9, 192}, /* 0000 1100 1001 */
|
||||
{12, 0x5B, 256}, /* 0000 0101 1011 */
|
||||
{12, 0x33, 320}, /* 0000 0011 0011 */
|
||||
{12, 0x34, 384}, /* 0000 0011 0100 */
|
||||
{12, 0x35, 448}, /* 0000 0011 0101 */
|
||||
{13, 0x6C, 512}, /* 0000 0011 0110 0 */
|
||||
{13, 0x6D, 576}, /* 0000 0011 0110 1 */
|
||||
{13, 0x4A, 640}, /* 0000 0010 0101 0 */
|
||||
{13, 0x4B, 704}, /* 0000 0010 0101 1 */
|
||||
{13, 0x4C, 768}, /* 0000 0010 0110 0 */
|
||||
{13, 0x4D, 832}, /* 0000 0010 0110 1 */
|
||||
{13, 0x72, 896}, /* 0000 0011 1001 0 */
|
||||
{13, 0x73, 960}, /* 0000 0011 1001 1 */
|
||||
{13, 0x74, 1024}, /* 0000 0011 1010 0 */
|
||||
{13, 0x75, 1088}, /* 0000 0011 1010 1 */
|
||||
{13, 0x76, 1152}, /* 0000 0011 1011 0 */
|
||||
{13, 0x77, 1216}, /* 0000 0011 1011 1 */
|
||||
{13, 0x52, 1280}, /* 0000 0010 1001 0 */
|
||||
{13, 0x53, 1344}, /* 0000 0010 1001 1 */
|
||||
{13, 0x54, 1408}, /* 0000 0010 1010 0 */
|
||||
{13, 0x55, 1472}, /* 0000 0010 1010 1 */
|
||||
{13, 0x5A, 1536}, /* 0000 0010 1101 0 */
|
||||
{13, 0x5B, 1600}, /* 0000 0010 1101 1 */
|
||||
{13, 0x64, 1664}, /* 0000 0011 0010 0 */
|
||||
{13, 0x65, 1728}, /* 0000 0011 0010 1 */
|
||||
{11, 0x8, 1792}, /* 0000 0001 000 */
|
||||
{11, 0xC, 1856}, /* 0000 0001 100 */
|
||||
{11, 0xD, 1920}, /* 0000 0001 101 */
|
||||
{12, 0x12, 1984}, /* 0000 0001 0010 */
|
||||
{12, 0x13, 2048}, /* 0000 0001 0011 */
|
||||
{12, 0x14, 2112}, /* 0000 0001 0100 */
|
||||
{12, 0x15, 2176}, /* 0000 0001 0101 */
|
||||
{12, 0x16, 2240}, /* 0000 0001 0110 */
|
||||
{12, 0x17, 2304}, /* 0000 0001 0111 */
|
||||
{12, 0x1C, 2368}, /* 0000 0001 1100 */
|
||||
{12, 0x1D, 2432}, /* 0000 0001 1101 */
|
||||
{12, 0x1E, 2496}, /* 0000 0001 1110 */
|
||||
{12, 0x1F, 2560}, /* 0000 0001 1111 */
|
||||
{12, 0x1, G3CODE_EOL}, /* 0000 0000 0001 */
|
||||
{9, 0x1, G3CODE_INVALID}, /* 0000 0000 1 */
|
||||
{10, 0x1, G3CODE_INVALID}, /* 0000 0000 01 */
|
||||
{11, 0x1, G3CODE_INVALID}, /* 0000 0000 001 */
|
||||
{12, 0x0, G3CODE_INVALID}, /* 0000 0000 0000 */
|
||||
};
|
||||
#else
|
||||
extern const tableentry TIFFFaxWhiteCodes[];
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -27,173 +27,180 @@
|
||||
*
|
||||
* Auxiliary Support Routines.
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
#include "tif_predict.h"
|
||||
#include <math.h>
|
||||
#include "tiffiop.h"
|
||||
#include <float.h>
|
||||
#include <math.h>
|
||||
|
||||
uint32_t
|
||||
_TIFFMultiply32(TIFF* tif, uint32_t first, uint32_t second, const char* where)
|
||||
uint32_t _TIFFMultiply32(TIFF *tif, uint32_t first, uint32_t second,
|
||||
const char *where)
|
||||
{
|
||||
if (second && first > UINT32_MAX / second) {
|
||||
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return first * second;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
_TIFFMultiply64(TIFF* tif, uint64_t first, uint64_t second, const char* where)
|
||||
{
|
||||
if (second && first > UINT64_MAX / second) {
|
||||
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return first * second;
|
||||
}
|
||||
|
||||
tmsize_t
|
||||
_TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where)
|
||||
{
|
||||
if( first <= 0 || second <= 0 )
|
||||
if (second && first > UINT32_MAX / second)
|
||||
{
|
||||
if( tif != NULL && where != NULL )
|
||||
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return first * second;
|
||||
}
|
||||
|
||||
uint64_t _TIFFMultiply64(TIFF *tif, uint64_t first, uint64_t second,
|
||||
const char *where)
|
||||
{
|
||||
if (second && first > UINT64_MAX / second)
|
||||
{
|
||||
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return first * second;
|
||||
}
|
||||
|
||||
tmsize_t _TIFFMultiplySSize(TIFF *tif, tmsize_t first, tmsize_t second,
|
||||
const char *where)
|
||||
{
|
||||
if (first <= 0 || second <= 0)
|
||||
{
|
||||
if (tif != NULL && where != NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif, where,
|
||||
"Invalid argument to _TIFFMultiplySSize() in %s", where);
|
||||
"Invalid argument to _TIFFMultiplySSize() in %s",
|
||||
where);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( first > TIFF_TMSIZE_T_MAX / second )
|
||||
if (first > TIFF_TMSIZE_T_MAX / second)
|
||||
{
|
||||
if( tif != NULL && where != NULL )
|
||||
if (tif != NULL && where != NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif, where,
|
||||
"Integer overflow in %s", where);
|
||||
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return first * second;
|
||||
}
|
||||
|
||||
tmsize_t _TIFFCastUInt64ToSSize(TIFF* tif, uint64_t val, const char* module)
|
||||
tmsize_t _TIFFCastUInt64ToSSize(TIFF *tif, uint64_t val, const char *module)
|
||||
{
|
||||
if( val > (uint64_t)TIFF_TMSIZE_T_MAX )
|
||||
if (val > (uint64_t)TIFF_TMSIZE_T_MAX)
|
||||
{
|
||||
if( tif != NULL && module != NULL )
|
||||
if (tif != NULL && module != NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Integer overflow");
|
||||
TIFFErrorExtR(tif, module, "Integer overflow");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return (tmsize_t)val;
|
||||
}
|
||||
|
||||
void*
|
||||
_TIFFCheckRealloc(TIFF* tif, void* buffer,
|
||||
tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
||||
void *_TIFFCheckRealloc(TIFF *tif, void *buffer, tmsize_t nmemb,
|
||||
tmsize_t elem_size, const char *what)
|
||||
{
|
||||
void* cp = NULL;
|
||||
tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
|
||||
/*
|
||||
* Check for integer overflow.
|
||||
*/
|
||||
if (count != 0)
|
||||
{
|
||||
cp = _TIFFreallocExt(tif, buffer, count);
|
||||
}
|
||||
void *cp = NULL;
|
||||
tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
|
||||
/*
|
||||
* Check for integer overflow.
|
||||
*/
|
||||
if (count != 0)
|
||||
{
|
||||
cp = _TIFFreallocExt(tif, buffer, count);
|
||||
}
|
||||
|
||||
if (cp == NULL) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Failed to allocate memory for %s "
|
||||
"(%"TIFF_SSIZE_FORMAT" elements of %"TIFF_SSIZE_FORMAT" bytes each)",
|
||||
what, nmemb, elem_size);
|
||||
}
|
||||
if (cp == NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Failed to allocate memory for %s "
|
||||
"(%" TIFF_SSIZE_FORMAT " elements of %" TIFF_SSIZE_FORMAT
|
||||
" bytes each)",
|
||||
what, nmemb, elem_size);
|
||||
}
|
||||
|
||||
return cp;
|
||||
return cp;
|
||||
}
|
||||
|
||||
void*
|
||||
_TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
||||
void *_TIFFCheckMalloc(TIFF *tif, tmsize_t nmemb, tmsize_t elem_size,
|
||||
const char *what)
|
||||
{
|
||||
return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
|
||||
return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
|
||||
}
|
||||
|
||||
static int
|
||||
TIFFDefaultTransferFunction(TIFF* tif, TIFFDirectory* td)
|
||||
static int TIFFDefaultTransferFunction(TIFF *tif, TIFFDirectory *td)
|
||||
{
|
||||
uint16_t **tf = td->td_transferfunction;
|
||||
tmsize_t i, n, nbytes;
|
||||
uint16_t **tf = td->td_transferfunction;
|
||||
tmsize_t i, n, nbytes;
|
||||
|
||||
tf[0] = tf[1] = tf[2] = 0;
|
||||
if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
|
||||
return 0;
|
||||
tf[0] = tf[1] = tf[2] = 0;
|
||||
if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
|
||||
return 0;
|
||||
|
||||
n = ((tmsize_t)1)<<td->td_bitspersample;
|
||||
nbytes = n * sizeof (uint16_t);
|
||||
tf[0] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if (tf[0] == NULL)
|
||||
return 0;
|
||||
tf[0][0] = 0;
|
||||
for (i = 1; i < n; i++) {
|
||||
double t = (double)i/((double) n-1.);
|
||||
tf[0][i] = (uint16_t)floor(65535. * pow(t, 2.2) + .5);
|
||||
}
|
||||
n = ((tmsize_t)1) << td->td_bitspersample;
|
||||
nbytes = n * sizeof(uint16_t);
|
||||
tf[0] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if (tf[0] == NULL)
|
||||
return 0;
|
||||
tf[0][0] = 0;
|
||||
for (i = 1; i < n; i++)
|
||||
{
|
||||
double t = (double)i / ((double)n - 1.);
|
||||
tf[0][i] = (uint16_t)floor(65535. * pow(t, 2.2) + .5);
|
||||
}
|
||||
|
||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
||||
tf[1] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if(tf[1] == NULL)
|
||||
goto bad;
|
||||
_TIFFmemcpy(tf[1], tf[0], nbytes);
|
||||
tf[2] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if (tf[2] == NULL)
|
||||
goto bad;
|
||||
_TIFFmemcpy(tf[2], tf[0], nbytes);
|
||||
}
|
||||
return 1;
|
||||
if (td->td_samplesperpixel - td->td_extrasamples > 1)
|
||||
{
|
||||
tf[1] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if (tf[1] == NULL)
|
||||
goto bad;
|
||||
_TIFFmemcpy(tf[1], tf[0], nbytes);
|
||||
tf[2] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||
if (tf[2] == NULL)
|
||||
goto bad;
|
||||
_TIFFmemcpy(tf[2], tf[0], nbytes);
|
||||
}
|
||||
return 1;
|
||||
|
||||
bad:
|
||||
if (tf[0])
|
||||
_TIFFfreeExt(tif, tf[0]);
|
||||
if (tf[1])
|
||||
_TIFFfreeExt(tif, tf[1]);
|
||||
if (tf[2])
|
||||
_TIFFfreeExt(tif, tf[2]);
|
||||
tf[0] = tf[1] = tf[2] = 0;
|
||||
return 0;
|
||||
if (tf[0])
|
||||
_TIFFfreeExt(tif, tf[0]);
|
||||
if (tf[1])
|
||||
_TIFFfreeExt(tif, tf[1]);
|
||||
if (tf[2])
|
||||
_TIFFfreeExt(tif, tf[2]);
|
||||
tf[0] = tf[1] = tf[2] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
TIFFDefaultRefBlackWhite(TIFF* tif, TIFFDirectory* td)
|
||||
static int TIFFDefaultRefBlackWhite(TIFF *tif, TIFFDirectory *td)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
td->td_refblackwhite = (float *)_TIFFmallocExt(tif, 6*sizeof (float));
|
||||
if (td->td_refblackwhite == NULL)
|
||||
return 0;
|
||||
if (td->td_photometric == PHOTOMETRIC_YCBCR) {
|
||||
/*
|
||||
* YCbCr (Class Y) images must have the ReferenceBlackWhite
|
||||
* tag set. Fix the broken images, which lacks that tag.
|
||||
*/
|
||||
td->td_refblackwhite[0] = 0.0F;
|
||||
td->td_refblackwhite[1] = td->td_refblackwhite[3] =
|
||||
td->td_refblackwhite[5] = 255.0F;
|
||||
td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
|
||||
} else {
|
||||
/*
|
||||
* Assume RGB (Class R)
|
||||
*/
|
||||
for (i = 0; i < 3; i++) {
|
||||
td->td_refblackwhite[2*i+0] = 0;
|
||||
td->td_refblackwhite[2*i+1] =
|
||||
(float)((1L<<td->td_bitspersample)-1L);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
td->td_refblackwhite = (float *)_TIFFmallocExt(tif, 6 * sizeof(float));
|
||||
if (td->td_refblackwhite == NULL)
|
||||
return 0;
|
||||
if (td->td_photometric == PHOTOMETRIC_YCBCR)
|
||||
{
|
||||
/*
|
||||
* YCbCr (Class Y) images must have the ReferenceBlackWhite
|
||||
* tag set. Fix the broken images, which lacks that tag.
|
||||
*/
|
||||
td->td_refblackwhite[0] = 0.0F;
|
||||
td->td_refblackwhite[1] = td->td_refblackwhite[3] =
|
||||
td->td_refblackwhite[5] = 255.0F;
|
||||
td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Assume RGB (Class R)
|
||||
*/
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
td->td_refblackwhite[2 * i + 0] = 0;
|
||||
td->td_refblackwhite[2 * i + 1] =
|
||||
(float)((1L << td->td_bitspersample) - 1L);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -204,229 +211,246 @@ TIFFDefaultRefBlackWhite(TIFF* tif, TIFFDirectory* td)
|
||||
* explicit values so that defaults exist only one
|
||||
* place in the library -- in TIFFDefaultDirectory.
|
||||
*/
|
||||
int
|
||||
TIFFVGetFieldDefaulted(TIFF* tif, uint32_t tag, va_list ap)
|
||||
int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap)
|
||||
{
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
|
||||
if (TIFFVGetField(tif, tag, ap))
|
||||
return (1);
|
||||
switch (tag) {
|
||||
case TIFFTAG_SUBFILETYPE:
|
||||
*va_arg(ap, uint32_t *) = td->td_subfiletype;
|
||||
return (1);
|
||||
case TIFFTAG_BITSPERSAMPLE:
|
||||
*va_arg(ap, uint16_t *) = td->td_bitspersample;
|
||||
return (1);
|
||||
case TIFFTAG_THRESHHOLDING:
|
||||
*va_arg(ap, uint16_t *) = td->td_threshholding;
|
||||
return (1);
|
||||
case TIFFTAG_FILLORDER:
|
||||
*va_arg(ap, uint16_t *) = td->td_fillorder;
|
||||
return (1);
|
||||
case TIFFTAG_ORIENTATION:
|
||||
*va_arg(ap, uint16_t *) = td->td_orientation;
|
||||
return (1);
|
||||
case TIFFTAG_SAMPLESPERPIXEL:
|
||||
*va_arg(ap, uint16_t *) = td->td_samplesperpixel;
|
||||
return (1);
|
||||
case TIFFTAG_ROWSPERSTRIP:
|
||||
*va_arg(ap, uint32_t *) = td->td_rowsperstrip;
|
||||
return (1);
|
||||
case TIFFTAG_MINSAMPLEVALUE:
|
||||
*va_arg(ap, uint16_t *) = td->td_minsamplevalue;
|
||||
return (1);
|
||||
case TIFFTAG_MAXSAMPLEVALUE:
|
||||
{
|
||||
uint16_t maxsamplevalue;
|
||||
/* td_bitspersample=1 is always set in TIFFDefaultDirectory().
|
||||
* Therefore, td_maxsamplevalue has to be re-calculated in TIFFGetFieldDefaulted(). */
|
||||
if (td->td_bitspersample > 0) {
|
||||
/* This shift operation into a uint16_t limits the value to 65535 even if td_bitspersamle is > 16 */
|
||||
if (td->td_bitspersample <= 16) {
|
||||
maxsamplevalue = (1 << td->td_bitspersample) - 1; /* 2**(BitsPerSample) - 1 */
|
||||
} else {
|
||||
maxsamplevalue = 65535;
|
||||
}
|
||||
} else {
|
||||
maxsamplevalue = 0;
|
||||
}
|
||||
*va_arg(ap, uint16_t *) = maxsamplevalue;
|
||||
return (1);
|
||||
}
|
||||
case TIFFTAG_PLANARCONFIG:
|
||||
*va_arg(ap, uint16_t *) = td->td_planarconfig;
|
||||
return (1);
|
||||
case TIFFTAG_RESOLUTIONUNIT:
|
||||
*va_arg(ap, uint16_t *) = td->td_resolutionunit;
|
||||
return (1);
|
||||
case TIFFTAG_PREDICTOR:
|
||||
if (TIFFVGetField(tif, tag, ap))
|
||||
return (1);
|
||||
switch (tag)
|
||||
{
|
||||
TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
|
||||
if( sp == NULL )
|
||||
case TIFFTAG_SUBFILETYPE:
|
||||
*va_arg(ap, uint32_t *) = td->td_subfiletype;
|
||||
return (1);
|
||||
case TIFFTAG_BITSPERSAMPLE:
|
||||
*va_arg(ap, uint16_t *) = td->td_bitspersample;
|
||||
return (1);
|
||||
case TIFFTAG_THRESHHOLDING:
|
||||
*va_arg(ap, uint16_t *) = td->td_threshholding;
|
||||
return (1);
|
||||
case TIFFTAG_FILLORDER:
|
||||
*va_arg(ap, uint16_t *) = td->td_fillorder;
|
||||
return (1);
|
||||
case TIFFTAG_ORIENTATION:
|
||||
*va_arg(ap, uint16_t *) = td->td_orientation;
|
||||
return (1);
|
||||
case TIFFTAG_SAMPLESPERPIXEL:
|
||||
*va_arg(ap, uint16_t *) = td->td_samplesperpixel;
|
||||
return (1);
|
||||
case TIFFTAG_ROWSPERSTRIP:
|
||||
*va_arg(ap, uint32_t *) = td->td_rowsperstrip;
|
||||
return (1);
|
||||
case TIFFTAG_MINSAMPLEVALUE:
|
||||
*va_arg(ap, uint16_t *) = td->td_minsamplevalue;
|
||||
return (1);
|
||||
case TIFFTAG_MAXSAMPLEVALUE:
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Cannot get \"Predictor\" tag as plugin is not configured");
|
||||
*va_arg(ap, uint16_t*) = 0;
|
||||
return 0;
|
||||
uint16_t maxsamplevalue;
|
||||
/* td_bitspersample=1 is always set in TIFFDefaultDirectory().
|
||||
* Therefore, td_maxsamplevalue has to be re-calculated in
|
||||
* TIFFGetFieldDefaulted(). */
|
||||
if (td->td_bitspersample > 0)
|
||||
{
|
||||
/* This shift operation into a uint16_t limits the value to
|
||||
* 65535 even if td_bitspersamle is > 16 */
|
||||
if (td->td_bitspersample <= 16)
|
||||
{
|
||||
maxsamplevalue = (1 << td->td_bitspersample) -
|
||||
1; /* 2**(BitsPerSample) - 1 */
|
||||
}
|
||||
else
|
||||
{
|
||||
maxsamplevalue = 65535;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
maxsamplevalue = 0;
|
||||
}
|
||||
*va_arg(ap, uint16_t *) = maxsamplevalue;
|
||||
return (1);
|
||||
}
|
||||
*va_arg(ap, uint16_t*) = (uint16_t) sp->predictor;
|
||||
return 1;
|
||||
case TIFFTAG_PLANARCONFIG:
|
||||
*va_arg(ap, uint16_t *) = td->td_planarconfig;
|
||||
return (1);
|
||||
case TIFFTAG_RESOLUTIONUNIT:
|
||||
*va_arg(ap, uint16_t *) = td->td_resolutionunit;
|
||||
return (1);
|
||||
case TIFFTAG_PREDICTOR:
|
||||
{
|
||||
TIFFPredictorState *sp = (TIFFPredictorState *)tif->tif_data;
|
||||
if (sp == NULL)
|
||||
{
|
||||
TIFFErrorExtR(
|
||||
tif, tif->tif_name,
|
||||
"Cannot get \"Predictor\" tag as plugin is not configured");
|
||||
*va_arg(ap, uint16_t *) = 0;
|
||||
return 0;
|
||||
}
|
||||
*va_arg(ap, uint16_t *) = (uint16_t)sp->predictor;
|
||||
return 1;
|
||||
}
|
||||
case TIFFTAG_DOTRANGE:
|
||||
*va_arg(ap, uint16_t *) = 0;
|
||||
*va_arg(ap, uint16_t *) = (1 << td->td_bitspersample) - 1;
|
||||
return (1);
|
||||
case TIFFTAG_INKSET:
|
||||
*va_arg(ap, uint16_t *) = INKSET_CMYK;
|
||||
return 1;
|
||||
case TIFFTAG_NUMBEROFINKS:
|
||||
*va_arg(ap, uint16_t *) = 4;
|
||||
return (1);
|
||||
case TIFFTAG_EXTRASAMPLES:
|
||||
*va_arg(ap, uint16_t *) = td->td_extrasamples;
|
||||
*va_arg(ap, const uint16_t **) = td->td_sampleinfo;
|
||||
return (1);
|
||||
case TIFFTAG_MATTEING:
|
||||
*va_arg(ap, uint16_t *) =
|
||||
(td->td_extrasamples == 1 &&
|
||||
td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
|
||||
return (1);
|
||||
case TIFFTAG_TILEDEPTH:
|
||||
*va_arg(ap, uint32_t *) = td->td_tiledepth;
|
||||
return (1);
|
||||
case TIFFTAG_DATATYPE:
|
||||
*va_arg(ap, uint16_t *) = td->td_sampleformat - 1;
|
||||
return (1);
|
||||
case TIFFTAG_SAMPLEFORMAT:
|
||||
*va_arg(ap, uint16_t *) = td->td_sampleformat;
|
||||
return (1);
|
||||
case TIFFTAG_IMAGEDEPTH:
|
||||
*va_arg(ap, uint32_t *) = td->td_imagedepth;
|
||||
return (1);
|
||||
case TIFFTAG_YCBCRCOEFFICIENTS:
|
||||
{
|
||||
/* defaults are from CCIR Recommendation 601-1 */
|
||||
static const float ycbcrcoeffs[] = {0.299f, 0.587f, 0.114f};
|
||||
*va_arg(ap, const float **) = ycbcrcoeffs;
|
||||
return 1;
|
||||
}
|
||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[0];
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[1];
|
||||
return (1);
|
||||
case TIFFTAG_YCBCRPOSITIONING:
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrpositioning;
|
||||
return (1);
|
||||
case TIFFTAG_WHITEPOINT:
|
||||
{
|
||||
/* TIFF 6.0 specification tells that it is no default
|
||||
value for the WhitePoint, but AdobePhotoshop TIFF
|
||||
Technical Note tells that it should be CIE D50. */
|
||||
static const float whitepoint[] = {
|
||||
D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
|
||||
D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)};
|
||||
*va_arg(ap, const float **) = whitepoint;
|
||||
return 1;
|
||||
}
|
||||
case TIFFTAG_TRANSFERFUNCTION:
|
||||
if (!td->td_transferfunction[0] &&
|
||||
!TIFFDefaultTransferFunction(tif, td))
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"No space for \"TransferFunction\" tag");
|
||||
return (0);
|
||||
}
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[0];
|
||||
if (td->td_samplesperpixel - td->td_extrasamples > 1)
|
||||
{
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[1];
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[2];
|
||||
}
|
||||
return (1);
|
||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
||||
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(tif, td))
|
||||
return (0);
|
||||
*va_arg(ap, const float **) = td->td_refblackwhite;
|
||||
return (1);
|
||||
}
|
||||
case TIFFTAG_DOTRANGE:
|
||||
*va_arg(ap, uint16_t *) = 0;
|
||||
*va_arg(ap, uint16_t *) = (1 << td->td_bitspersample) - 1;
|
||||
return (1);
|
||||
case TIFFTAG_INKSET:
|
||||
*va_arg(ap, uint16_t *) = INKSET_CMYK;
|
||||
return 1;
|
||||
case TIFFTAG_NUMBEROFINKS:
|
||||
*va_arg(ap, uint16_t *) = 4;
|
||||
return (1);
|
||||
case TIFFTAG_EXTRASAMPLES:
|
||||
*va_arg(ap, uint16_t *) = td->td_extrasamples;
|
||||
*va_arg(ap, const uint16_t **) = td->td_sampleinfo;
|
||||
return (1);
|
||||
case TIFFTAG_MATTEING:
|
||||
*va_arg(ap, uint16_t *) =
|
||||
(td->td_extrasamples == 1 &&
|
||||
td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
|
||||
return (1);
|
||||
case TIFFTAG_TILEDEPTH:
|
||||
*va_arg(ap, uint32_t *) = td->td_tiledepth;
|
||||
return (1);
|
||||
case TIFFTAG_DATATYPE:
|
||||
*va_arg(ap, uint16_t *) = td->td_sampleformat - 1;
|
||||
return (1);
|
||||
case TIFFTAG_SAMPLEFORMAT:
|
||||
*va_arg(ap, uint16_t *) = td->td_sampleformat;
|
||||
return(1);
|
||||
case TIFFTAG_IMAGEDEPTH:
|
||||
*va_arg(ap, uint32_t *) = td->td_imagedepth;
|
||||
return (1);
|
||||
case TIFFTAG_YCBCRCOEFFICIENTS:
|
||||
{
|
||||
/* defaults are from CCIR Recommendation 601-1 */
|
||||
static const float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
|
||||
*va_arg(ap, const float **) = ycbcrcoeffs;
|
||||
return 1;
|
||||
}
|
||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[0];
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[1];
|
||||
return (1);
|
||||
case TIFFTAG_YCBCRPOSITIONING:
|
||||
*va_arg(ap, uint16_t *) = td->td_ycbcrpositioning;
|
||||
return (1);
|
||||
case TIFFTAG_WHITEPOINT:
|
||||
{
|
||||
/* TIFF 6.0 specification tells that it is no default
|
||||
value for the WhitePoint, but AdobePhotoshop TIFF
|
||||
Technical Note tells that it should be CIE D50. */
|
||||
static const float whitepoint[] = {
|
||||
D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
|
||||
D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)
|
||||
};
|
||||
*va_arg(ap, const float **) = whitepoint;
|
||||
return 1;
|
||||
}
|
||||
case TIFFTAG_TRANSFERFUNCTION:
|
||||
if (!td->td_transferfunction[0] &&
|
||||
!TIFFDefaultTransferFunction(tif, td)) {
|
||||
TIFFErrorExtR(tif, tif->tif_name, "No space for \"TransferFunction\" tag");
|
||||
return (0);
|
||||
}
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[0];
|
||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[1];
|
||||
*va_arg(ap, const uint16_t **) = td->td_transferfunction[2];
|
||||
}
|
||||
return (1);
|
||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
||||
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(tif, td))
|
||||
return (0);
|
||||
*va_arg(ap, const float **) = td->td_refblackwhite;
|
||||
return (1);
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Like TIFFGetField, but return any default
|
||||
* value if the tag is not present in the directory.
|
||||
*/
|
||||
int
|
||||
TIFFGetFieldDefaulted(TIFF* tif, uint32_t tag, ...)
|
||||
int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...)
|
||||
{
|
||||
int ok;
|
||||
va_list ap;
|
||||
int ok;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, tag);
|
||||
ok = TIFFVGetFieldDefaulted(tif, tag, ap);
|
||||
va_end(ap);
|
||||
return (ok);
|
||||
va_start(ap, tag);
|
||||
ok = TIFFVGetFieldDefaulted(tif, tag, ap);
|
||||
va_end(ap);
|
||||
return (ok);
|
||||
}
|
||||
|
||||
struct _Int64Parts {
|
||||
int32_t low, high;
|
||||
struct _Int64Parts
|
||||
{
|
||||
int32_t low, high;
|
||||
};
|
||||
|
||||
typedef union {
|
||||
struct _Int64Parts part;
|
||||
int64_t value;
|
||||
typedef union
|
||||
{
|
||||
struct _Int64Parts part;
|
||||
int64_t value;
|
||||
} _Int64;
|
||||
|
||||
float
|
||||
_TIFFUInt64ToFloat(uint64_t ui64)
|
||||
float _TIFFUInt64ToFloat(uint64_t ui64)
|
||||
{
|
||||
_Int64 i;
|
||||
_Int64 i;
|
||||
|
||||
i.value = ui64;
|
||||
if (i.part.high >= 0) {
|
||||
return (float)i.value;
|
||||
} else {
|
||||
long double df;
|
||||
df = (long double)i.value;
|
||||
df += 18446744073709551616.0; /* adding 2**64 */
|
||||
return (float)df;
|
||||
}
|
||||
i.value = ui64;
|
||||
if (i.part.high >= 0)
|
||||
{
|
||||
return (float)i.value;
|
||||
}
|
||||
else
|
||||
{
|
||||
long double df;
|
||||
df = (long double)i.value;
|
||||
df += 18446744073709551616.0; /* adding 2**64 */
|
||||
return (float)df;
|
||||
}
|
||||
}
|
||||
|
||||
double
|
||||
_TIFFUInt64ToDouble(uint64_t ui64)
|
||||
double _TIFFUInt64ToDouble(uint64_t ui64)
|
||||
{
|
||||
_Int64 i;
|
||||
_Int64 i;
|
||||
|
||||
i.value = ui64;
|
||||
if (i.part.high >= 0) {
|
||||
return (double)i.value;
|
||||
} else {
|
||||
long double df;
|
||||
df = (long double)i.value;
|
||||
df += 18446744073709551616.0; /* adding 2**64 */
|
||||
return (double)df;
|
||||
}
|
||||
i.value = ui64;
|
||||
if (i.part.high >= 0)
|
||||
{
|
||||
return (double)i.value;
|
||||
}
|
||||
else
|
||||
{
|
||||
long double df;
|
||||
df = (long double)i.value;
|
||||
df += 18446744073709551616.0; /* adding 2**64 */
|
||||
return (double)df;
|
||||
}
|
||||
}
|
||||
|
||||
float _TIFFClampDoubleToFloat( double val )
|
||||
float _TIFFClampDoubleToFloat(double val)
|
||||
{
|
||||
if( val > FLT_MAX )
|
||||
if (val > FLT_MAX)
|
||||
return FLT_MAX;
|
||||
if( val < -FLT_MAX )
|
||||
if (val < -FLT_MAX)
|
||||
return -FLT_MAX;
|
||||
return (float)val;
|
||||
}
|
||||
|
||||
uint32_t _TIFFClampDoubleToUInt32(double val)
|
||||
{
|
||||
if( val < 0 )
|
||||
if (val < 0)
|
||||
return 0;
|
||||
if( val > 0xFFFFFFFFU || val != val )
|
||||
if (val > 0xFFFFFFFFU || val != val)
|
||||
return 0xFFFFFFFFU;
|
||||
return (uint32_t)val;
|
||||
}
|
||||
|
||||
int _TIFFSeekOK(TIFF* tif, toff_t off)
|
||||
int _TIFFSeekOK(TIFF *tif, toff_t off)
|
||||
{
|
||||
/* Huge offsets, especially -1 / UINT64_MAX, can cause issues */
|
||||
/* See http://bugzilla.maptools.org/show_bug.cgi?id=2726 */
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -37,77 +37,83 @@
|
||||
* completely freed, so you should save opened file handle and pointer
|
||||
* to the close procedure in external variables before calling
|
||||
* _TIFFCleanup(), if you will need these ones to close the file.
|
||||
*
|
||||
*
|
||||
* @param tif A TIFF pointer.
|
||||
*/
|
||||
|
||||
void
|
||||
TIFFCleanup(TIFF* tif)
|
||||
void TIFFCleanup(TIFF *tif)
|
||||
{
|
||||
/*
|
||||
* Flush buffered data and directory (if dirty).
|
||||
*/
|
||||
if (tif->tif_mode != O_RDONLY)
|
||||
TIFFFlush(tif);
|
||||
(*tif->tif_cleanup)(tif);
|
||||
TIFFFreeDirectory(tif);
|
||||
/*
|
||||
* Flush buffered data and directory (if dirty).
|
||||
*/
|
||||
if (tif->tif_mode != O_RDONLY)
|
||||
TIFFFlush(tif);
|
||||
(*tif->tif_cleanup)(tif);
|
||||
TIFFFreeDirectory(tif);
|
||||
|
||||
if (tif->tif_dirlistoff)
|
||||
_TIFFfreeExt(tif, tif->tif_dirlistoff);
|
||||
if (tif->tif_dirlistdirn)
|
||||
_TIFFfreeExt(tif, tif->tif_dirlistdirn);
|
||||
if (tif->tif_dirlistoff)
|
||||
_TIFFfreeExt(tif, tif->tif_dirlistoff);
|
||||
if (tif->tif_dirlistdirn)
|
||||
_TIFFfreeExt(tif, tif->tif_dirlistdirn);
|
||||
|
||||
/*
|
||||
* Clean up client info links.
|
||||
*/
|
||||
while( tif->tif_clientinfo )
|
||||
{
|
||||
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
||||
/*
|
||||
* Clean up client info links.
|
||||
*/
|
||||
while (tif->tif_clientinfo)
|
||||
{
|
||||
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
||||
|
||||
tif->tif_clientinfo = psLink->next;
|
||||
_TIFFfreeExt(tif, psLink->name );
|
||||
_TIFFfreeExt(tif, psLink );
|
||||
}
|
||||
tif->tif_clientinfo = psLink->next;
|
||||
_TIFFfreeExt(tif, psLink->name);
|
||||
_TIFFfreeExt(tif, psLink);
|
||||
}
|
||||
|
||||
if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
|
||||
_TIFFfreeExt(tif, tif->tif_rawdata);
|
||||
if (isMapped(tif))
|
||||
TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
|
||||
if (tif->tif_rawdata && (tif->tif_flags & TIFF_MYBUFFER))
|
||||
_TIFFfreeExt(tif, tif->tif_rawdata);
|
||||
if (isMapped(tif))
|
||||
TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
|
||||
|
||||
/*
|
||||
* Clean up custom fields.
|
||||
*/
|
||||
if (tif->tif_fields && tif->tif_nfields > 0) {
|
||||
uint32_t i;
|
||||
/*
|
||||
* Clean up custom fields.
|
||||
*/
|
||||
if (tif->tif_fields && tif->tif_nfields > 0)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < tif->tif_nfields; i++) {
|
||||
TIFFField *fld = tif->tif_fields[i];
|
||||
if (fld->field_name != NULL) {
|
||||
if (fld->field_bit == FIELD_CUSTOM &&
|
||||
/* caution: tif_fields[i] must not be the beginning of a fields-array.
|
||||
* Otherwise the following tags are also freed with the first free().
|
||||
*/
|
||||
TIFFFieldIsAnonymous(fld)) {
|
||||
_TIFFfreeExt(tif, fld->field_name);
|
||||
_TIFFfreeExt(tif, fld);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_TIFFfreeExt(tif, tif->tif_fields);
|
||||
}
|
||||
|
||||
if (tif->tif_nfieldscompat > 0) {
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < tif->tif_nfieldscompat; i++) {
|
||||
if (tif->tif_fieldscompat[i].allocated_size)
|
||||
_TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
|
||||
for (i = 0; i < tif->tif_nfields; i++)
|
||||
{
|
||||
TIFFField *fld = tif->tif_fields[i];
|
||||
if (fld->field_name != NULL)
|
||||
{
|
||||
if (fld->field_bit == FIELD_CUSTOM &&
|
||||
/* caution: tif_fields[i] must not be the beginning of a
|
||||
* fields-array. Otherwise the following tags are also freed
|
||||
* with the first free().
|
||||
*/
|
||||
TIFFFieldIsAnonymous(fld))
|
||||
{
|
||||
_TIFFfreeExt(tif, fld->field_name);
|
||||
_TIFFfreeExt(tif, fld);
|
||||
}
|
||||
_TIFFfreeExt(tif, tif->tif_fieldscompat);
|
||||
}
|
||||
}
|
||||
|
||||
_TIFFfreeExt(NULL, tif);
|
||||
_TIFFfreeExt(tif, tif->tif_fields);
|
||||
}
|
||||
|
||||
if (tif->tif_nfieldscompat > 0)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < tif->tif_nfieldscompat; i++)
|
||||
{
|
||||
if (tif->tif_fieldscompat[i].allocated_size)
|
||||
_TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
|
||||
}
|
||||
_TIFFfreeExt(tif, tif->tif_fieldscompat);
|
||||
}
|
||||
|
||||
_TIFFfreeExt(NULL, tif);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
@@ -120,16 +126,15 @@ TIFFCleanup(TIFF* tif)
|
||||
* TIFFClose closes a file that was previously opened with TIFFOpen().
|
||||
* Any buffered data are flushed to the file, including the contents of
|
||||
* the current directory (if modified); and all resources are reclaimed.
|
||||
*
|
||||
*
|
||||
* @param tif A TIFF pointer.
|
||||
*/
|
||||
|
||||
void
|
||||
TIFFClose(TIFF* tif)
|
||||
void TIFFClose(TIFF *tif)
|
||||
{
|
||||
TIFFCloseProc closeproc = tif->tif_closeproc;
|
||||
thandle_t fd = tif->tif_clientdata;
|
||||
TIFFCloseProc closeproc = tif->tif_closeproc;
|
||||
thandle_t fd = tif->tif_clientdata;
|
||||
|
||||
TIFFCleanup(tif);
|
||||
(void) (*closeproc)(fd);
|
||||
TIFFCleanup(tif);
|
||||
(void)(*closeproc)(fd);
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
|
||||
static int NotConfigured(TIFF*, int);
|
||||
static int NotConfigured(TIFF *, int);
|
||||
|
||||
#ifndef LZW_SUPPORT
|
||||
#define TIFFInitLZW NotConfigured
|
||||
@@ -84,55 +84,52 @@ static int NotConfigured(TIFF*, int);
|
||||
* Compression schemes statically built into the library.
|
||||
*/
|
||||
const TIFFCodec _TIFFBuiltinCODECS[] = {
|
||||
{ "None", COMPRESSION_NONE, TIFFInitDumpMode },
|
||||
{ "LZW", COMPRESSION_LZW, TIFFInitLZW },
|
||||
{ "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits },
|
||||
{ "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan },
|
||||
{ "NeXT", COMPRESSION_NEXT, TIFFInitNeXT },
|
||||
{ "JPEG", COMPRESSION_JPEG, TIFFInitJPEG },
|
||||
{ "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG },
|
||||
{ "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE },
|
||||
{ "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW },
|
||||
{ "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 },
|
||||
{ "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 },
|
||||
{ "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG },
|
||||
{ "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP },
|
||||
{ "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP },
|
||||
{ "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog },
|
||||
{ "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog },
|
||||
{ "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog },
|
||||
{ "LZMA", COMPRESSION_LZMA, TIFFInitLZMA },
|
||||
{ "ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD },
|
||||
{ "WEBP", COMPRESSION_WEBP, TIFFInitWebP },
|
||||
{ "LERC", COMPRESSION_LERC, TIFFInitLERC },
|
||||
{ NULL, 0, NULL }
|
||||
};
|
||||
{"None", COMPRESSION_NONE, TIFFInitDumpMode},
|
||||
{"LZW", COMPRESSION_LZW, TIFFInitLZW},
|
||||
{"PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits},
|
||||
{"ThunderScan", COMPRESSION_THUNDERSCAN, TIFFInitThunderScan},
|
||||
{"NeXT", COMPRESSION_NEXT, TIFFInitNeXT},
|
||||
{"JPEG", COMPRESSION_JPEG, TIFFInitJPEG},
|
||||
{"Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG},
|
||||
{"CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE},
|
||||
{"CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW},
|
||||
{"CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3},
|
||||
{"CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4},
|
||||
{"ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG},
|
||||
{"Deflate", COMPRESSION_DEFLATE, TIFFInitZIP},
|
||||
{"AdobeDeflate", COMPRESSION_ADOBE_DEFLATE, TIFFInitZIP},
|
||||
{"PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog},
|
||||
{"SGILog", COMPRESSION_SGILOG, TIFFInitSGILog},
|
||||
{"SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog},
|
||||
{"LZMA", COMPRESSION_LZMA, TIFFInitLZMA},
|
||||
{"ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD},
|
||||
{"WEBP", COMPRESSION_WEBP, TIFFInitWebP},
|
||||
{"LERC", COMPRESSION_LERC, TIFFInitLERC},
|
||||
{NULL, 0, NULL}};
|
||||
|
||||
static int
|
||||
_notConfigured(TIFF* tif)
|
||||
static int _notConfigured(TIFF *tif)
|
||||
{
|
||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
char compression_code[20];
|
||||
|
||||
snprintf(compression_code, sizeof(compression_code), "%"PRIu16,
|
||||
tif->tif_dir.td_compression );
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%s compression support is not configured",
|
||||
c ? c->name : compression_code );
|
||||
return (0);
|
||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
char compression_code[20];
|
||||
|
||||
snprintf(compression_code, sizeof(compression_code), "%" PRIu16,
|
||||
tif->tif_dir.td_compression);
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%s compression support is not configured",
|
||||
c ? c->name : compression_code);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
NotConfigured(TIFF* tif, int scheme)
|
||||
static int NotConfigured(TIFF *tif, int scheme)
|
||||
{
|
||||
(void) scheme;
|
||||
(void)scheme;
|
||||
|
||||
tif->tif_fixuptags = _notConfigured;
|
||||
tif->tif_decodestatus = FALSE;
|
||||
tif->tif_setupdecode = _notConfigured;
|
||||
tif->tif_encodestatus = FALSE;
|
||||
tif->tif_setupencode = _notConfigured;
|
||||
return (1);
|
||||
tif->tif_fixuptags = _notConfigured;
|
||||
tif->tif_decodestatus = FALSE;
|
||||
tif->tif_setupdecode = _notConfigured;
|
||||
tif->tif_encodestatus = FALSE;
|
||||
tif->tif_setupencode = _notConfigured;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
@@ -146,19 +143,21 @@ NotConfigured(TIFF* tif, int scheme)
|
||||
* 0 will be returned.
|
||||
*/
|
||||
|
||||
int
|
||||
TIFFIsCODECConfigured(uint16_t scheme)
|
||||
int TIFFIsCODECConfigured(uint16_t scheme)
|
||||
{
|
||||
const TIFFCodec* codec = TIFFFindCODEC(scheme);
|
||||
const TIFFCodec *codec = TIFFFindCODEC(scheme);
|
||||
|
||||
if(codec == NULL) {
|
||||
return 0;
|
||||
}
|
||||
if(codec->init == NULL) {
|
||||
return 0;
|
||||
}
|
||||
if(codec->init != NotConfigured){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if (codec == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (codec->init == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (codec->init != NotConfigured)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -40,11 +40,10 @@
|
||||
/*
|
||||
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
|
||||
*/
|
||||
void
|
||||
TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
|
||||
float *X, float *Y, float *Z)
|
||||
void TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
|
||||
float *X, float *Y, float *Z)
|
||||
{
|
||||
TIFFCIELab16ToXYZ(cielab, l * 257, a * 256, b * 256, X, Y, Z);
|
||||
TIFFCIELab16ToXYZ(cielab, l * 257, a * 256, b * 256, X, Y, Z);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -53,78 +52,79 @@ TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
|
||||
* bit chrominance values are encoded as 256 times the 1976 CIE a* and b*
|
||||
* values
|
||||
*/
|
||||
void
|
||||
TIFFCIELab16ToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
|
||||
float *X, float *Y, float *Z)
|
||||
void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a,
|
||||
int32_t b, float *X, float *Y, float *Z)
|
||||
{
|
||||
float L = (float)l * 100.0F / 65535.0F;
|
||||
float cby, tmp;
|
||||
float L = (float)l * 100.0F / 65535.0F;
|
||||
float cby, tmp;
|
||||
|
||||
if( L < 8.856F ) {
|
||||
*Y = (L * cielab->Y0) / 903.292F;
|
||||
cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
|
||||
} else {
|
||||
cby = (L + 16.0F) / 116.0F;
|
||||
*Y = cielab->Y0 * cby * cby * cby;
|
||||
}
|
||||
if (L < 8.856F)
|
||||
{
|
||||
*Y = (L * cielab->Y0) / 903.292F;
|
||||
cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
|
||||
}
|
||||
else
|
||||
{
|
||||
cby = (L + 16.0F) / 116.0F;
|
||||
*Y = cielab->Y0 * cby * cby * cby;
|
||||
}
|
||||
|
||||
tmp = (float)a / 256.0F / 500.0F + cby;
|
||||
if( tmp < 0.2069F )
|
||||
*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
|
||||
else
|
||||
*X = cielab->X0 * tmp * tmp * tmp;
|
||||
tmp = (float)a / 256.0F / 500.0F + cby;
|
||||
if (tmp < 0.2069F)
|
||||
*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
|
||||
else
|
||||
*X = cielab->X0 * tmp * tmp * tmp;
|
||||
|
||||
tmp = cby - (float)b / 256.0F / 200.0F;
|
||||
if( tmp < 0.2069F )
|
||||
*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
|
||||
else
|
||||
*Z = cielab->Z0 * tmp * tmp * tmp;
|
||||
tmp = cby - (float)b / 256.0F / 200.0F;
|
||||
if (tmp < 0.2069F)
|
||||
*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
|
||||
else
|
||||
*Z = cielab->Z0 * tmp * tmp * tmp;
|
||||
}
|
||||
|
||||
#define RINT(R) ((uint32_t)((R)>0?((R)+0.5):((R)-0.5)))
|
||||
#define RINT(R) ((uint32_t)((R) > 0 ? ((R) + 0.5) : ((R)-0.5)))
|
||||
/*
|
||||
* Convert color value from the XYZ space to RGB.
|
||||
*/
|
||||
void
|
||||
TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
||||
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||
void TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
||||
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||
{
|
||||
int i;
|
||||
float Yr, Yg, Yb;
|
||||
float *matrix = &cielab->display.d_mat[0][0];
|
||||
int i;
|
||||
float Yr, Yg, Yb;
|
||||
float *matrix = &cielab->display.d_mat[0][0];
|
||||
|
||||
/* Multiply through the matrix to get luminosity values. */
|
||||
Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
|
||||
Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
|
||||
Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
|
||||
/* Multiply through the matrix to get luminosity values. */
|
||||
Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
|
||||
Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
|
||||
Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
|
||||
|
||||
/* Clip input */
|
||||
Yr = TIFFmax(Yr, cielab->display.d_Y0R);
|
||||
Yg = TIFFmax(Yg, cielab->display.d_Y0G);
|
||||
Yb = TIFFmax(Yb, cielab->display.d_Y0B);
|
||||
/* Clip input */
|
||||
Yr = TIFFmax(Yr, cielab->display.d_Y0R);
|
||||
Yg = TIFFmax(Yg, cielab->display.d_Y0G);
|
||||
Yb = TIFFmax(Yb, cielab->display.d_Y0B);
|
||||
|
||||
/* Avoid overflow in case of wrong input values */
|
||||
Yr = TIFFmin(Yr, cielab->display.d_YCR);
|
||||
Yg = TIFFmin(Yg, cielab->display.d_YCG);
|
||||
Yb = TIFFmin(Yb, cielab->display.d_YCB);
|
||||
/* Avoid overflow in case of wrong input values */
|
||||
Yr = TIFFmin(Yr, cielab->display.d_YCR);
|
||||
Yg = TIFFmin(Yg, cielab->display.d_YCG);
|
||||
Yb = TIFFmin(Yb, cielab->display.d_YCB);
|
||||
|
||||
/* Turn luminosity to colour value. */
|
||||
i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*r = RINT(cielab->Yr2r[i]);
|
||||
/* Turn luminosity to colour value. */
|
||||
i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*r = RINT(cielab->Yr2r[i]);
|
||||
|
||||
i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*g = RINT(cielab->Yg2g[i]);
|
||||
i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*g = RINT(cielab->Yg2g[i]);
|
||||
|
||||
i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*b = RINT(cielab->Yb2b[i]);
|
||||
i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep);
|
||||
i = TIFFmin(cielab->range, i);
|
||||
*b = RINT(cielab->Yb2b[i]);
|
||||
|
||||
/* Clip output. */
|
||||
*r = TIFFmin(*r, cielab->display.d_Vrwr);
|
||||
*g = TIFFmin(*g, cielab->display.d_Vrwg);
|
||||
*b = TIFFmin(*b, cielab->display.d_Vrwb);
|
||||
/* Clip output. */
|
||||
*r = TIFFmin(*r, cielab->display.d_Vrwr);
|
||||
*g = TIFFmin(*g, cielab->display.d_Vrwg);
|
||||
*b = TIFFmin(*b, cielab->display.d_Vrwb);
|
||||
}
|
||||
#undef RINT
|
||||
|
||||
@@ -132,50 +132,52 @@ TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
||||
* Allocate conversion state structures and make look_up tables for
|
||||
* the Yr,Yb,Yg <=> r,g,b conversions.
|
||||
*/
|
||||
int
|
||||
TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
||||
const TIFFDisplay *display, float *refWhite)
|
||||
int TIFFCIELabToRGBInit(TIFFCIELabToRGB *cielab, const TIFFDisplay *display,
|
||||
float *refWhite)
|
||||
{
|
||||
int i;
|
||||
double dfGamma;
|
||||
int i;
|
||||
double dfGamma;
|
||||
|
||||
cielab->range = CIELABTORGB_TABLE_RANGE;
|
||||
cielab->range = CIELABTORGB_TABLE_RANGE;
|
||||
|
||||
_TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
|
||||
_TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
|
||||
|
||||
/* Red */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaR ;
|
||||
cielab->rstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for(i = 0; i <= cielab->range; i++) {
|
||||
cielab->Yr2r[i] = cielab->display.d_Vrwr
|
||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
/* Red */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaR;
|
||||
cielab->rstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for (i = 0; i <= cielab->range; i++)
|
||||
{
|
||||
cielab->Yr2r[i] = cielab->display.d_Vrwr *
|
||||
((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
|
||||
/* Green */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaG ;
|
||||
cielab->gstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for(i = 0; i <= cielab->range; i++) {
|
||||
cielab->Yg2g[i] = cielab->display.d_Vrwg
|
||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
/* Green */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaG;
|
||||
cielab->gstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for (i = 0; i <= cielab->range; i++)
|
||||
{
|
||||
cielab->Yg2g[i] = cielab->display.d_Vrwg *
|
||||
((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
|
||||
/* Blue */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaB ;
|
||||
cielab->bstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for(i = 0; i <= cielab->range; i++) {
|
||||
cielab->Yb2b[i] = cielab->display.d_Vrwb
|
||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
/* Blue */
|
||||
dfGamma = 1.0 / cielab->display.d_gammaB;
|
||||
cielab->bstep =
|
||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||
for (i = 0; i <= cielab->range; i++)
|
||||
{
|
||||
cielab->Yb2b[i] = cielab->display.d_Vrwb *
|
||||
((float)pow((double)i / cielab->range, dfGamma));
|
||||
}
|
||||
|
||||
/* Init reference white point */
|
||||
cielab->X0 = refWhite[0];
|
||||
cielab->Y0 = refWhite[1];
|
||||
cielab->Z0 = refWhite[2];
|
||||
/* Init reference white point */
|
||||
cielab->X0 = refWhite[0];
|
||||
cielab->Y0 = refWhite[1];
|
||||
cielab->Z0 = refWhite[2];
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -183,44 +185,46 @@ TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
||||
* The colorspace conversion algorithm comes from the IJG v5a code;
|
||||
* see below for more information on how it works.
|
||||
*/
|
||||
#define SHIFT 16
|
||||
#define FIX(x) ((int32_t)((x) * (1L<<SHIFT) + 0.5))
|
||||
#define ONE_HALF ((int32_t)(1<<(SHIFT-1)))
|
||||
#define Code2V(c, RB, RW, CR) ((((c)-(int32_t)(RB))*(float)(CR))/(float)(((RW)-(RB)!=0) ? ((RW)-(RB)) : 1))
|
||||
#define SHIFT 16
|
||||
#define FIX(x) ((int32_t)((x) * (1L << SHIFT) + 0.5))
|
||||
#define ONE_HALF ((int32_t)(1 << (SHIFT - 1)))
|
||||
#define Code2V(c, RB, RW, CR) \
|
||||
((((c) - (int32_t)(RB)) * (float)(CR)) / \
|
||||
(float)(((RW) - (RB) != 0) ? ((RW) - (RB)) : 1))
|
||||
/* !((f)>=(min)) written that way to deal with NaN */
|
||||
#define CLAMP(f,min,max) ((!((f)>=(min)))?(min):(f)>(max)?(max):(f))
|
||||
#define HICLAMP(f,max) ((f)>(max)?(max):(f))
|
||||
#define CLAMP(f, min, max) \
|
||||
((!((f) >= (min))) ? (min) : (f) > (max) ? (max) : (f))
|
||||
#define HICLAMP(f, max) ((f) > (max) ? (max) : (f))
|
||||
|
||||
void
|
||||
TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32_t Y, int32_t Cb, int32_t Cr,
|
||||
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||
void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32_t Y, int32_t Cb, int32_t Cr,
|
||||
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||
{
|
||||
int32_t i;
|
||||
int32_t i;
|
||||
|
||||
/* XXX: Only 8-bit YCbCr input supported for now */
|
||||
Y = HICLAMP(Y, 255);
|
||||
Cb = CLAMP(Cb, 0, 255);
|
||||
Cr = CLAMP(Cr, 0, 255);
|
||||
/* XXX: Only 8-bit YCbCr input supported for now */
|
||||
Y = HICLAMP(Y, 255);
|
||||
Cb = CLAMP(Cb, 0, 255);
|
||||
Cr = CLAMP(Cr, 0, 255);
|
||||
|
||||
i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
|
||||
*r = CLAMP(i, 0, 255);
|
||||
i = ycbcr->Y_tab[Y]
|
||||
+ (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
|
||||
*g = CLAMP(i, 0, 255);
|
||||
i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
|
||||
*b = CLAMP(i, 0, 255);
|
||||
i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
|
||||
*r = CLAMP(i, 0, 255);
|
||||
i = ycbcr->Y_tab[Y] +
|
||||
(int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
|
||||
*g = CLAMP(i, 0, 255);
|
||||
i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
|
||||
*b = CLAMP(i, 0, 255);
|
||||
}
|
||||
|
||||
/* Clamp function for sanitization purposes. Normally clamping should not */
|
||||
/* occur for well behaved chroma and refBlackWhite coefficients */
|
||||
static float CLAMPw(float v, float vmin, float vmax)
|
||||
{
|
||||
if( v < vmin )
|
||||
if (v < vmin)
|
||||
{
|
||||
/* printf("%f clamped to %f\n", v, vmin); */
|
||||
return vmin;
|
||||
}
|
||||
if( v > vmax )
|
||||
if (v > vmax)
|
||||
{
|
||||
/* printf("%f clamped to %f\n", v, vmax); */
|
||||
return vmax;
|
||||
@@ -244,69 +248,75 @@ static float CLAMPw(float v, float vmin, float vmax)
|
||||
* pre-calculating possible values indexed by Cb and Cr (this code
|
||||
* assumes conversion is being done for 8-bit samples).
|
||||
*/
|
||||
int
|
||||
TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
||||
int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *ycbcr, float *luma, float *refBlackWhite)
|
||||
{
|
||||
TIFFRGBValue* clamptab;
|
||||
TIFFRGBValue *clamptab;
|
||||
int i;
|
||||
|
||||
#define LumaRed luma[0]
|
||||
#define LumaGreen luma[1]
|
||||
#define LumaBlue luma[2]
|
||||
#define LumaRed luma[0]
|
||||
#define LumaGreen luma[1]
|
||||
#define LumaBlue luma[2]
|
||||
|
||||
clamptab = (TIFFRGBValue*)(
|
||||
(uint8_t*) ycbcr + TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long)));
|
||||
_TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
|
||||
clamptab =
|
||||
(TIFFRGBValue *)((uint8_t *)ycbcr +
|
||||
TIFFroundup_32(sizeof(TIFFYCbCrToRGB), sizeof(long)));
|
||||
_TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
|
||||
ycbcr->clamptab = (clamptab += 256);
|
||||
for (i = 0; i < 256; i++)
|
||||
clamptab[i] = (TIFFRGBValue) i;
|
||||
_TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */
|
||||
ycbcr->Cr_r_tab = (int*) (clamptab + 3*256);
|
||||
clamptab[i] = (TIFFRGBValue)i;
|
||||
_TIFFmemset(clamptab + 256, 255, 2 * 256); /* v > 255 => 255 */
|
||||
ycbcr->Cr_r_tab = (int *)(clamptab + 3 * 256);
|
||||
ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
|
||||
ycbcr->Cr_g_tab = (int32_t*) (ycbcr->Cb_b_tab + 256);
|
||||
ycbcr->Cr_g_tab = (int32_t *)(ycbcr->Cb_b_tab + 256);
|
||||
ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
|
||||
ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
|
||||
|
||||
{ float f1 = 2-2*LumaRed; int32_t D1 = FIX(CLAMP(f1, 0.0F, 2.0F));
|
||||
float f2 = LumaRed*f1/LumaGreen; int32_t D2 = -FIX(CLAMP(f2, 0.0F, 2.0F));
|
||||
float f3 = 2-2*LumaBlue; int32_t D3 = FIX(CLAMP(f3, 0.0F, 2.0F));
|
||||
float f4 = LumaBlue*f3/LumaGreen; int32_t D4 = -FIX(CLAMP(f4, 0.0F, 2.0F));
|
||||
int x;
|
||||
{
|
||||
float f1 = 2 - 2 * LumaRed;
|
||||
int32_t D1 = FIX(CLAMP(f1, 0.0F, 2.0F));
|
||||
float f2 = LumaRed * f1 / LumaGreen;
|
||||
int32_t D2 = -FIX(CLAMP(f2, 0.0F, 2.0F));
|
||||
float f3 = 2 - 2 * LumaBlue;
|
||||
int32_t D3 = FIX(CLAMP(f3, 0.0F, 2.0F));
|
||||
float f4 = LumaBlue * f3 / LumaGreen;
|
||||
int32_t D4 = -FIX(CLAMP(f4, 0.0F, 2.0F));
|
||||
int x;
|
||||
|
||||
#undef LumaBlue
|
||||
#undef LumaGreen
|
||||
#undef LumaRed
|
||||
|
||||
/*
|
||||
* i is the actual input pixel value in the range 0..255
|
||||
* Cb and Cr values are in the range -128..127 (actually
|
||||
* they are in a range defined by the ReferenceBlackWhite
|
||||
* tag) so there is some range shifting to do here when
|
||||
* constructing tables indexed by the raw pixel data.
|
||||
*/
|
||||
for (i = 0, x = -128; i < 256; i++, x++) {
|
||||
int32_t Cr = (int32_t)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
|
||||
refBlackWhite[5] - 128.0F, 127),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
int32_t Cb = (int32_t)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
|
||||
refBlackWhite[3] - 128.0F, 127),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
/*
|
||||
* i is the actual input pixel value in the range 0..255
|
||||
* Cb and Cr values are in the range -128..127 (actually
|
||||
* they are in a range defined by the ReferenceBlackWhite
|
||||
* tag) so there is some range shifting to do here when
|
||||
* constructing tables indexed by the raw pixel data.
|
||||
*/
|
||||
for (i = 0, x = -128; i < 256; i++, x++)
|
||||
{
|
||||
int32_t Cr = (int32_t)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
|
||||
refBlackWhite[5] - 128.0F, 127),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
int32_t Cb = (int32_t)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
|
||||
refBlackWhite[3] - 128.0F, 127),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
|
||||
ycbcr->Cr_r_tab[i] = (int32_t)((D1 * Cr + ONE_HALF) >> SHIFT);
|
||||
ycbcr->Cb_b_tab[i] = (int32_t)((D3 * Cb + ONE_HALF) >> SHIFT);
|
||||
ycbcr->Cr_g_tab[i] = D2*Cr;
|
||||
ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF;
|
||||
ycbcr->Y_tab[i] =
|
||||
(int32_t)CLAMPw(Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
}
|
||||
ycbcr->Cr_r_tab[i] = (int32_t)((D1 * Cr + ONE_HALF) >> SHIFT);
|
||||
ycbcr->Cb_b_tab[i] = (int32_t)((D3 * Cb + ONE_HALF) >> SHIFT);
|
||||
ycbcr->Cr_g_tab[i] = D2 * Cr;
|
||||
ycbcr->Cb_g_tab[i] = D4 * Cb + ONE_HALF;
|
||||
ycbcr->Y_tab[i] = (int32_t)CLAMPw(
|
||||
Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
|
||||
-128.0F * 32, 128.0F * 32);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#undef HICLAMP
|
||||
#undef CLAMP
|
||||
#undef Code2V
|
||||
#undef SHIFT
|
||||
#undef ONE_HALF
|
||||
#undef FIX
|
||||
#undef HICLAMP
|
||||
#undef CLAMP
|
||||
#undef Code2V
|
||||
#undef SHIFT
|
||||
#undef ONE_HALF
|
||||
#undef FIX
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -29,145 +29,152 @@
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
|
||||
static int
|
||||
TIFFNoEncode(TIFF* tif, const char* method)
|
||||
static int TIFFNoEncode(TIFF *tif, const char *method)
|
||||
{
|
||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
|
||||
if (c) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%s %s encoding is not implemented",
|
||||
c->name, method);
|
||||
} else {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression scheme %"PRIu16" %s encoding is not implemented",
|
||||
tif->tif_dir.td_compression, method);
|
||||
}
|
||||
return (-1);
|
||||
if (c)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%s %s encoding is not implemented",
|
||||
c->name, method);
|
||||
}
|
||||
else
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression scheme %" PRIu16
|
||||
" %s encoding is not implemented",
|
||||
tif->tif_dir.td_compression, method);
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoRowEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoEncode(tif, "scanline"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoEncode(tif, "scanline"));
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoStripEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoEncode(tif, "strip"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoEncode(tif, "strip"));
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoTileEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoTileEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoEncode(tif, "tile"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoEncode(tif, "tile"));
|
||||
}
|
||||
|
||||
static int
|
||||
TIFFNoDecode(TIFF* tif, const char* method)
|
||||
static int TIFFNoDecode(TIFF *tif, const char *method)
|
||||
{
|
||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||
|
||||
if (c)
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%s %s decoding is not implemented",
|
||||
c->name, method);
|
||||
else
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression scheme %"PRIu16" %s decoding is not implemented",
|
||||
tif->tif_dir.td_compression, method);
|
||||
return (0);
|
||||
if (c)
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%s %s decoding is not implemented",
|
||||
c->name, method);
|
||||
else
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression scheme %" PRIu16
|
||||
" %s decoding is not implemented",
|
||||
tif->tif_dir.td_compression, method);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
_TIFFNoFixupTags(TIFF* tif)
|
||||
static int _TIFFNoFixupTags(TIFF *tif)
|
||||
{
|
||||
(void) tif;
|
||||
return (1);
|
||||
(void)tif;
|
||||
return (1);
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoRowDecode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoDecode(tif, "scanline"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoDecode(tif, "scanline"));
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoStripDecode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoDecode(tif, "strip"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoDecode(tif, "strip"));
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoTileDecode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
int _TIFFNoTileDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) pp; (void) cc; (void) s;
|
||||
return (TIFFNoDecode(tif, "tile"));
|
||||
(void)pp;
|
||||
(void)cc;
|
||||
(void)s;
|
||||
return (TIFFNoDecode(tif, "tile"));
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoSeek(TIFF* tif, uint32_t off)
|
||||
int _TIFFNoSeek(TIFF *tif, uint32_t off)
|
||||
{
|
||||
(void) off;
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression algorithm does not support random access");
|
||||
return (0);
|
||||
(void)off;
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"Compression algorithm does not support random access");
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFNoPreCode(TIFF* tif, uint16_t s)
|
||||
int _TIFFNoPreCode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
(void) tif; (void) s;
|
||||
return (1);
|
||||
(void)tif;
|
||||
(void)s;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
|
||||
static void _TIFFvoid(TIFF* tif) { (void) tif; }
|
||||
|
||||
void
|
||||
_TIFFSetDefaultCompressionState(TIFF* tif)
|
||||
static int _TIFFtrue(TIFF *tif)
|
||||
{
|
||||
tif->tif_fixuptags = _TIFFNoFixupTags;
|
||||
tif->tif_decodestatus = TRUE;
|
||||
tif->tif_setupdecode = _TIFFtrue;
|
||||
tif->tif_predecode = _TIFFNoPreCode;
|
||||
tif->tif_decoderow = _TIFFNoRowDecode;
|
||||
tif->tif_decodestrip = _TIFFNoStripDecode;
|
||||
tif->tif_decodetile = _TIFFNoTileDecode;
|
||||
tif->tif_encodestatus = TRUE;
|
||||
tif->tif_setupencode = _TIFFtrue;
|
||||
tif->tif_preencode = _TIFFNoPreCode;
|
||||
tif->tif_postencode = _TIFFtrue;
|
||||
tif->tif_encoderow = _TIFFNoRowEncode;
|
||||
tif->tif_encodestrip = _TIFFNoStripEncode;
|
||||
tif->tif_encodetile = _TIFFNoTileEncode;
|
||||
tif->tif_close = _TIFFvoid;
|
||||
tif->tif_seek = _TIFFNoSeek;
|
||||
tif->tif_cleanup = _TIFFvoid;
|
||||
tif->tif_defstripsize = _TIFFDefaultStripSize;
|
||||
tif->tif_deftilesize = _TIFFDefaultTileSize;
|
||||
tif->tif_flags &= ~(TIFF_NOBITREV|TIFF_NOREADRAW);
|
||||
(void)tif;
|
||||
return (1);
|
||||
}
|
||||
static void _TIFFvoid(TIFF *tif) { (void)tif; }
|
||||
|
||||
void _TIFFSetDefaultCompressionState(TIFF *tif)
|
||||
{
|
||||
tif->tif_fixuptags = _TIFFNoFixupTags;
|
||||
tif->tif_decodestatus = TRUE;
|
||||
tif->tif_setupdecode = _TIFFtrue;
|
||||
tif->tif_predecode = _TIFFNoPreCode;
|
||||
tif->tif_decoderow = _TIFFNoRowDecode;
|
||||
tif->tif_decodestrip = _TIFFNoStripDecode;
|
||||
tif->tif_decodetile = _TIFFNoTileDecode;
|
||||
tif->tif_encodestatus = TRUE;
|
||||
tif->tif_setupencode = _TIFFtrue;
|
||||
tif->tif_preencode = _TIFFNoPreCode;
|
||||
tif->tif_postencode = _TIFFtrue;
|
||||
tif->tif_encoderow = _TIFFNoRowEncode;
|
||||
tif->tif_encodestrip = _TIFFNoStripEncode;
|
||||
tif->tif_encodetile = _TIFFNoTileEncode;
|
||||
tif->tif_close = _TIFFvoid;
|
||||
tif->tif_seek = _TIFFNoSeek;
|
||||
tif->tif_cleanup = _TIFFvoid;
|
||||
tif->tif_defstripsize = _TIFFDefaultStripSize;
|
||||
tif->tif_deftilesize = _TIFFDefaultTileSize;
|
||||
tif->tif_flags &= ~(TIFF_NOBITREV | TIFF_NOREADRAW);
|
||||
}
|
||||
|
||||
int
|
||||
TIFFSetCompressionScheme(TIFF* tif, int scheme)
|
||||
int TIFFSetCompressionScheme(TIFF *tif, int scheme)
|
||||
{
|
||||
const TIFFCodec *c = TIFFFindCODEC((uint16_t) scheme);
|
||||
const TIFFCodec *c = TIFFFindCODEC((uint16_t)scheme);
|
||||
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
/*
|
||||
* Don't treat an unknown compression scheme as an error.
|
||||
* This permits applications to open files with data that
|
||||
* the library does not have builtin support for, but which
|
||||
* may still be meaningful.
|
||||
*/
|
||||
return (c ? (*c->init)(tif, scheme) : 1);
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
/*
|
||||
* Don't treat an unknown compression scheme as an error.
|
||||
* This permits applications to open files with data that
|
||||
* the library does not have builtin support for, but which
|
||||
* may still be meaningful.
|
||||
*/
|
||||
return (c ? (*c->init)(tif, scheme) : 1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -175,64 +182,68 @@ TIFFSetCompressionScheme(TIFF* tif, int scheme)
|
||||
* schemes can also override the builtin versions provided
|
||||
* by this library.
|
||||
*/
|
||||
typedef struct _codec {
|
||||
struct _codec* next;
|
||||
TIFFCodec* info;
|
||||
typedef struct _codec
|
||||
{
|
||||
struct _codec *next;
|
||||
TIFFCodec *info;
|
||||
} codec_t;
|
||||
static codec_t* registeredCODECS = NULL;
|
||||
static codec_t *registeredCODECS = NULL;
|
||||
|
||||
const TIFFCodec*
|
||||
TIFFFindCODEC(uint16_t scheme)
|
||||
const TIFFCodec *TIFFFindCODEC(uint16_t scheme)
|
||||
{
|
||||
const TIFFCodec* c;
|
||||
codec_t* cd;
|
||||
const TIFFCodec *c;
|
||||
codec_t *cd;
|
||||
|
||||
for (cd = registeredCODECS; cd; cd = cd->next)
|
||||
if (cd->info->scheme == scheme)
|
||||
return ((const TIFFCodec*) cd->info);
|
||||
for (c = _TIFFBuiltinCODECS; c->name; c++)
|
||||
if (c->scheme == scheme)
|
||||
return (c);
|
||||
return ((const TIFFCodec*) 0);
|
||||
for (cd = registeredCODECS; cd; cd = cd->next)
|
||||
if (cd->info->scheme == scheme)
|
||||
return ((const TIFFCodec *)cd->info);
|
||||
for (c = _TIFFBuiltinCODECS; c->name; c++)
|
||||
if (c->scheme == scheme)
|
||||
return (c);
|
||||
return ((const TIFFCodec *)0);
|
||||
}
|
||||
|
||||
TIFFCodec*
|
||||
TIFFRegisterCODEC(uint16_t scheme, const char* name, TIFFInitMethod init)
|
||||
TIFFCodec *TIFFRegisterCODEC(uint16_t scheme, const char *name,
|
||||
TIFFInitMethod init)
|
||||
{
|
||||
codec_t* cd = (codec_t*)
|
||||
_TIFFmallocExt(NULL, (tmsize_t)(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1));
|
||||
codec_t *cd = (codec_t *)_TIFFmallocExt(
|
||||
NULL,
|
||||
(tmsize_t)(sizeof(codec_t) + sizeof(TIFFCodec) + strlen(name) + 1));
|
||||
|
||||
if (cd != NULL) {
|
||||
cd->info = (TIFFCodec*) ((uint8_t*) cd + sizeof (codec_t));
|
||||
cd->info->name = (char*)
|
||||
((uint8_t*) cd->info + sizeof (TIFFCodec));
|
||||
strcpy(cd->info->name, name);
|
||||
cd->info->scheme = scheme;
|
||||
cd->info->init = init;
|
||||
cd->next = registeredCODECS;
|
||||
registeredCODECS = cd;
|
||||
} else {
|
||||
TIFFErrorExt(0, "TIFFRegisterCODEC",
|
||||
"No space to register compression scheme %s", name);
|
||||
return NULL;
|
||||
}
|
||||
return (cd->info);
|
||||
if (cd != NULL)
|
||||
{
|
||||
cd->info = (TIFFCodec *)((uint8_t *)cd + sizeof(codec_t));
|
||||
cd->info->name = (char *)((uint8_t *)cd->info + sizeof(TIFFCodec));
|
||||
strcpy(cd->info->name, name);
|
||||
cd->info->scheme = scheme;
|
||||
cd->info->init = init;
|
||||
cd->next = registeredCODECS;
|
||||
registeredCODECS = cd;
|
||||
}
|
||||
else
|
||||
{
|
||||
TIFFErrorExt(0, "TIFFRegisterCODEC",
|
||||
"No space to register compression scheme %s", name);
|
||||
return NULL;
|
||||
}
|
||||
return (cd->info);
|
||||
}
|
||||
|
||||
void
|
||||
TIFFUnRegisterCODEC(TIFFCodec* c)
|
||||
void TIFFUnRegisterCODEC(TIFFCodec *c)
|
||||
{
|
||||
codec_t* cd;
|
||||
codec_t** pcd;
|
||||
codec_t *cd;
|
||||
codec_t **pcd;
|
||||
|
||||
for (pcd = ®isteredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
|
||||
if (cd->info == c) {
|
||||
*pcd = cd->next;
|
||||
_TIFFfreeExt(NULL, cd);
|
||||
return;
|
||||
}
|
||||
TIFFErrorExt(0, "TIFFUnRegisterCODEC",
|
||||
"Cannot remove compression scheme %s; not registered", c->name);
|
||||
for (pcd = ®isteredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
|
||||
if (cd->info == c)
|
||||
{
|
||||
*pcd = cd->next;
|
||||
_TIFFfreeExt(NULL, cd);
|
||||
return;
|
||||
}
|
||||
TIFFErrorExt(0, "TIFFUnRegisterCODEC",
|
||||
"Cannot remove compression scheme %s; not registered",
|
||||
c->name);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
@@ -242,52 +253,58 @@ TIFFUnRegisterCODEC(TIFFCodec* c)
|
||||
/**
|
||||
* Get list of configured codecs, both built-in and registered by user.
|
||||
* Caller is responsible to free this structure.
|
||||
*
|
||||
*
|
||||
* @return returns array of TIFFCodec records (the last record should be NULL)
|
||||
* or NULL if function failed.
|
||||
*/
|
||||
|
||||
TIFFCodec*
|
||||
TIFFGetConfiguredCODECs()
|
||||
TIFFCodec *TIFFGetConfiguredCODECs()
|
||||
{
|
||||
int i = 1;
|
||||
codec_t *cd;
|
||||
const TIFFCodec* c;
|
||||
TIFFCodec* codecs = NULL;
|
||||
TIFFCodec* new_codecs;
|
||||
int i = 1;
|
||||
codec_t *cd;
|
||||
const TIFFCodec *c;
|
||||
TIFFCodec *codecs = NULL;
|
||||
TIFFCodec *new_codecs;
|
||||
|
||||
for (cd = registeredCODECS; cd; cd = cd->next) {
|
||||
new_codecs = (TIFFCodec *)
|
||||
_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||
if (!new_codecs) {
|
||||
_TIFFfreeExt (NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
|
||||
i++;
|
||||
}
|
||||
for (c = _TIFFBuiltinCODECS; c->name; c++) {
|
||||
if (TIFFIsCODECConfigured(c->scheme)) {
|
||||
new_codecs = (TIFFCodec *)
|
||||
_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||
if (!new_codecs) {
|
||||
_TIFFfreeExt (NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemcpy(codecs + i - 1, (const void*)c, sizeof(TIFFCodec));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
for (cd = registeredCODECS; cd; cd = cd->next)
|
||||
{
|
||||
new_codecs =
|
||||
(TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||
if (!new_codecs)
|
||||
{
|
||||
_TIFFfreeExt(NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
|
||||
i++;
|
||||
}
|
||||
for (c = _TIFFBuiltinCODECS; c->name; c++)
|
||||
{
|
||||
if (TIFFIsCODECConfigured(c->scheme))
|
||||
{
|
||||
new_codecs = (TIFFCodec *)_TIFFreallocExt(NULL, codecs,
|
||||
i * sizeof(TIFFCodec));
|
||||
if (!new_codecs)
|
||||
{
|
||||
_TIFFfreeExt(NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemcpy(codecs + i - 1, (const void *)c, sizeof(TIFFCodec));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
new_codecs = (TIFFCodec *) _TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||
if (!new_codecs) {
|
||||
_TIFFfreeExt (NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
|
||||
new_codecs =
|
||||
(TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||
if (!new_codecs)
|
||||
{
|
||||
_TIFFfreeExt(NULL, codecs);
|
||||
return NULL;
|
||||
}
|
||||
codecs = new_codecs;
|
||||
_TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
|
||||
|
||||
return codecs;
|
||||
return codecs;
|
||||
}
|
||||
|
||||
3702
libtiff/tif_dir.c
3702
libtiff/tif_dir.c
File diff suppressed because it is too large
Load Diff
@@ -2,28 +2,28 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _TIFFDIR_
|
||||
#define _TIFFDIR_
|
||||
#define _TIFFDIR_
|
||||
|
||||
#include "tiff.h"
|
||||
#include "tiffio.h"
|
||||
@@ -32,10 +32,11 @@
|
||||
* ``Library-private'' Directory-related Definitions.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
const TIFFField *info;
|
||||
int count;
|
||||
void *value;
|
||||
typedef struct
|
||||
{
|
||||
const TIFFField *info;
|
||||
int count;
|
||||
void *value;
|
||||
} TIFFTagValue;
|
||||
|
||||
/*
|
||||
@@ -49,80 +50,91 @@ typedef struct {
|
||||
* BigTIFF, then it is placed in the offset field to save space. If so,
|
||||
* it is left-justified in the offset field.
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t tdir_tag; /* see below */
|
||||
uint16_t tdir_type; /* data type; see below */
|
||||
uint64_t tdir_count; /* number of items; length in spec */
|
||||
union {
|
||||
uint16_t toff_short;
|
||||
uint32_t toff_long;
|
||||
uint64_t toff_long8;
|
||||
} tdir_offset; /* either offset or the data itself if fits */
|
||||
uint8_t tdir_ignore; /* flag status to ignore tag when parsing tags in tif_dirread.c */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t tdir_tag; /* see below */
|
||||
uint16_t tdir_type; /* data type; see below */
|
||||
uint64_t tdir_count; /* number of items; length in spec */
|
||||
union
|
||||
{
|
||||
uint16_t toff_short;
|
||||
uint32_t toff_long;
|
||||
uint64_t toff_long8;
|
||||
} tdir_offset; /* either offset or the data itself if fits */
|
||||
uint8_t tdir_ignore; /* flag status to ignore tag when parsing tags in
|
||||
tif_dirread.c */
|
||||
} TIFFDirEntry;
|
||||
|
||||
/*
|
||||
* Internal format of a TIFF directory entry.
|
||||
*/
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
#define FIELD_SETLONGS 4
|
||||
/* bit vector of fields that are set */
|
||||
unsigned long td_fieldsset[FIELD_SETLONGS];
|
||||
/* bit vector of fields that are set */
|
||||
unsigned long td_fieldsset[FIELD_SETLONGS];
|
||||
|
||||
uint32_t td_imagewidth, td_imagelength, td_imagedepth;
|
||||
uint32_t td_tilewidth, td_tilelength, td_tiledepth;
|
||||
uint32_t td_subfiletype;
|
||||
uint16_t td_bitspersample;
|
||||
uint16_t td_sampleformat;
|
||||
uint16_t td_compression;
|
||||
uint16_t td_photometric;
|
||||
uint16_t td_threshholding;
|
||||
uint16_t td_fillorder;
|
||||
uint16_t td_orientation;
|
||||
uint16_t td_samplesperpixel;
|
||||
uint32_t td_rowsperstrip;
|
||||
uint16_t td_minsamplevalue, td_maxsamplevalue;
|
||||
double* td_sminsamplevalue;
|
||||
double* td_smaxsamplevalue;
|
||||
float td_xresolution, td_yresolution;
|
||||
uint16_t td_resolutionunit;
|
||||
uint16_t td_planarconfig;
|
||||
float td_xposition, td_yposition;
|
||||
uint16_t td_pagenumber[2];
|
||||
uint16_t* td_colormap[3];
|
||||
uint16_t td_halftonehints[2];
|
||||
uint16_t td_extrasamples;
|
||||
uint16_t* td_sampleinfo;
|
||||
/* even though the name is misleading, td_stripsperimage is the number
|
||||
* of striles (=strips or tiles) per plane, and td_nstrips the total
|
||||
* number of striles */
|
||||
uint32_t td_stripsperimage;
|
||||
uint32_t td_nstrips; /* size of offset & bytecount arrays */
|
||||
uint64_t* td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
|
||||
uint64_t* td_stripbytecount_p; /* should be accessed with TIFFGetStrileByteCount */
|
||||
uint32_t td_stripoffsetbyteallocsize; /* number of elements currently allocated for td_stripoffset/td_stripbytecount. Only used if TIFF_LAZYSTRILELOAD is set */
|
||||
uint32_t td_imagewidth, td_imagelength, td_imagedepth;
|
||||
uint32_t td_tilewidth, td_tilelength, td_tiledepth;
|
||||
uint32_t td_subfiletype;
|
||||
uint16_t td_bitspersample;
|
||||
uint16_t td_sampleformat;
|
||||
uint16_t td_compression;
|
||||
uint16_t td_photometric;
|
||||
uint16_t td_threshholding;
|
||||
uint16_t td_fillorder;
|
||||
uint16_t td_orientation;
|
||||
uint16_t td_samplesperpixel;
|
||||
uint32_t td_rowsperstrip;
|
||||
uint16_t td_minsamplevalue, td_maxsamplevalue;
|
||||
double *td_sminsamplevalue;
|
||||
double *td_smaxsamplevalue;
|
||||
float td_xresolution, td_yresolution;
|
||||
uint16_t td_resolutionunit;
|
||||
uint16_t td_planarconfig;
|
||||
float td_xposition, td_yposition;
|
||||
uint16_t td_pagenumber[2];
|
||||
uint16_t *td_colormap[3];
|
||||
uint16_t td_halftonehints[2];
|
||||
uint16_t td_extrasamples;
|
||||
uint16_t *td_sampleinfo;
|
||||
/* even though the name is misleading, td_stripsperimage is the number
|
||||
* of striles (=strips or tiles) per plane, and td_nstrips the total
|
||||
* number of striles */
|
||||
uint32_t td_stripsperimage;
|
||||
uint32_t td_nstrips; /* size of offset & bytecount arrays */
|
||||
uint64_t
|
||||
*td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
|
||||
uint64_t *td_stripbytecount_p; /* should be accessed with
|
||||
TIFFGetStrileByteCount */
|
||||
uint32_t
|
||||
td_stripoffsetbyteallocsize; /* number of elements currently allocated
|
||||
for td_stripoffset/td_stripbytecount.
|
||||
Only used if TIFF_LAZYSTRILELOAD is set
|
||||
*/
|
||||
#ifdef STRIPBYTECOUNTSORTED_UNUSED
|
||||
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
||||
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
||||
#endif
|
||||
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
||||
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
||||
uint16_t td_nsubifd;
|
||||
uint64_t* td_subifd;
|
||||
/* YCbCr parameters */
|
||||
uint16_t td_ycbcrsubsampling[2];
|
||||
uint16_t td_ycbcrpositioning;
|
||||
/* Colorimetry parameters */
|
||||
uint16_t* td_transferfunction[3];
|
||||
float* td_refblackwhite;
|
||||
/* CMYK parameters */
|
||||
int td_inknameslen;
|
||||
char* td_inknames;
|
||||
uint16_t td_numberofinks; /* number of inks in InkNames string */
|
||||
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
||||
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
||||
uint16_t td_nsubifd;
|
||||
uint64_t *td_subifd;
|
||||
/* YCbCr parameters */
|
||||
uint16_t td_ycbcrsubsampling[2];
|
||||
uint16_t td_ycbcrpositioning;
|
||||
/* Colorimetry parameters */
|
||||
uint16_t *td_transferfunction[3];
|
||||
float *td_refblackwhite;
|
||||
/* CMYK parameters */
|
||||
int td_inknameslen;
|
||||
char *td_inknames;
|
||||
uint16_t td_numberofinks; /* number of inks in InkNames string */
|
||||
|
||||
int td_customValueCount;
|
||||
TIFFTagValue *td_customValues;
|
||||
int td_customValueCount;
|
||||
TIFFTagValue *td_customValues;
|
||||
|
||||
unsigned char td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
|
||||
unsigned char
|
||||
td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
|
||||
} TIFFDirectory;
|
||||
|
||||
/*
|
||||
@@ -136,50 +148,49 @@ typedef struct {
|
||||
* Note that a bit *is* allocated for ignored tags; this is understood by the
|
||||
* directory reading logic which uses this fact to avoid special-case handling
|
||||
*/
|
||||
#define FIELD_IGNORE 0
|
||||
#define FIELD_IGNORE 0
|
||||
|
||||
/* multi-item fields */
|
||||
#define FIELD_IMAGEDIMENSIONS 1
|
||||
#define FIELD_TILEDIMENSIONS 2
|
||||
#define FIELD_RESOLUTION 3
|
||||
#define FIELD_POSITION 4
|
||||
#define FIELD_IMAGEDIMENSIONS 1
|
||||
#define FIELD_TILEDIMENSIONS 2
|
||||
#define FIELD_RESOLUTION 3
|
||||
#define FIELD_POSITION 4
|
||||
|
||||
/* single-item fields */
|
||||
#define FIELD_SUBFILETYPE 5
|
||||
#define FIELD_BITSPERSAMPLE 6
|
||||
#define FIELD_COMPRESSION 7
|
||||
#define FIELD_PHOTOMETRIC 8
|
||||
#define FIELD_THRESHHOLDING 9
|
||||
#define FIELD_FILLORDER 10
|
||||
#define FIELD_ORIENTATION 15
|
||||
#define FIELD_SAMPLESPERPIXEL 16
|
||||
#define FIELD_ROWSPERSTRIP 17
|
||||
#define FIELD_MINSAMPLEVALUE 18
|
||||
#define FIELD_MAXSAMPLEVALUE 19
|
||||
#define FIELD_PLANARCONFIG 20
|
||||
#define FIELD_RESOLUTIONUNIT 22
|
||||
#define FIELD_PAGENUMBER 23
|
||||
#define FIELD_STRIPBYTECOUNTS 24
|
||||
#define FIELD_STRIPOFFSETS 25
|
||||
#define FIELD_COLORMAP 26
|
||||
#define FIELD_EXTRASAMPLES 31
|
||||
#define FIELD_SAMPLEFORMAT 32
|
||||
#define FIELD_SMINSAMPLEVALUE 33
|
||||
#define FIELD_SMAXSAMPLEVALUE 34
|
||||
#define FIELD_IMAGEDEPTH 35
|
||||
#define FIELD_TILEDEPTH 36
|
||||
#define FIELD_HALFTONEHINTS 37
|
||||
#define FIELD_YCBCRSUBSAMPLING 39
|
||||
#define FIELD_YCBCRPOSITIONING 40
|
||||
#define FIELD_REFBLACKWHITE 41
|
||||
#define FIELD_TRANSFERFUNCTION 44
|
||||
#define FIELD_INKNAMES 46
|
||||
#define FIELD_SUBIFD 49
|
||||
#define FIELD_NUMBEROFINKS 50
|
||||
#define FIELD_SUBFILETYPE 5
|
||||
#define FIELD_BITSPERSAMPLE 6
|
||||
#define FIELD_COMPRESSION 7
|
||||
#define FIELD_PHOTOMETRIC 8
|
||||
#define FIELD_THRESHHOLDING 9
|
||||
#define FIELD_FILLORDER 10
|
||||
#define FIELD_ORIENTATION 15
|
||||
#define FIELD_SAMPLESPERPIXEL 16
|
||||
#define FIELD_ROWSPERSTRIP 17
|
||||
#define FIELD_MINSAMPLEVALUE 18
|
||||
#define FIELD_MAXSAMPLEVALUE 19
|
||||
#define FIELD_PLANARCONFIG 20
|
||||
#define FIELD_RESOLUTIONUNIT 22
|
||||
#define FIELD_PAGENUMBER 23
|
||||
#define FIELD_STRIPBYTECOUNTS 24
|
||||
#define FIELD_STRIPOFFSETS 25
|
||||
#define FIELD_COLORMAP 26
|
||||
#define FIELD_EXTRASAMPLES 31
|
||||
#define FIELD_SAMPLEFORMAT 32
|
||||
#define FIELD_SMINSAMPLEVALUE 33
|
||||
#define FIELD_SMAXSAMPLEVALUE 34
|
||||
#define FIELD_IMAGEDEPTH 35
|
||||
#define FIELD_TILEDEPTH 36
|
||||
#define FIELD_HALFTONEHINTS 37
|
||||
#define FIELD_YCBCRSUBSAMPLING 39
|
||||
#define FIELD_YCBCRPOSITIONING 40
|
||||
#define FIELD_REFBLACKWHITE 41
|
||||
#define FIELD_TRANSFERFUNCTION 44
|
||||
#define FIELD_INKNAMES 46
|
||||
#define FIELD_SUBIFD 49
|
||||
#define FIELD_NUMBEROFINKS 50
|
||||
/* FIELD_CUSTOM (see tiffio.h) 65 */
|
||||
/* end of support for well-known tags; codec-private tags follow */
|
||||
#define FIELD_CODEC 66 /* base of codec-private tags */
|
||||
|
||||
#define FIELD_CODEC 66 /* base of codec-private tags */
|
||||
|
||||
/*
|
||||
* Pseudo-tags don't normally need field bits since they are not written to an
|
||||
@@ -189,121 +200,135 @@ typedef struct {
|
||||
* or ``unset'' then it can do using internal state flags without polluting
|
||||
* the field bit space defined for real tags.
|
||||
*/
|
||||
#define FIELD_PSEUDO 0
|
||||
#define FIELD_PSEUDO 0
|
||||
|
||||
#define FIELD_LAST (32*FIELD_SETLONGS-1)
|
||||
#define FIELD_LAST (32 * FIELD_SETLONGS - 1)
|
||||
|
||||
#define BITn(n) (((unsigned long)1L)<<((n)&0x1f))
|
||||
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32])
|
||||
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
|
||||
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
|
||||
#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
|
||||
#define BITn(n) (((unsigned long)1L) << ((n)&0x1f))
|
||||
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
|
||||
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
|
||||
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
|
||||
#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
|
||||
|
||||
#define FieldSet(fields, f) (fields[(f)/32] & BITn(f))
|
||||
#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f))
|
||||
#define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
|
||||
#define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))
|
||||
|
||||
typedef enum {
|
||||
TIFF_SETGET_UNDEFINED = 0,
|
||||
TIFF_SETGET_ASCII = 1,
|
||||
TIFF_SETGET_UINT8 = 2,
|
||||
TIFF_SETGET_SINT8 = 3,
|
||||
TIFF_SETGET_UINT16 = 4,
|
||||
TIFF_SETGET_SINT16 = 5,
|
||||
TIFF_SETGET_UINT32 = 6,
|
||||
TIFF_SETGET_SINT32 = 7,
|
||||
TIFF_SETGET_UINT64 = 8,
|
||||
TIFF_SETGET_SINT64 = 9,
|
||||
TIFF_SETGET_FLOAT = 10,
|
||||
TIFF_SETGET_DOUBLE = 11,
|
||||
TIFF_SETGET_IFD8 = 12,
|
||||
TIFF_SETGET_INT = 13,
|
||||
TIFF_SETGET_UINT16_PAIR = 14,
|
||||
TIFF_SETGET_C0_ASCII = 15,
|
||||
TIFF_SETGET_C0_UINT8 = 16,
|
||||
TIFF_SETGET_C0_SINT8 = 17,
|
||||
TIFF_SETGET_C0_UINT16 = 18,
|
||||
TIFF_SETGET_C0_SINT16 = 19,
|
||||
TIFF_SETGET_C0_UINT32 = 20,
|
||||
TIFF_SETGET_C0_SINT32 = 21,
|
||||
TIFF_SETGET_C0_UINT64 = 22,
|
||||
TIFF_SETGET_C0_SINT64 = 23,
|
||||
TIFF_SETGET_C0_FLOAT = 24,
|
||||
TIFF_SETGET_C0_DOUBLE = 25,
|
||||
TIFF_SETGET_C0_IFD8 = 26,
|
||||
TIFF_SETGET_C16_ASCII = 27,
|
||||
TIFF_SETGET_C16_UINT8 = 28,
|
||||
TIFF_SETGET_C16_SINT8 = 29,
|
||||
TIFF_SETGET_C16_UINT16 = 30,
|
||||
TIFF_SETGET_C16_SINT16 = 31,
|
||||
TIFF_SETGET_C16_UINT32 = 32,
|
||||
TIFF_SETGET_C16_SINT32 = 33,
|
||||
TIFF_SETGET_C16_UINT64 = 34,
|
||||
TIFF_SETGET_C16_SINT64 = 35,
|
||||
TIFF_SETGET_C16_FLOAT = 36,
|
||||
TIFF_SETGET_C16_DOUBLE = 37,
|
||||
TIFF_SETGET_C16_IFD8 = 38,
|
||||
TIFF_SETGET_C32_ASCII = 39,
|
||||
TIFF_SETGET_C32_UINT8 = 40,
|
||||
TIFF_SETGET_C32_SINT8 = 41,
|
||||
TIFF_SETGET_C32_UINT16 = 42,
|
||||
TIFF_SETGET_C32_SINT16 = 43,
|
||||
TIFF_SETGET_C32_UINT32 = 44,
|
||||
TIFF_SETGET_C32_SINT32 = 45,
|
||||
TIFF_SETGET_C32_UINT64 = 46,
|
||||
TIFF_SETGET_C32_SINT64 = 47,
|
||||
TIFF_SETGET_C32_FLOAT = 48,
|
||||
TIFF_SETGET_C32_DOUBLE = 49,
|
||||
TIFF_SETGET_C32_IFD8 = 50,
|
||||
TIFF_SETGET_OTHER = 51
|
||||
typedef enum
|
||||
{
|
||||
TIFF_SETGET_UNDEFINED = 0,
|
||||
TIFF_SETGET_ASCII = 1,
|
||||
TIFF_SETGET_UINT8 = 2,
|
||||
TIFF_SETGET_SINT8 = 3,
|
||||
TIFF_SETGET_UINT16 = 4,
|
||||
TIFF_SETGET_SINT16 = 5,
|
||||
TIFF_SETGET_UINT32 = 6,
|
||||
TIFF_SETGET_SINT32 = 7,
|
||||
TIFF_SETGET_UINT64 = 8,
|
||||
TIFF_SETGET_SINT64 = 9,
|
||||
TIFF_SETGET_FLOAT = 10,
|
||||
TIFF_SETGET_DOUBLE = 11,
|
||||
TIFF_SETGET_IFD8 = 12,
|
||||
TIFF_SETGET_INT = 13,
|
||||
TIFF_SETGET_UINT16_PAIR = 14,
|
||||
TIFF_SETGET_C0_ASCII = 15,
|
||||
TIFF_SETGET_C0_UINT8 = 16,
|
||||
TIFF_SETGET_C0_SINT8 = 17,
|
||||
TIFF_SETGET_C0_UINT16 = 18,
|
||||
TIFF_SETGET_C0_SINT16 = 19,
|
||||
TIFF_SETGET_C0_UINT32 = 20,
|
||||
TIFF_SETGET_C0_SINT32 = 21,
|
||||
TIFF_SETGET_C0_UINT64 = 22,
|
||||
TIFF_SETGET_C0_SINT64 = 23,
|
||||
TIFF_SETGET_C0_FLOAT = 24,
|
||||
TIFF_SETGET_C0_DOUBLE = 25,
|
||||
TIFF_SETGET_C0_IFD8 = 26,
|
||||
TIFF_SETGET_C16_ASCII = 27,
|
||||
TIFF_SETGET_C16_UINT8 = 28,
|
||||
TIFF_SETGET_C16_SINT8 = 29,
|
||||
TIFF_SETGET_C16_UINT16 = 30,
|
||||
TIFF_SETGET_C16_SINT16 = 31,
|
||||
TIFF_SETGET_C16_UINT32 = 32,
|
||||
TIFF_SETGET_C16_SINT32 = 33,
|
||||
TIFF_SETGET_C16_UINT64 = 34,
|
||||
TIFF_SETGET_C16_SINT64 = 35,
|
||||
TIFF_SETGET_C16_FLOAT = 36,
|
||||
TIFF_SETGET_C16_DOUBLE = 37,
|
||||
TIFF_SETGET_C16_IFD8 = 38,
|
||||
TIFF_SETGET_C32_ASCII = 39,
|
||||
TIFF_SETGET_C32_UINT8 = 40,
|
||||
TIFF_SETGET_C32_SINT8 = 41,
|
||||
TIFF_SETGET_C32_UINT16 = 42,
|
||||
TIFF_SETGET_C32_SINT16 = 43,
|
||||
TIFF_SETGET_C32_UINT32 = 44,
|
||||
TIFF_SETGET_C32_SINT32 = 45,
|
||||
TIFF_SETGET_C32_UINT64 = 46,
|
||||
TIFF_SETGET_C32_SINT64 = 47,
|
||||
TIFF_SETGET_C32_FLOAT = 48,
|
||||
TIFF_SETGET_C32_DOUBLE = 49,
|
||||
TIFF_SETGET_C32_IFD8 = 50,
|
||||
TIFF_SETGET_OTHER = 51
|
||||
} TIFFSetGetFieldType;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
extern const TIFFFieldArray* _TIFFGetFields(void);
|
||||
extern const TIFFFieldArray* _TIFFGetExifFields(void);
|
||||
extern const TIFFFieldArray* _TIFFGetGpsFields(void);
|
||||
extern void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* infoarray);
|
||||
extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
|
||||
extern const TIFFFieldArray *_TIFFGetFields(void);
|
||||
extern const TIFFFieldArray *_TIFFGetExifFields(void);
|
||||
extern const TIFFFieldArray *_TIFFGetGpsFields(void);
|
||||
extern void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *infoarray);
|
||||
extern void _TIFFPrintFieldInfo(TIFF *, FILE *);
|
||||
|
||||
extern int _TIFFFillStriles(TIFF*);
|
||||
extern int _TIFFFillStriles(TIFF *);
|
||||
|
||||
typedef enum {
|
||||
tfiatImage,
|
||||
tfiatExif,
|
||||
tfiatGps, /* EXIF-GPS fields array type */
|
||||
tfiatOther
|
||||
} TIFFFieldArrayType;
|
||||
typedef enum
|
||||
{
|
||||
tfiatImage,
|
||||
tfiatExif,
|
||||
tfiatGps, /* EXIF-GPS fields array type */
|
||||
tfiatOther
|
||||
} TIFFFieldArrayType;
|
||||
|
||||
struct _TIFFFieldArray {
|
||||
TIFFFieldArrayType type; /* array type, will be used to determine if IFD is image and such */
|
||||
uint32_t allocated_size; /* 0 if array is constant, other if modified by future definition extension support */
|
||||
uint32_t count; /* number of elements in fields array */
|
||||
TIFFField* fields; /* actual field info */
|
||||
};
|
||||
struct _TIFFFieldArray
|
||||
{
|
||||
TIFFFieldArrayType type; /* array type, will be used to determine if IFD
|
||||
is image and such */
|
||||
uint32_t allocated_size; /* 0 if array is constant, other if modified by
|
||||
future definition extension support */
|
||||
uint32_t count; /* number of elements in fields array */
|
||||
TIFFField *fields; /* actual field info */
|
||||
};
|
||||
|
||||
struct _TIFFField {
|
||||
uint32_t field_tag; /* field's tag */
|
||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||
TIFFDataType field_type; /* type of associated data */
|
||||
uint32_t field_anonymous; /* if true, this is a unknown / anonymous tag */
|
||||
TIFFSetGetFieldType set_field_type; /* type to be passed to TIFFSetField */
|
||||
TIFFSetGetFieldType get_field_type; /* type to be passed to TIFFGetField */
|
||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
||||
unsigned char field_oktochange; /* if true, can change while writing */
|
||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
||||
char* field_name; /* ASCII name */
|
||||
TIFFFieldArray* field_subfields; /* if field points to child ifds, child ifd field definition array */
|
||||
};
|
||||
struct _TIFFField
|
||||
{
|
||||
uint32_t field_tag; /* field's tag */
|
||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||
TIFFDataType field_type; /* type of associated data */
|
||||
uint32_t
|
||||
field_anonymous; /* if true, this is a unknown / anonymous tag */
|
||||
TIFFSetGetFieldType
|
||||
set_field_type; /* type to be passed to TIFFSetField */
|
||||
TIFFSetGetFieldType
|
||||
get_field_type; /* type to be passed to TIFFGetField */
|
||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
||||
unsigned char field_oktochange; /* if true, can change while writing */
|
||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
||||
char *field_name; /* ASCII name */
|
||||
TIFFFieldArray *field_subfields; /* if field points to child ifds, child
|
||||
ifd field definition array */
|
||||
};
|
||||
|
||||
extern int _TIFFMergeFields(TIFF*, const TIFFField[], uint32_t);
|
||||
extern const TIFFField* _TIFFFindOrRegisterField(TIFF *, uint32_t, TIFFDataType);
|
||||
extern TIFFField* _TIFFCreateAnonField(TIFF *, uint32_t, TIFFDataType);
|
||||
extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
|
||||
extern int _TIFFCheckDirNumberAndOffset(TIFF *tif, uint16_t dirn, uint64_t diroff);
|
||||
extern int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff, uint16_t *dirn);
|
||||
extern int _TIFFMergeFields(TIFF *, const TIFFField[], uint32_t);
|
||||
extern const TIFFField *_TIFFFindOrRegisterField(TIFF *, uint32_t,
|
||||
TIFFDataType);
|
||||
extern TIFFField *_TIFFCreateAnonField(TIFF *, uint32_t, TIFFDataType);
|
||||
extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
|
||||
extern int _TIFFCheckDirNumberAndOffset(TIFF *tif, uint16_t dirn,
|
||||
uint64_t diroff);
|
||||
extern int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff,
|
||||
uint16_t *dirn);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
13040
libtiff/tif_dirread.c
13040
libtiff/tif_dirread.c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -29,98 +29,94 @@
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
|
||||
static int
|
||||
DumpFixupTags(TIFF* tif)
|
||||
static int DumpFixupTags(TIFF *tif)
|
||||
{
|
||||
(void) tif;
|
||||
return (1);
|
||||
(void)tif;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a hunk of pixels.
|
||||
*/
|
||||
static int
|
||||
DumpModeEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s)
|
||||
static int DumpModeEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
(void) s;
|
||||
while (cc > 0) {
|
||||
tmsize_t n;
|
||||
(void)s;
|
||||
while (cc > 0)
|
||||
{
|
||||
tmsize_t n;
|
||||
|
||||
n = cc;
|
||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
||||
n = cc;
|
||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
||||
|
||||
assert( n > 0 );
|
||||
assert(n > 0);
|
||||
|
||||
/*
|
||||
* Avoid copy if client has setup raw
|
||||
* data buffer to avoid extra copy.
|
||||
*/
|
||||
if (tif->tif_rawcp != pp)
|
||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
||||
tif->tif_rawcp += n;
|
||||
tif->tif_rawcc += n;
|
||||
pp += n;
|
||||
cc -= n;
|
||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
||||
!TIFFFlushData1(tif))
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
/*
|
||||
* Avoid copy if client has setup raw
|
||||
* data buffer to avoid extra copy.
|
||||
*/
|
||||
if (tif->tif_rawcp != pp)
|
||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
||||
tif->tif_rawcp += n;
|
||||
tif->tif_rawcc += n;
|
||||
pp += n;
|
||||
cc -= n;
|
||||
if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode a hunk of pixels.
|
||||
*/
|
||||
static int
|
||||
DumpModeDecode(TIFF* tif, uint8_t* buf, tmsize_t cc, uint16_t s)
|
||||
static int DumpModeDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
static const char module[] = "DumpModeDecode";
|
||||
(void) s;
|
||||
if (tif->tif_rawcc < cc) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data for scanline %"PRIu32", expected a request for at most %"TIFF_SSIZE_FORMAT" bytes, got a request for %"TIFF_SSIZE_FORMAT" bytes",
|
||||
tif->tif_row,
|
||||
tif->tif_rawcc,
|
||||
cc);
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* Avoid copy if client has setup raw
|
||||
* data buffer to avoid extra copy.
|
||||
*/
|
||||
if (tif->tif_rawcp != buf)
|
||||
_TIFFmemcpy(buf, tif->tif_rawcp, cc);
|
||||
tif->tif_rawcp += cc;
|
||||
tif->tif_rawcc -= cc;
|
||||
return (1);
|
||||
static const char module[] = "DumpModeDecode";
|
||||
(void)s;
|
||||
if (tif->tif_rawcc < cc)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data for scanline %" PRIu32
|
||||
", expected a request for at most %" TIFF_SSIZE_FORMAT
|
||||
" bytes, got a request for %" TIFF_SSIZE_FORMAT " bytes",
|
||||
tif->tif_row, tif->tif_rawcc, cc);
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* Avoid copy if client has setup raw
|
||||
* data buffer to avoid extra copy.
|
||||
*/
|
||||
if (tif->tif_rawcp != buf)
|
||||
_TIFFmemcpy(buf, tif->tif_rawcp, cc);
|
||||
tif->tif_rawcp += cc;
|
||||
tif->tif_rawcc -= cc;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Seek forwards nrows in the current strip.
|
||||
*/
|
||||
static int
|
||||
DumpModeSeek(TIFF* tif, uint32_t nrows)
|
||||
static int DumpModeSeek(TIFF *tif, uint32_t nrows)
|
||||
{
|
||||
tif->tif_rawcp += nrows * tif->tif_scanlinesize;
|
||||
tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
|
||||
return (1);
|
||||
tif->tif_rawcp += nrows * tif->tif_scanlinesize;
|
||||
tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize dump mode.
|
||||
*/
|
||||
int
|
||||
TIFFInitDumpMode(TIFF* tif, int scheme)
|
||||
int TIFFInitDumpMode(TIFF *tif, int scheme)
|
||||
{
|
||||
(void) scheme;
|
||||
tif->tif_fixuptags = DumpFixupTags;
|
||||
tif->tif_decoderow = DumpModeDecode;
|
||||
tif->tif_decodestrip = DumpModeDecode;
|
||||
tif->tif_decodetile = DumpModeDecode;
|
||||
tif->tif_encoderow = DumpModeEncode;
|
||||
tif->tif_encodestrip = DumpModeEncode;
|
||||
tif->tif_encodetile = DumpModeEncode;
|
||||
tif->tif_seek = DumpModeSeek;
|
||||
return (1);
|
||||
(void)scheme;
|
||||
tif->tif_fixuptags = DumpFixupTags;
|
||||
tif->tif_decoderow = DumpModeDecode;
|
||||
tif->tif_decodestrip = DumpModeDecode;
|
||||
tif->tif_decodetile = DumpModeDecode;
|
||||
tif->tif_encoderow = DumpModeEncode;
|
||||
tif->tif_encodestrip = DumpModeEncode;
|
||||
tif->tif_encodetile = DumpModeEncode;
|
||||
tif->tif_seek = DumpModeSeek;
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -29,93 +29,104 @@
|
||||
|
||||
TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;
|
||||
|
||||
TIFFErrorHandler
|
||||
TIFFSetErrorHandler(TIFFErrorHandler handler)
|
||||
TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler)
|
||||
{
|
||||
TIFFErrorHandler prev = _TIFFerrorHandler;
|
||||
_TIFFerrorHandler = handler;
|
||||
return (prev);
|
||||
TIFFErrorHandler prev = _TIFFerrorHandler;
|
||||
_TIFFerrorHandler = handler;
|
||||
return (prev);
|
||||
}
|
||||
|
||||
TIFFErrorHandlerExt
|
||||
TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
|
||||
TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
|
||||
{
|
||||
TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
|
||||
_TIFFerrorHandlerExt = handler;
|
||||
return (prev);
|
||||
TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
|
||||
_TIFFerrorHandlerExt = handler;
|
||||
return (prev);
|
||||
}
|
||||
|
||||
void
|
||||
TIFFError(const char* module, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (_TIFFerrorHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (_TIFFerrorHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void _TIFFErrorEarly(TIFFOpenOptions* opts, thandle_t clientdata, const char* module, const char* fmt, ...)
|
||||
void TIFFError(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (opts && opts->errorhandler) {
|
||||
va_start(ap, fmt);
|
||||
int stop = opts->errorhandler(NULL, opts->errorhandler_user_data, module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop) return;
|
||||
}
|
||||
if (_TIFFerrorHandler) {
|
||||
if (_TIFFerrorHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt) {
|
||||
if (_TIFFerrorHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (_TIFFerrorHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||
const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (opts && opts->errorhandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
int stop = opts->errorhandler(NULL, opts->errorhandler_user_data,
|
||||
module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop)
|
||||
return;
|
||||
}
|
||||
if (_TIFFerrorHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(clientdata, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TIFFErrorExtR(TIFF* tif, const char* module, const char* fmt, ...)
|
||||
void TIFFErrorExtR(TIFF *tif, const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (tif && tif->tif_errorhandler) {
|
||||
va_start(ap, fmt);
|
||||
int stop = (*tif->tif_errorhandler)(tif, tif->tif_errorhandler_user_data, module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop) return;
|
||||
}
|
||||
if (_TIFFerrorHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(tif ? tif->tif_clientdata : NULL, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
va_list ap;
|
||||
if (tif && tif->tif_errorhandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
int stop = (*tif->tif_errorhandler)(
|
||||
tif, tif->tif_errorhandler_user_data, module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop)
|
||||
return;
|
||||
}
|
||||
if (_TIFFerrorHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFerrorHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFerrorHandlerExt)(tif ? tif->tif_clientdata : NULL, module, fmt,
|
||||
ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -26,25 +26,25 @@
|
||||
* TIFF Library.
|
||||
*
|
||||
* Various routines support external extension of the tag set, and other
|
||||
* application extension capabilities.
|
||||
* application extension capabilities.
|
||||
*/
|
||||
|
||||
#include "tiffiop.h"
|
||||
|
||||
int TIFFGetTagListCount( TIFF *tif )
|
||||
int TIFFGetTagListCount(TIFF *tif)
|
||||
|
||||
{
|
||||
TIFFDirectory* td = &tif->tif_dir;
|
||||
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
|
||||
return td->td_customValueCount;
|
||||
}
|
||||
|
||||
uint32_t TIFFGetTagListEntry(TIFF *tif, int tag_index )
|
||||
uint32_t TIFFGetTagListEntry(TIFF *tif, int tag_index)
|
||||
|
||||
{
|
||||
TIFFDirectory* td = &tif->tif_dir;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
|
||||
if( tag_index < 0 || tag_index >= td->td_customValueCount )
|
||||
if (tag_index < 0 || tag_index >= td->td_customValueCount)
|
||||
return (uint32_t)(-1);
|
||||
else
|
||||
return td->td_customValues[tag_index].info->field_tag;
|
||||
@@ -55,27 +55,27 @@ uint32_t TIFFGetTagListEntry(TIFF *tif, int tag_index )
|
||||
** structure to application code without giving access to the private
|
||||
** TIFF structure.
|
||||
*/
|
||||
TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif )
|
||||
TIFFTagMethods *TIFFAccessTagMethods(TIFF *tif)
|
||||
|
||||
{
|
||||
return &(tif->tif_tagmethods);
|
||||
}
|
||||
|
||||
void *TIFFGetClientInfo( TIFF *tif, const char *name )
|
||||
void *TIFFGetClientInfo(TIFF *tif, const char *name)
|
||||
|
||||
{
|
||||
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
||||
|
||||
while( psLink != NULL && strcmp(psLink->name,name) != 0 )
|
||||
while (psLink != NULL && strcmp(psLink->name, name) != 0)
|
||||
psLink = psLink->next;
|
||||
|
||||
if( psLink != NULL )
|
||||
if (psLink != NULL)
|
||||
return psLink->data;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
|
||||
void TIFFSetClientInfo(TIFF *tif, void *data, const char *name)
|
||||
|
||||
{
|
||||
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
||||
@@ -84,10 +84,10 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
|
||||
** Do we have an existing link with this name? If so, just
|
||||
** set it.
|
||||
*/
|
||||
while( psLink != NULL && strcmp(psLink->name,name) != 0 )
|
||||
while (psLink != NULL && strcmp(psLink->name, name) != 0)
|
||||
psLink = psLink->next;
|
||||
|
||||
if( psLink != NULL )
|
||||
if (psLink != NULL)
|
||||
{
|
||||
psLink->data = data;
|
||||
return;
|
||||
@@ -97,11 +97,12 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
|
||||
** Create a new link.
|
||||
*/
|
||||
|
||||
psLink = (TIFFClientInfoLink *) _TIFFmallocExt(tif, sizeof(TIFFClientInfoLink));
|
||||
assert (psLink != NULL);
|
||||
psLink =
|
||||
(TIFFClientInfoLink *)_TIFFmallocExt(tif, sizeof(TIFFClientInfoLink));
|
||||
assert(psLink != NULL);
|
||||
psLink->next = tif->tif_clientinfo;
|
||||
psLink->name = (char *) _TIFFmallocExt(tif, (tmsize_t)(strlen(name)+1));
|
||||
assert (psLink->name != NULL);
|
||||
psLink->name = (char *)_TIFFmallocExt(tif, (tmsize_t)(strlen(name) + 1));
|
||||
assert(psLink->name != NULL);
|
||||
strcpy(psLink->name, name);
|
||||
psLink->data = data;
|
||||
|
||||
|
||||
2662
libtiff/tif_fax3.c
2662
libtiff/tif_fax3.c
File diff suppressed because it is too large
Load Diff
@@ -2,28 +2,28 @@
|
||||
* Copyright (c) 1990-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _FAX3_
|
||||
#define _FAX3_
|
||||
#define _FAX3_
|
||||
/*
|
||||
* TIFF Library.
|
||||
*
|
||||
@@ -50,41 +50,47 @@
|
||||
* data in the run array as needed (e.g. to append zero runs to bring
|
||||
* the count up to a nice multiple).
|
||||
*/
|
||||
typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32_t*, uint32_t*, uint32_t);
|
||||
typedef void (*TIFFFaxFillFunc)(unsigned char *, uint32_t *, uint32_t *,
|
||||
uint32_t);
|
||||
|
||||
/*
|
||||
* The default run filler; made external for other decoders.
|
||||
*/
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
extern void _TIFFFax3fillruns(unsigned char*, uint32_t*, uint32_t*, uint32_t);
|
||||
extern void _TIFFFax3fillruns(unsigned char *, uint32_t *, uint32_t *,
|
||||
uint32_t);
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* finite state machine codes */
|
||||
#define S_Null 0
|
||||
#define S_Pass 1
|
||||
#define S_Horiz 2
|
||||
#define S_V0 3
|
||||
#define S_VR 4
|
||||
#define S_VL 5
|
||||
#define S_Ext 6
|
||||
#define S_TermW 7
|
||||
#define S_TermB 8
|
||||
#define S_MakeUpW 9
|
||||
#define S_MakeUpB 10
|
||||
#define S_MakeUp 11
|
||||
#define S_EOL 12
|
||||
#define S_Null 0
|
||||
#define S_Pass 1
|
||||
#define S_Horiz 2
|
||||
#define S_V0 3
|
||||
#define S_VR 4
|
||||
#define S_VL 5
|
||||
#define S_Ext 6
|
||||
#define S_TermW 7
|
||||
#define S_TermB 8
|
||||
#define S_MakeUpW 9
|
||||
#define S_MakeUpB 10
|
||||
#define S_MakeUp 11
|
||||
#define S_EOL 12
|
||||
|
||||
/* WARNING: do not change the layout of this structure as the HylaFAX software */
|
||||
/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636 */
|
||||
typedef struct { /* state table entry */
|
||||
unsigned char State; /* see above */
|
||||
unsigned char Width; /* width of code in bits */
|
||||
uint32_t Param; /* unsigned 32-bit run length in bits (holds on 16 bit actually, but cannot be changed. See above warning) */
|
||||
/* WARNING: do not change the layout of this structure as the HylaFAX software
|
||||
*/
|
||||
/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636
|
||||
*/
|
||||
typedef struct
|
||||
{ /* state table entry */
|
||||
unsigned char State; /* see above */
|
||||
unsigned char Width; /* width of code in bits */
|
||||
uint32_t Param; /* unsigned 32-bit run length in bits (holds on 16 bit
|
||||
actually, but cannot be changed. See above warning) */
|
||||
} TIFFFaxTabEnt;
|
||||
|
||||
extern const TIFFFaxTabEnt TIFFFaxMainTable[];
|
||||
@@ -108,7 +114,7 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
|
||||
*/
|
||||
|
||||
#ifndef EndOfData
|
||||
#define EndOfData() (cp >= ep)
|
||||
#define EndOfData() (cp >= ep)
|
||||
#endif
|
||||
/*
|
||||
* Need <=8 or <=16 bits of input data. Unlike viewfax we
|
||||
@@ -134,121 +140,143 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
|
||||
* otherwise we should get the right answer.
|
||||
*/
|
||||
#ifndef NeedBits8
|
||||
#define NeedBits8(n,eoflab) do { \
|
||||
if (BitsAvail < (n)) { \
|
||||
if (EndOfData()) { \
|
||||
if (BitsAvail == 0) /* no valid bits */ \
|
||||
goto eoflab; \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} else { \
|
||||
BitAcc |= ((uint32_t) bitmap[*cp++])<<BitsAvail; \
|
||||
BitsAvail += 8; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#define NeedBits8(n, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
if (BitsAvail < (n)) \
|
||||
{ \
|
||||
if (EndOfData()) \
|
||||
{ \
|
||||
if (BitsAvail == 0) /* no valid bits */ \
|
||||
goto eoflab; \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||
BitsAvail += 8; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
#ifndef NeedBits16
|
||||
#define NeedBits16(n,eoflab) do { \
|
||||
if (BitsAvail < (n)) { \
|
||||
if (EndOfData()) { \
|
||||
if (BitsAvail == 0) /* no valid bits */ \
|
||||
goto eoflab; \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} else { \
|
||||
BitAcc |= ((uint32_t) bitmap[*cp++])<<BitsAvail; \
|
||||
if ((BitsAvail += 8) < (n)) { \
|
||||
if (EndOfData()) { \
|
||||
/* NB: we know BitsAvail is non-zero here */ \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} else { \
|
||||
BitAcc |= ((uint32_t) bitmap[*cp++])<<BitsAvail; \
|
||||
BitsAvail += 8; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#define NeedBits16(n, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
if (BitsAvail < (n)) \
|
||||
{ \
|
||||
if (EndOfData()) \
|
||||
{ \
|
||||
if (BitsAvail == 0) /* no valid bits */ \
|
||||
goto eoflab; \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||
if ((BitsAvail += 8) < (n)) \
|
||||
{ \
|
||||
if (EndOfData()) \
|
||||
{ \
|
||||
/* NB: we know BitsAvail is non-zero here */ \
|
||||
BitsAvail = (n); /* pad with zeros */ \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||
BitsAvail += 8; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
#define GetBits(n) (BitAcc & ((1<<(n))-1))
|
||||
#define ClrBits(n) do { \
|
||||
BitsAvail -= (n); \
|
||||
BitAcc >>= (n); \
|
||||
} while (0)
|
||||
#define GetBits(n) (BitAcc & ((1 << (n)) - 1))
|
||||
#define ClrBits(n) \
|
||||
do \
|
||||
{ \
|
||||
BitsAvail -= (n); \
|
||||
BitAcc >>= (n); \
|
||||
} while (0)
|
||||
|
||||
#ifdef FAX3_DEBUG
|
||||
static const char* StateNames[] = {
|
||||
"Null ",
|
||||
"Pass ",
|
||||
"Horiz ",
|
||||
"V0 ",
|
||||
"VR ",
|
||||
"VL ",
|
||||
"Ext ",
|
||||
"TermW ",
|
||||
"TermB ",
|
||||
"MakeUpW",
|
||||
"MakeUpB",
|
||||
"MakeUp ",
|
||||
"EOL ",
|
||||
static const char *StateNames[] = {
|
||||
"Null ", "Pass ", "Horiz ", "V0 ", "VR ", "VL ", "Ext ",
|
||||
"TermW ", "TermB ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL ",
|
||||
};
|
||||
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
|
||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
||||
int t; \
|
||||
NeedBits8(wid,eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
|
||||
StateNames[TabEnt->State], TabEnt->Param); \
|
||||
for (t = 0; t < TabEnt->Width; t++) \
|
||||
DEBUG_SHOW; \
|
||||
putchar('\n'); \
|
||||
fflush(stdout); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
||||
int t; \
|
||||
NeedBits16(wid,eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
|
||||
StateNames[TabEnt->State], TabEnt->Param); \
|
||||
for (t = 0; t < TabEnt->Width; t++) \
|
||||
DEBUG_SHOW; \
|
||||
putchar('\n'); \
|
||||
fflush(stdout); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP8(wid, tab, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
int t; \
|
||||
NeedBits8(wid, eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail, \
|
||||
StateNames[TabEnt->State], TabEnt->Param); \
|
||||
for (t = 0; t < TabEnt->Width; t++) \
|
||||
DEBUG_SHOW; \
|
||||
putchar('\n'); \
|
||||
fflush(stdout); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP16(wid, tab, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
int t; \
|
||||
NeedBits16(wid, eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail, \
|
||||
StateNames[TabEnt->State], TabEnt->Param); \
|
||||
for (t = 0; t < TabEnt->Width; t++) \
|
||||
DEBUG_SHOW; \
|
||||
putchar('\n'); \
|
||||
fflush(stdout); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
|
||||
#define SETVALUE(x) do { \
|
||||
*pa++ = RunLength + (x); \
|
||||
printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
|
||||
a0 += x; \
|
||||
RunLength = 0; \
|
||||
} while (0)
|
||||
#define SETVALUE(x) \
|
||||
do \
|
||||
{ \
|
||||
*pa++ = RunLength + (x); \
|
||||
printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
|
||||
a0 += x; \
|
||||
RunLength = 0; \
|
||||
} while (0)
|
||||
#else
|
||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
||||
NeedBits8(wid,eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
||||
NeedBits16(wid,eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP8(wid, tab, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
NeedBits8(wid, eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
#define LOOKUP16(wid, tab, eoflab) \
|
||||
do \
|
||||
{ \
|
||||
NeedBits16(wid, eoflab); \
|
||||
TabEnt = tab + GetBits(wid); \
|
||||
ClrBits(TabEnt->Width); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Append a run to the run length array for the
|
||||
* current row and reset decoding state.
|
||||
*/
|
||||
#define SETVALUE(x) do { \
|
||||
if (pa >= thisrun + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
*pa++ = RunLength + (x); \
|
||||
a0 += (x); \
|
||||
RunLength = 0; \
|
||||
} while (0)
|
||||
#define SETVALUE(x) \
|
||||
do \
|
||||
{ \
|
||||
if (pa >= thisrun + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile \
|
||||
: tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
*pa++ = RunLength + (x); \
|
||||
a0 += (x); \
|
||||
RunLength = 0; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -261,51 +289,62 @@ static const char* StateNames[] = {
|
||||
* is non-zero then we still need to scan for the final flag
|
||||
* bit that is part of the EOL code.
|
||||
*/
|
||||
#define SYNC_EOL(eoflab) do { \
|
||||
if (EOLcnt == 0) { \
|
||||
for (;;) { \
|
||||
NeedBits16(11,eoflab); \
|
||||
if (GetBits(11) == 0) \
|
||||
break; \
|
||||
ClrBits(1); \
|
||||
} \
|
||||
} \
|
||||
for (;;) { \
|
||||
NeedBits8(8,eoflab); \
|
||||
if (GetBits(8)) \
|
||||
break; \
|
||||
ClrBits(8); \
|
||||
} \
|
||||
while (GetBits(1) == 0) \
|
||||
ClrBits(1); \
|
||||
ClrBits(1); /* EOL bit */ \
|
||||
EOLcnt = 0; /* reset EOL counter/flag */ \
|
||||
} while (0)
|
||||
#define SYNC_EOL(eoflab) \
|
||||
do \
|
||||
{ \
|
||||
if (EOLcnt == 0) \
|
||||
{ \
|
||||
for (;;) \
|
||||
{ \
|
||||
NeedBits16(11, eoflab); \
|
||||
if (GetBits(11) == 0) \
|
||||
break; \
|
||||
ClrBits(1); \
|
||||
} \
|
||||
} \
|
||||
for (;;) \
|
||||
{ \
|
||||
NeedBits8(8, eoflab); \
|
||||
if (GetBits(8)) \
|
||||
break; \
|
||||
ClrBits(8); \
|
||||
} \
|
||||
while (GetBits(1) == 0) \
|
||||
ClrBits(1); \
|
||||
ClrBits(1); /* EOL bit */ \
|
||||
EOLcnt = 0; /* reset EOL counter/flag */ \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Cleanup the array of runs after decoding a row.
|
||||
* We adjust final runs to insure the user buffer is not
|
||||
* overwritten and/or undecoded area is white filled.
|
||||
*/
|
||||
#define CLEANUP_RUNS() do { \
|
||||
if (RunLength) \
|
||||
SETVALUE(0); \
|
||||
if (a0 != lastx) { \
|
||||
badlength(a0, lastx); \
|
||||
while (a0 > lastx && pa > thisrun) \
|
||||
a0 -= *--pa; \
|
||||
if (a0 < lastx) { \
|
||||
if (a0 < 0) \
|
||||
a0 = 0; \
|
||||
if ((pa-thisrun)&1) \
|
||||
SETVALUE(0); \
|
||||
SETVALUE(lastx - a0); \
|
||||
} else if (a0 > lastx) { \
|
||||
SETVALUE(lastx); \
|
||||
SETVALUE(0); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#define CLEANUP_RUNS() \
|
||||
do \
|
||||
{ \
|
||||
if (RunLength) \
|
||||
SETVALUE(0); \
|
||||
if (a0 != lastx) \
|
||||
{ \
|
||||
badlength(a0, lastx); \
|
||||
while (a0 > lastx && pa > thisrun) \
|
||||
a0 -= *--pa; \
|
||||
if (a0 < lastx) \
|
||||
{ \
|
||||
if (a0 < 0) \
|
||||
a0 = 0; \
|
||||
if ((pa - thisrun) & 1) \
|
||||
SETVALUE(0); \
|
||||
SETVALUE(lastx - a0); \
|
||||
} \
|
||||
else if (a0 > lastx) \
|
||||
{ \
|
||||
SETVALUE(lastx); \
|
||||
SETVALUE(0); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Decode a line of 1D-encoded data.
|
||||
@@ -319,241 +358,291 @@ static const char* StateNames[] = {
|
||||
* the original code depended on the input data being zero-padded to
|
||||
* insure the decoder recognized an EOL before running out of data.
|
||||
*/
|
||||
#define EXPAND1D(eoflab) do { \
|
||||
for (;;) { \
|
||||
for (;;) { \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_EOL: \
|
||||
EOLcnt = 1; \
|
||||
goto done1d; \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite1d; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
unexpected("WhiteTable", a0); \
|
||||
goto done1d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite1d: \
|
||||
if (a0 >= lastx) \
|
||||
goto done1d; \
|
||||
for (;;) { \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_EOL: \
|
||||
EOLcnt = 1; \
|
||||
goto done1d; \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack1d; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
unexpected("BlackTable", a0); \
|
||||
goto done1d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack1d: \
|
||||
if (a0 >= lastx) \
|
||||
goto done1d; \
|
||||
if( *(pa-1) == 0 && *(pa-2) == 0 ) \
|
||||
pa -= 2; \
|
||||
} \
|
||||
eof1d: \
|
||||
prematureEOF(a0); \
|
||||
CLEANUP_RUNS(); \
|
||||
goto eoflab; \
|
||||
done1d: \
|
||||
CLEANUP_RUNS(); \
|
||||
} while (0)
|
||||
#define EXPAND1D(eoflab) \
|
||||
do \
|
||||
{ \
|
||||
for (;;) \
|
||||
{ \
|
||||
for (;;) \
|
||||
{ \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_EOL: \
|
||||
EOLcnt = 1; \
|
||||
goto done1d; \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite1d; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
unexpected("WhiteTable", a0); \
|
||||
goto done1d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite1d: \
|
||||
if (a0 >= lastx) \
|
||||
goto done1d; \
|
||||
for (;;) \
|
||||
{ \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_EOL: \
|
||||
EOLcnt = 1; \
|
||||
goto done1d; \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack1d; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
unexpected("BlackTable", a0); \
|
||||
goto done1d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack1d: \
|
||||
if (a0 >= lastx) \
|
||||
goto done1d; \
|
||||
if (*(pa - 1) == 0 && *(pa - 2) == 0) \
|
||||
pa -= 2; \
|
||||
} \
|
||||
eof1d: \
|
||||
prematureEOF(a0); \
|
||||
CLEANUP_RUNS(); \
|
||||
goto eoflab; \
|
||||
done1d: \
|
||||
CLEANUP_RUNS(); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Update the value of b1 using the array
|
||||
* of runs for the reference line.
|
||||
*/
|
||||
#define CHECK_b1 do { \
|
||||
if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \
|
||||
if( pb + 1 >= sp->refruns + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += pb[0] + pb[1]; \
|
||||
pb += 2; \
|
||||
} \
|
||||
} while (0)
|
||||
#define CHECK_b1 \
|
||||
do \
|
||||
{ \
|
||||
if (pa != thisrun) \
|
||||
while (b1 <= a0 && b1 < lastx) \
|
||||
{ \
|
||||
if (pb + 1 >= sp->refruns + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR( \
|
||||
tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += pb[0] + pb[1]; \
|
||||
pb += 2; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Expand a row of 2D-encoded data.
|
||||
*/
|
||||
#define EXPAND2D(eoflab) do { \
|
||||
while (a0 < lastx) { \
|
||||
if (pa >= thisrun + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
LOOKUP8(7, TIFFFaxMainTable, eof2d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_Pass: \
|
||||
CHECK_b1; \
|
||||
if( pb + 1 >= sp->refruns + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
RunLength += b1 - a0; \
|
||||
a0 = b1; \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_Horiz: \
|
||||
if ((pa-thisrun)&1) { \
|
||||
for (;;) { /* black first */ \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite2da; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badBlack2d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite2da:; \
|
||||
for (;;) { /* then white */ \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack2da; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badWhite2d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack2da:; \
|
||||
} else { \
|
||||
for (;;) { /* white first */ \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite2db; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badWhite2d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite2db:; \
|
||||
for (;;) { /* then black */ \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||
switch (TabEnt->State) { \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack2db; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badBlack2d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack2db:; \
|
||||
} \
|
||||
CHECK_b1; \
|
||||
break; \
|
||||
case S_V0: \
|
||||
CHECK_b1; \
|
||||
SETVALUE(b1 - a0); \
|
||||
if( pb >= sp->refruns + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_VR: \
|
||||
CHECK_b1; \
|
||||
SETVALUE(b1 - a0 + TabEnt->Param); \
|
||||
if( pb >= sp->refruns + sp->nruns) { \
|
||||
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_VL: \
|
||||
CHECK_b1; \
|
||||
if (b1 < (int) (a0 + TabEnt->Param)) { \
|
||||
unexpected("VL", a0); \
|
||||
goto eol2d; \
|
||||
} \
|
||||
SETVALUE(b1 - a0 - TabEnt->Param); \
|
||||
b1 -= *--pb; \
|
||||
break; \
|
||||
case S_Ext: \
|
||||
*pa++ = lastx - a0; \
|
||||
extension(a0); \
|
||||
goto eol2d; \
|
||||
case S_EOL: \
|
||||
*pa++ = lastx - a0; \
|
||||
NeedBits8(4,eof2d); \
|
||||
if (GetBits(4)) \
|
||||
unexpected("EOL", a0); \
|
||||
ClrBits(4); \
|
||||
EOLcnt = 1; \
|
||||
goto eol2d; \
|
||||
default: \
|
||||
badMain2d: \
|
||||
unexpected("MainTable", a0); \
|
||||
goto eol2d; \
|
||||
badBlack2d: \
|
||||
unexpected("BlackTable", a0); \
|
||||
goto eol2d; \
|
||||
badWhite2d: \
|
||||
unexpected("WhiteTable", a0); \
|
||||
goto eol2d; \
|
||||
eof2d: \
|
||||
prematureEOF(a0); \
|
||||
CLEANUP_RUNS(); \
|
||||
goto eoflab; \
|
||||
} \
|
||||
} \
|
||||
if (RunLength) { \
|
||||
if (RunLength + a0 < lastx) { \
|
||||
/* expect a final V0 */ \
|
||||
NeedBits8(1,eof2d); \
|
||||
if (!GetBits(1)) \
|
||||
goto badMain2d; \
|
||||
ClrBits(1); \
|
||||
} \
|
||||
SETVALUE(0); \
|
||||
} \
|
||||
eol2d: \
|
||||
CLEANUP_RUNS(); \
|
||||
} while (0)
|
||||
#define EXPAND2D(eoflab) \
|
||||
do \
|
||||
{ \
|
||||
while (a0 < lastx) \
|
||||
{ \
|
||||
if (pa >= thisrun + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR( \
|
||||
tif, module, "Buffer overflow at line %u of %s %u", \
|
||||
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
LOOKUP8(7, TIFFFaxMainTable, eof2d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_Pass: \
|
||||
CHECK_b1; \
|
||||
if (pb + 1 >= sp->refruns + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR(tif, module, \
|
||||
"Buffer overflow at line %u of %s %u", \
|
||||
sp->line, \
|
||||
isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile \
|
||||
: tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
RunLength += b1 - a0; \
|
||||
a0 = b1; \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_Horiz: \
|
||||
if ((pa - thisrun) & 1) \
|
||||
{ \
|
||||
for (;;) \
|
||||
{ /* black first */ \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite2da; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badBlack2d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite2da:; \
|
||||
for (;;) \
|
||||
{ /* then white */ \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack2da; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badWhite2d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack2da:; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
for (;;) \
|
||||
{ /* white first */ \
|
||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_TermW: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneWhite2db; \
|
||||
case S_MakeUpW: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badWhite2d; \
|
||||
} \
|
||||
} \
|
||||
doneWhite2db:; \
|
||||
for (;;) \
|
||||
{ /* then black */ \
|
||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||
switch (TabEnt->State) \
|
||||
{ \
|
||||
case S_TermB: \
|
||||
SETVALUE(TabEnt->Param); \
|
||||
goto doneBlack2db; \
|
||||
case S_MakeUpB: \
|
||||
case S_MakeUp: \
|
||||
a0 += TabEnt->Param; \
|
||||
RunLength += TabEnt->Param; \
|
||||
break; \
|
||||
default: \
|
||||
goto badBlack2d; \
|
||||
} \
|
||||
} \
|
||||
doneBlack2db:; \
|
||||
} \
|
||||
CHECK_b1; \
|
||||
break; \
|
||||
case S_V0: \
|
||||
CHECK_b1; \
|
||||
SETVALUE(b1 - a0); \
|
||||
if (pb >= sp->refruns + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR(tif, module, \
|
||||
"Buffer overflow at line %u of %s %u", \
|
||||
sp->line, \
|
||||
isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile \
|
||||
: tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_VR: \
|
||||
CHECK_b1; \
|
||||
SETVALUE(b1 - a0 + TabEnt->Param); \
|
||||
if (pb >= sp->refruns + sp->nruns) \
|
||||
{ \
|
||||
TIFFErrorExtR(tif, module, \
|
||||
"Buffer overflow at line %u of %s %u", \
|
||||
sp->line, \
|
||||
isTiled(tif) ? "tile" : "strip", \
|
||||
isTiled(tif) ? tif->tif_curtile \
|
||||
: tif->tif_curstrip); \
|
||||
return (-1); \
|
||||
} \
|
||||
b1 += *pb++; \
|
||||
break; \
|
||||
case S_VL: \
|
||||
CHECK_b1; \
|
||||
if (b1 < (int)(a0 + TabEnt->Param)) \
|
||||
{ \
|
||||
unexpected("VL", a0); \
|
||||
goto eol2d; \
|
||||
} \
|
||||
SETVALUE(b1 - a0 - TabEnt->Param); \
|
||||
b1 -= *--pb; \
|
||||
break; \
|
||||
case S_Ext: \
|
||||
*pa++ = lastx - a0; \
|
||||
extension(a0); \
|
||||
goto eol2d; \
|
||||
case S_EOL: \
|
||||
*pa++ = lastx - a0; \
|
||||
NeedBits8(4, eof2d); \
|
||||
if (GetBits(4)) \
|
||||
unexpected("EOL", a0); \
|
||||
ClrBits(4); \
|
||||
EOLcnt = 1; \
|
||||
goto eol2d; \
|
||||
default: \
|
||||
badMain2d: \
|
||||
unexpected("MainTable", a0); \
|
||||
goto eol2d; \
|
||||
badBlack2d: \
|
||||
unexpected("BlackTable", a0); \
|
||||
goto eol2d; \
|
||||
badWhite2d: \
|
||||
unexpected("WhiteTable", a0); \
|
||||
goto eol2d; \
|
||||
eof2d: \
|
||||
prematureEOF(a0); \
|
||||
CLEANUP_RUNS(); \
|
||||
goto eoflab; \
|
||||
} \
|
||||
} \
|
||||
if (RunLength) \
|
||||
{ \
|
||||
if (RunLength + a0 < lastx) \
|
||||
{ \
|
||||
/* expect a final V0 */ \
|
||||
NeedBits8(1, eof2d); \
|
||||
if (!GetBits(1)) \
|
||||
goto badMain2d; \
|
||||
ClrBits(1); \
|
||||
} \
|
||||
SETVALUE(0); \
|
||||
} \
|
||||
eol2d: \
|
||||
CLEANUP_RUNS(); \
|
||||
} while (0)
|
||||
#endif /* _FAX3_ */
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -27,30 +27,28 @@
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
|
||||
int
|
||||
TIFFFlush(TIFF* tif)
|
||||
int TIFFFlush(TIFF *tif)
|
||||
{
|
||||
if( tif->tif_mode == O_RDONLY )
|
||||
if (tif->tif_mode == O_RDONLY)
|
||||
return 1;
|
||||
|
||||
if (!TIFFFlushData(tif))
|
||||
return (0);
|
||||
|
||||
/* In update (r+) mode we try to detect the case where
|
||||
only the strip/tile map has been altered, and we try to
|
||||
rewrite only that portion of the directory without
|
||||
|
||||
/* In update (r+) mode we try to detect the case where
|
||||
only the strip/tile map has been altered, and we try to
|
||||
rewrite only that portion of the directory without
|
||||
making any other changes */
|
||||
|
||||
if( (tif->tif_flags & TIFF_DIRTYSTRIP)
|
||||
&& !(tif->tif_flags & TIFF_DIRTYDIRECT)
|
||||
&& tif->tif_mode == O_RDWR )
|
||||
|
||||
if ((tif->tif_flags & TIFF_DIRTYSTRIP) &&
|
||||
!(tif->tif_flags & TIFF_DIRTYDIRECT) && tif->tif_mode == O_RDWR)
|
||||
{
|
||||
if( TIFFForceStrileArrayWriting(tif) )
|
||||
if (TIFFForceStrileArrayWriting(tif))
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP))
|
||||
&& !TIFFRewriteDirectory(tif))
|
||||
if ((tif->tif_flags & (TIFF_DIRTYDIRECT | TIFF_DIRTYSTRIP)) &&
|
||||
!TIFFRewriteDirectory(tif))
|
||||
return (0);
|
||||
|
||||
return (1);
|
||||
@@ -75,45 +73,43 @@ TIFFFlush(TIFF* tif)
|
||||
*
|
||||
* Returns 1 in case of success, 0 otherwise.
|
||||
*/
|
||||
int TIFFForceStrileArrayWriting(TIFF* tif)
|
||||
int TIFFForceStrileArrayWriting(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFForceStrileArrayWriting";
|
||||
const int isTiled = TIFFIsTiled(tif);
|
||||
|
||||
if (tif->tif_mode == O_RDONLY)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"File opened in read-only mode");
|
||||
TIFFErrorExtR(tif, tif->tif_name, "File opened in read-only mode");
|
||||
return 0;
|
||||
}
|
||||
if( tif->tif_diroff == 0 )
|
||||
if (tif->tif_diroff == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Directory has not yet been written");
|
||||
TIFFErrorExtR(tif, module, "Directory has not yet been written");
|
||||
return 0;
|
||||
}
|
||||
if( (tif->tif_flags & TIFF_DIRTYDIRECT) != 0 )
|
||||
if ((tif->tif_flags & TIFF_DIRTYDIRECT) != 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Directory has changes other than the strile arrays. "
|
||||
"TIFFRewriteDirectory() should be called instead");
|
||||
"Directory has changes other than the strile arrays. "
|
||||
"TIFFRewriteDirectory() should be called instead");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( !(tif->tif_flags & TIFF_DIRTYSTRIP) )
|
||||
if (!(tif->tif_flags & TIFF_DIRTYSTRIP))
|
||||
{
|
||||
if( !(tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0) )
|
||||
if (!(tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
|
||||
tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
|
||||
tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0))
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Function not called together with "
|
||||
"TIFFDeferStrileArrayWriting()");
|
||||
"Function not called together with "
|
||||
"TIFFDeferStrileArrayWriting()");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -121,18 +117,14 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( _TIFFRewriteField( tif,
|
||||
isTiled ? TIFFTAG_TILEOFFSETS :
|
||||
TIFFTAG_STRIPOFFSETS,
|
||||
TIFF_LONG8,
|
||||
tif->tif_dir.td_nstrips,
|
||||
tif->tif_dir.td_stripoffset_p )
|
||||
&& _TIFFRewriteField( tif,
|
||||
isTiled ? TIFFTAG_TILEBYTECOUNTS :
|
||||
TIFFTAG_STRIPBYTECOUNTS,
|
||||
TIFF_LONG8,
|
||||
tif->tif_dir.td_nstrips,
|
||||
tif->tif_dir.td_stripbytecount_p ) )
|
||||
if (_TIFFRewriteField(tif,
|
||||
isTiled ? TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS,
|
||||
TIFF_LONG8, tif->tif_dir.td_nstrips,
|
||||
tif->tif_dir.td_stripoffset_p) &&
|
||||
_TIFFRewriteField(
|
||||
tif, isTiled ? TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS,
|
||||
TIFF_LONG8, tif->tif_dir.td_nstrips,
|
||||
tif->tif_dir.td_stripbytecount_p))
|
||||
{
|
||||
tif->tif_flags &= ~TIFF_DIRTYSTRIP;
|
||||
tif->tif_flags &= ~TIFF_BEENWRITING;
|
||||
@@ -149,17 +141,17 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
||||
* is not set, so that TIFFFlush() will proceed to write out the directory.
|
||||
* The documentation says returning 1 is an error indicator, but not having
|
||||
* been writing isn't exactly a an error. Hopefully this doesn't cause
|
||||
* problems for other people.
|
||||
* problems for other people.
|
||||
*/
|
||||
int
|
||||
TIFFFlushData(TIFF* tif)
|
||||
int TIFFFlushData(TIFF *tif)
|
||||
{
|
||||
if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
|
||||
return (1);
|
||||
if (tif->tif_flags & TIFF_POSTENCODE) {
|
||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
||||
if (!(*tif->tif_postencode)(tif))
|
||||
return (0);
|
||||
}
|
||||
return (TIFFFlushData1(tif));
|
||||
if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
|
||||
return (1);
|
||||
if (tif->tif_flags & TIFF_POSTENCODE)
|
||||
{
|
||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
||||
if (!(*tif->tif_postencode)(tif))
|
||||
return (0);
|
||||
}
|
||||
return (TIFFFlushData1(tif));
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -35,199 +35,197 @@
|
||||
#ifdef JBIG_SUPPORT
|
||||
#include "jbig.h"
|
||||
|
||||
static int JBIGSetupDecode(TIFF* tif)
|
||||
static int JBIGSetupDecode(TIFF *tif)
|
||||
{
|
||||
if (TIFFNumberOfStrips(tif) != 1)
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG", "Multistrip images not supported in decoder");
|
||||
return 0;
|
||||
}
|
||||
if (TIFFNumberOfStrips(tif) != 1)
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG",
|
||||
"Multistrip images not supported in decoder");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int JBIGDecode(TIFF* tif, uint8_t* buffer, tmsize_t size, uint16_t s)
|
||||
static int JBIGDecode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
|
||||
{
|
||||
struct jbg_dec_state decoder;
|
||||
int decodeStatus = 0;
|
||||
unsigned char* pImage = NULL;
|
||||
unsigned long decodedSize;
|
||||
(void) s;
|
||||
struct jbg_dec_state decoder;
|
||||
int decodeStatus = 0;
|
||||
unsigned char *pImage = NULL;
|
||||
unsigned long decodedSize;
|
||||
(void)s;
|
||||
|
||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
||||
{
|
||||
TIFFReverseBits(tif->tif_rawcp, tif->tif_rawcc);
|
||||
}
|
||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
||||
{
|
||||
TIFFReverseBits(tif->tif_rawcp, tif->tif_rawcc);
|
||||
}
|
||||
|
||||
jbg_dec_init(&decoder);
|
||||
jbg_dec_init(&decoder);
|
||||
|
||||
#if defined(HAVE_JBG_NEWLEN)
|
||||
jbg_newlen(tif->tif_rawcp, (size_t)tif->tif_rawcc);
|
||||
/*
|
||||
* I do not check the return status of jbg_newlen because even if this
|
||||
* function fails it does not necessarily mean that decoding the image
|
||||
* will fail. It is generally only needed for received fax images
|
||||
* that do not contain the actual length of the image in the BIE
|
||||
* header. I do not log when an error occurs because that will cause
|
||||
* problems when converting JBIG encoded TIFF's to
|
||||
* PostScript. As long as the actual image length is contained in the
|
||||
* BIE header jbg_dec_in should succeed.
|
||||
*/
|
||||
jbg_newlen(tif->tif_rawcp, (size_t)tif->tif_rawcc);
|
||||
/*
|
||||
* I do not check the return status of jbg_newlen because even if this
|
||||
* function fails it does not necessarily mean that decoding the image
|
||||
* will fail. It is generally only needed for received fax images
|
||||
* that do not contain the actual length of the image in the BIE
|
||||
* header. I do not log when an error occurs because that will cause
|
||||
* problems when converting JBIG encoded TIFF's to
|
||||
* PostScript. As long as the actual image length is contained in the
|
||||
* BIE header jbg_dec_in should succeed.
|
||||
*/
|
||||
#endif /* HAVE_JBG_NEWLEN */
|
||||
|
||||
decodeStatus = jbg_dec_in(&decoder, (unsigned char*)tif->tif_rawcp,
|
||||
(size_t)tif->tif_rawcc, NULL);
|
||||
if (JBG_EOK != decodeStatus)
|
||||
{
|
||||
/*
|
||||
* XXX: JBG_EN constant was defined in pre-2.0 releases of the
|
||||
* JBIG-KIT. Since the 2.0 the error reporting functions were
|
||||
* changed. We will handle both cases here.
|
||||
*/
|
||||
TIFFErrorExtR(tif,
|
||||
"JBIG", "Error (%d) decoding: %s",
|
||||
decodeStatus,
|
||||
decodeStatus = jbg_dec_in(&decoder, (unsigned char *)tif->tif_rawcp,
|
||||
(size_t)tif->tif_rawcc, NULL);
|
||||
if (JBG_EOK != decodeStatus)
|
||||
{
|
||||
/*
|
||||
* XXX: JBG_EN constant was defined in pre-2.0 releases of the
|
||||
* JBIG-KIT. Since the 2.0 the error reporting functions were
|
||||
* changed. We will handle both cases here.
|
||||
*/
|
||||
TIFFErrorExtR(tif, "JBIG", "Error (%d) decoding: %s", decodeStatus,
|
||||
#if defined(JBG_EN)
|
||||
jbg_strerror(decodeStatus, JBG_EN)
|
||||
jbg_strerror(decodeStatus, JBG_EN)
|
||||
#else
|
||||
jbg_strerror(decodeStatus)
|
||||
jbg_strerror(decodeStatus)
|
||||
#endif
|
||||
);
|
||||
jbg_dec_free(&decoder);
|
||||
return 0;
|
||||
}
|
||||
);
|
||||
jbg_dec_free(&decoder);
|
||||
return 0;
|
||||
}
|
||||
|
||||
decodedSize = jbg_dec_getsize(&decoder);
|
||||
if( (tmsize_t)decodedSize < size )
|
||||
{
|
||||
TIFFWarningExtR(tif, "JBIG",
|
||||
"Only decoded %lu bytes, whereas %"TIFF_SSIZE_FORMAT" requested",
|
||||
decodedSize, size);
|
||||
}
|
||||
else if( (tmsize_t)decodedSize > size )
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG",
|
||||
"Decoded %lu bytes, whereas %"TIFF_SSIZE_FORMAT" were requested",
|
||||
decodedSize, size);
|
||||
jbg_dec_free(&decoder);
|
||||
return 0;
|
||||
}
|
||||
pImage = jbg_dec_getimage(&decoder, 0);
|
||||
_TIFFmemcpy(buffer, pImage, decodedSize);
|
||||
jbg_dec_free(&decoder);
|
||||
decodedSize = jbg_dec_getsize(&decoder);
|
||||
if ((tmsize_t)decodedSize < size)
|
||||
{
|
||||
TIFFWarningExtR(tif, "JBIG",
|
||||
"Only decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
|
||||
" requested",
|
||||
decodedSize, size);
|
||||
}
|
||||
else if ((tmsize_t)decodedSize > size)
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG",
|
||||
"Decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
|
||||
" were requested",
|
||||
decodedSize, size);
|
||||
jbg_dec_free(&decoder);
|
||||
return 0;
|
||||
}
|
||||
pImage = jbg_dec_getimage(&decoder, 0);
|
||||
_TIFFmemcpy(buffer, pImage, decodedSize);
|
||||
jbg_dec_free(&decoder);
|
||||
|
||||
tif->tif_rawcp += tif->tif_rawcc;
|
||||
tif->tif_rawcc = 0;
|
||||
tif->tif_rawcp += tif->tif_rawcc;
|
||||
tif->tif_rawcc = 0;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int JBIGSetupEncode(TIFF* tif)
|
||||
static int JBIGSetupEncode(TIFF *tif)
|
||||
{
|
||||
if (TIFFNumberOfStrips(tif) != 1)
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG", "Multistrip images not supported in encoder");
|
||||
return 0;
|
||||
}
|
||||
if (TIFFNumberOfStrips(tif) != 1)
|
||||
{
|
||||
TIFFErrorExtR(tif, "JBIG",
|
||||
"Multistrip images not supported in encoder");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int JBIGCopyEncodedData(TIFF* tif, unsigned char* pp, size_t cc, uint16_t s)
|
||||
static int JBIGCopyEncodedData(TIFF *tif, unsigned char *pp, size_t cc,
|
||||
uint16_t s)
|
||||
{
|
||||
(void) s;
|
||||
while (cc > 0)
|
||||
{
|
||||
tmsize_t n = (tmsize_t)cc;
|
||||
(void)s;
|
||||
while (cc > 0)
|
||||
{
|
||||
tmsize_t n = (tmsize_t)cc;
|
||||
|
||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
||||
{
|
||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
||||
}
|
||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
||||
{
|
||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
||||
}
|
||||
|
||||
assert(n > 0);
|
||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
||||
tif->tif_rawcp += n;
|
||||
tif->tif_rawcc += n;
|
||||
pp += n;
|
||||
cc -= (size_t)n;
|
||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
||||
!TIFFFlushData1(tif))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
assert(n > 0);
|
||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
||||
tif->tif_rawcp += n;
|
||||
tif->tif_rawcc += n;
|
||||
pp += n;
|
||||
cc -= (size_t)n;
|
||||
if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
static void JBIGOutputBie(unsigned char* buffer, size_t len, void* userData)
|
||||
static void JBIGOutputBie(unsigned char *buffer, size_t len, void *userData)
|
||||
{
|
||||
TIFF* tif = (TIFF*)userData;
|
||||
TIFF *tif = (TIFF *)userData;
|
||||
|
||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
||||
{
|
||||
TIFFReverseBits(buffer, (tmsize_t)len);
|
||||
}
|
||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
||||
{
|
||||
TIFFReverseBits(buffer, (tmsize_t)len);
|
||||
}
|
||||
|
||||
JBIGCopyEncodedData(tif, buffer, len, 0);
|
||||
JBIGCopyEncodedData(tif, buffer, len, 0);
|
||||
}
|
||||
|
||||
static int JBIGEncode(TIFF* tif, uint8_t* buffer, tmsize_t size, uint16_t s)
|
||||
static int JBIGEncode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
|
||||
{
|
||||
TIFFDirectory* dir = &tif->tif_dir;
|
||||
struct jbg_enc_state encoder;
|
||||
TIFFDirectory *dir = &tif->tif_dir;
|
||||
struct jbg_enc_state encoder;
|
||||
|
||||
(void) size, (void) s;
|
||||
(void)size, (void)s;
|
||||
|
||||
jbg_enc_init(&encoder,
|
||||
dir->td_imagewidth,
|
||||
dir->td_imagelength,
|
||||
1,
|
||||
&buffer,
|
||||
JBIGOutputBie,
|
||||
tif);
|
||||
/*
|
||||
* jbg_enc_out does the "real" encoding. As data is encoded,
|
||||
* JBIGOutputBie is called, which writes the data to the directory.
|
||||
*/
|
||||
jbg_enc_out(&encoder);
|
||||
jbg_enc_free(&encoder);
|
||||
jbg_enc_init(&encoder, dir->td_imagewidth, dir->td_imagelength, 1, &buffer,
|
||||
JBIGOutputBie, tif);
|
||||
/*
|
||||
* jbg_enc_out does the "real" encoding. As data is encoded,
|
||||
* JBIGOutputBie is called, which writes the data to the directory.
|
||||
*/
|
||||
jbg_enc_out(&encoder);
|
||||
jbg_enc_free(&encoder);
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int TIFFInitJBIG(TIFF* tif, int scheme)
|
||||
int TIFFInitJBIG(TIFF *tif, int scheme)
|
||||
{
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_JBIG);
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_JBIG);
|
||||
|
||||
/*
|
||||
* These flags are set so the JBIG Codec can control when to reverse
|
||||
* bits and when not to and to allow the jbig decoder and bit reverser
|
||||
* to write to memory when necessary.
|
||||
*/
|
||||
tif->tif_flags |= TIFF_NOBITREV;
|
||||
tif->tif_flags &= ~TIFF_MAPPED;
|
||||
/* We may have read from a previous IFD and thus set TIFF_BUFFERMMAP and
|
||||
* cleared TIFF_MYBUFFER. It is necessary to restore them to their initial
|
||||
* value to be consistent with the state of a non-memory mapped file.
|
||||
*/
|
||||
if (tif->tif_flags&TIFF_BUFFERMMAP) {
|
||||
tif->tif_rawdata = NULL;
|
||||
tif->tif_rawdatasize = 0;
|
||||
tif->tif_flags &= ~TIFF_BUFFERMMAP;
|
||||
tif->tif_flags |= TIFF_MYBUFFER;
|
||||
}
|
||||
/*
|
||||
* These flags are set so the JBIG Codec can control when to reverse
|
||||
* bits and when not to and to allow the jbig decoder and bit reverser
|
||||
* to write to memory when necessary.
|
||||
*/
|
||||
tif->tif_flags |= TIFF_NOBITREV;
|
||||
tif->tif_flags &= ~TIFF_MAPPED;
|
||||
/* We may have read from a previous IFD and thus set TIFF_BUFFERMMAP and
|
||||
* cleared TIFF_MYBUFFER. It is necessary to restore them to their initial
|
||||
* value to be consistent with the state of a non-memory mapped file.
|
||||
*/
|
||||
if (tif->tif_flags & TIFF_BUFFERMMAP)
|
||||
{
|
||||
tif->tif_rawdata = NULL;
|
||||
tif->tif_rawdatasize = 0;
|
||||
tif->tif_flags &= ~TIFF_BUFFERMMAP;
|
||||
tif->tif_flags |= TIFF_MYBUFFER;
|
||||
}
|
||||
|
||||
/* Setup the function pointers for encode, decode, and cleanup. */
|
||||
tif->tif_setupdecode = JBIGSetupDecode;
|
||||
tif->tif_decodestrip = JBIGDecode;
|
||||
/* Setup the function pointers for encode, decode, and cleanup. */
|
||||
tif->tif_setupdecode = JBIGSetupDecode;
|
||||
tif->tif_decodestrip = JBIGDecode;
|
||||
|
||||
tif->tif_setupencode = JBIGSetupEncode;
|
||||
tif->tif_encodestrip = JBIGEncode;
|
||||
tif->tif_setupencode = JBIGSetupEncode;
|
||||
tif->tif_encodestrip = JBIGEncode;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif /* JBIG_SUPPORT */
|
||||
|
||||
3990
libtiff/tif_jpeg.c
3990
libtiff/tif_jpeg.c
File diff suppressed because it is too large
Load Diff
@@ -28,33 +28,36 @@ int TIFFInitJPEG_12(TIFF *tif, int scheme);
|
||||
#include "tif_jpeg.c"
|
||||
|
||||
int TIFFReInitJPEG_12(TIFF *tif, const JPEGOtherSettings *otherSettings,
|
||||
int scheme, int is_encode) {
|
||||
JPEGState *sp;
|
||||
uint8_t *new_tif_data;
|
||||
int scheme, int is_encode)
|
||||
{
|
||||
JPEGState *sp;
|
||||
uint8_t *new_tif_data;
|
||||
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_JPEG);
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_JPEG);
|
||||
|
||||
new_tif_data = (uint8_t *)_TIFFreallocExt(tif, tif->tif_data, sizeof(JPEGState));
|
||||
new_tif_data =
|
||||
(uint8_t *)_TIFFreallocExt(tif, tif->tif_data, sizeof(JPEGState));
|
||||
|
||||
if (new_tif_data == NULL) {
|
||||
TIFFErrorExtR(tif, "TIFFReInitJPEG_12",
|
||||
"No space for JPEG state block");
|
||||
return 0;
|
||||
}
|
||||
if (new_tif_data == NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif, "TIFFReInitJPEG_12",
|
||||
"No space for JPEG state block");
|
||||
return 0;
|
||||
}
|
||||
|
||||
tif->tif_data = new_tif_data;
|
||||
_TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
|
||||
tif->tif_data = new_tif_data;
|
||||
_TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
|
||||
|
||||
TIFFInitJPEGCommon(tif);
|
||||
TIFFInitJPEGCommon(tif);
|
||||
|
||||
sp = JState(tif);
|
||||
sp->otherSettings = *otherSettings;
|
||||
sp = JState(tif);
|
||||
sp->otherSettings = *otherSettings;
|
||||
|
||||
if (is_encode)
|
||||
return JPEGSetupEncode(tif);
|
||||
else
|
||||
return JPEGSetupDecode(tif);
|
||||
if (is_encode)
|
||||
return JPEGSetupEncode(tif);
|
||||
else
|
||||
return JPEGSetupDecode(tif);
|
||||
}
|
||||
|
||||
#endif /* defined(JPEG_DUAL_MODE_8_12) */
|
||||
|
||||
1803
libtiff/tif_lerc.c
1803
libtiff/tif_lerc.c
File diff suppressed because it is too large
Load Diff
2845
libtiff/tif_luv.c
2845
libtiff/tif_luv.c
File diff suppressed because it is too large
Load Diff
@@ -33,469 +33,488 @@
|
||||
* The codec is derived from ZLIB codec (tif_zip.c).
|
||||
*/
|
||||
|
||||
#include "tif_predict.h"
|
||||
#include "lzma.h"
|
||||
#include "tif_predict.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
* State block for each open TIFF file using LZMA2 compression/decompression.
|
||||
*/
|
||||
typedef struct {
|
||||
TIFFPredictorState predict;
|
||||
lzma_stream stream;
|
||||
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
||||
lzma_options_delta opt_delta; /* delta filter options */
|
||||
lzma_options_lzma opt_lzma; /* LZMA2 filter options */
|
||||
int preset; /* compression level */
|
||||
lzma_check check; /* type of the integrity check */
|
||||
int state; /* state flags */
|
||||
typedef struct
|
||||
{
|
||||
TIFFPredictorState predict;
|
||||
lzma_stream stream;
|
||||
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
||||
lzma_options_delta opt_delta; /* delta filter options */
|
||||
lzma_options_lzma opt_lzma; /* LZMA2 filter options */
|
||||
int preset; /* compression level */
|
||||
lzma_check check; /* type of the integrity check */
|
||||
int state; /* state flags */
|
||||
#define LSTATE_INIT_DECODE 0x01
|
||||
#define LSTATE_INIT_ENCODE 0x02
|
||||
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
} LZMAState;
|
||||
|
||||
#define LState(tif) ((LZMAState*) (tif)->tif_data)
|
||||
#define DecoderState(tif) LState(tif)
|
||||
#define EncoderState(tif) LState(tif)
|
||||
#define LState(tif) ((LZMAState *)(tif)->tif_data)
|
||||
#define DecoderState(tif) LState(tif)
|
||||
#define EncoderState(tif) LState(tif)
|
||||
|
||||
static int LZMAEncode(TIFF* tif, uint8_t* bp, tmsize_t cc, uint16_t s);
|
||||
static int LZMADecode(TIFF* tif, uint8_t* op, tmsize_t occ, uint16_t s);
|
||||
static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||
static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||
|
||||
static const char *
|
||||
LZMAStrerror(lzma_ret ret)
|
||||
static const char *LZMAStrerror(lzma_ret ret)
|
||||
{
|
||||
switch (ret) {
|
||||
case LZMA_OK:
|
||||
return "operation completed successfully";
|
||||
case LZMA_STREAM_END:
|
||||
return "end of stream was reached";
|
||||
case LZMA_NO_CHECK:
|
||||
return "input stream has no integrity check";
|
||||
case LZMA_UNSUPPORTED_CHECK:
|
||||
return "cannot calculate the integrity check";
|
||||
case LZMA_GET_CHECK:
|
||||
return "integrity check type is now available";
|
||||
case LZMA_MEM_ERROR:
|
||||
return "cannot allocate memory";
|
||||
case LZMA_MEMLIMIT_ERROR:
|
||||
return "memory usage limit was reached";
|
||||
case LZMA_FORMAT_ERROR:
|
||||
return "file format not recognized";
|
||||
case LZMA_OPTIONS_ERROR:
|
||||
return "invalid or unsupported options";
|
||||
case LZMA_DATA_ERROR:
|
||||
return "data is corrupt";
|
||||
case LZMA_BUF_ERROR:
|
||||
return "no progress is possible (stream is truncated or corrupt)";
|
||||
case LZMA_PROG_ERROR:
|
||||
return "programming error";
|
||||
default:
|
||||
return "unidentified liblzma error";
|
||||
}
|
||||
switch (ret)
|
||||
{
|
||||
case LZMA_OK:
|
||||
return "operation completed successfully";
|
||||
case LZMA_STREAM_END:
|
||||
return "end of stream was reached";
|
||||
case LZMA_NO_CHECK:
|
||||
return "input stream has no integrity check";
|
||||
case LZMA_UNSUPPORTED_CHECK:
|
||||
return "cannot calculate the integrity check";
|
||||
case LZMA_GET_CHECK:
|
||||
return "integrity check type is now available";
|
||||
case LZMA_MEM_ERROR:
|
||||
return "cannot allocate memory";
|
||||
case LZMA_MEMLIMIT_ERROR:
|
||||
return "memory usage limit was reached";
|
||||
case LZMA_FORMAT_ERROR:
|
||||
return "file format not recognized";
|
||||
case LZMA_OPTIONS_ERROR:
|
||||
return "invalid or unsupported options";
|
||||
case LZMA_DATA_ERROR:
|
||||
return "data is corrupt";
|
||||
case LZMA_BUF_ERROR:
|
||||
return "no progress is possible (stream is truncated or corrupt)";
|
||||
case LZMA_PROG_ERROR:
|
||||
return "programming error";
|
||||
default:
|
||||
return "unidentified liblzma error";
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
LZMAFixupTags(TIFF* tif)
|
||||
static int LZMAFixupTags(TIFF *tif)
|
||||
{
|
||||
(void) tif;
|
||||
return 1;
|
||||
(void)tif;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
LZMASetupDecode(TIFF* tif)
|
||||
static int LZMASetupDecode(TIFF *tif)
|
||||
{
|
||||
LZMAState* sp = DecoderState(tif);
|
||||
LZMAState *sp = DecoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
|
||||
/* if we were last encoding, terminate this mode */
|
||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
assert(sp != NULL);
|
||||
|
||||
sp->state |= LSTATE_INIT_DECODE;
|
||||
return 1;
|
||||
/* if we were last encoding, terminate this mode */
|
||||
if (sp->state & LSTATE_INIT_ENCODE)
|
||||
{
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
|
||||
sp->state |= LSTATE_INIT_DECODE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup state for decoding a strip.
|
||||
*/
|
||||
static int
|
||||
LZMAPreDecode(TIFF* tif, uint16_t s)
|
||||
static int LZMAPreDecode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "LZMAPreDecode";
|
||||
LZMAState* sp = DecoderState(tif);
|
||||
lzma_ret ret;
|
||||
static const char module[] = "LZMAPreDecode";
|
||||
LZMAState *sp = DecoderState(tif);
|
||||
lzma_ret ret;
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
|
||||
if( (sp->state & LSTATE_INIT_DECODE) == 0 )
|
||||
tif->tif_setupdecode(tif);
|
||||
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
||||
tif->tif_setupdecode(tif);
|
||||
|
||||
sp->stream.next_in = tif->tif_rawdata;
|
||||
sp->stream.avail_in = (size_t) tif->tif_rawcc;
|
||||
if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
sp->stream.next_in = tif->tif_rawdata;
|
||||
sp->stream.avail_in = (size_t)tif->tif_rawcc;
|
||||
if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable memory limit when decoding. UINT64_MAX is a flag to disable
|
||||
* the limit, we are passing (uint64_t)-1 which should be the same.
|
||||
*/
|
||||
ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
|
||||
if (ret != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error initializing the stream decoder, %s",
|
||||
LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
/*
|
||||
* Disable memory limit when decoding. UINT64_MAX is a flag to disable
|
||||
* the limit, we are passing (uint64_t)-1 which should be the same.
|
||||
*/
|
||||
ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
|
||||
if (ret != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error initializing the stream decoder, %s",
|
||||
LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
LZMADecode(TIFF* tif, uint8_t* op, tmsize_t occ, uint16_t s)
|
||||
static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||
{
|
||||
static const char module[] = "LZMADecode";
|
||||
LZMAState* sp = DecoderState(tif);
|
||||
static const char module[] = "LZMADecode";
|
||||
LZMAState *sp = DecoderState(tif);
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_DECODE);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_DECODE);
|
||||
|
||||
sp->stream.next_in = tif->tif_rawcp;
|
||||
sp->stream.avail_in = (size_t) tif->tif_rawcc;
|
||||
sp->stream.next_in = tif->tif_rawcp;
|
||||
sp->stream.avail_in = (size_t)tif->tif_rawcc;
|
||||
|
||||
sp->stream.next_out = op;
|
||||
sp->stream.avail_out = (size_t) occ;
|
||||
if ((tmsize_t)sp->stream.avail_out != occ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
sp->stream.next_out = op;
|
||||
sp->stream.avail_out = (size_t)occ;
|
||||
if ((tmsize_t)sp->stream.avail_out != occ)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
|
||||
do {
|
||||
/*
|
||||
* Save the current stream state to properly recover from the
|
||||
* decoding errors later.
|
||||
*/
|
||||
const uint8_t *next_in = sp->stream.next_in;
|
||||
size_t avail_in = sp->stream.avail_in;
|
||||
do
|
||||
{
|
||||
/*
|
||||
* Save the current stream state to properly recover from the
|
||||
* decoding errors later.
|
||||
*/
|
||||
const uint8_t *next_in = sp->stream.next_in;
|
||||
size_t avail_in = sp->stream.avail_in;
|
||||
|
||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||
if (ret == LZMA_STREAM_END)
|
||||
break;
|
||||
if (ret == LZMA_MEMLIMIT_ERROR) {
|
||||
lzma_ret r = lzma_stream_decoder(&sp->stream,
|
||||
lzma_memusage(&sp->stream), 0);
|
||||
if (r != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error initializing the stream decoder, %s",
|
||||
LZMAStrerror(r));
|
||||
break;
|
||||
}
|
||||
sp->stream.next_in = next_in;
|
||||
sp->stream.avail_in = avail_in;
|
||||
continue;
|
||||
}
|
||||
if (ret != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Decoding error at scanline %"PRIu32", %s",
|
||||
tif->tif_row, LZMAStrerror(ret));
|
||||
break;
|
||||
}
|
||||
} while (sp->stream.avail_out > 0);
|
||||
if (sp->stream.avail_out != 0) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data at scanline %"PRIu32" (short %"TIFF_SIZE_FORMAT" bytes)",
|
||||
tif->tif_row, sp->stream.avail_out);
|
||||
return 0;
|
||||
}
|
||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||
if (ret == LZMA_STREAM_END)
|
||||
break;
|
||||
if (ret == LZMA_MEMLIMIT_ERROR)
|
||||
{
|
||||
lzma_ret r =
|
||||
lzma_stream_decoder(&sp->stream, lzma_memusage(&sp->stream), 0);
|
||||
if (r != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error initializing the stream decoder, %s",
|
||||
LZMAStrerror(r));
|
||||
break;
|
||||
}
|
||||
sp->stream.next_in = next_in;
|
||||
sp->stream.avail_in = avail_in;
|
||||
continue;
|
||||
}
|
||||
if (ret != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Decoding error at scanline %" PRIu32 ", %s",
|
||||
tif->tif_row, LZMAStrerror(ret));
|
||||
break;
|
||||
}
|
||||
} while (sp->stream.avail_out > 0);
|
||||
if (sp->stream.avail_out != 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data at scanline %" PRIu32
|
||||
" (short %" TIFF_SIZE_FORMAT " bytes)",
|
||||
tif->tif_row, sp->stream.avail_out);
|
||||
return 0;
|
||||
}
|
||||
|
||||
tif->tif_rawcp = (uint8_t *)sp->stream.next_in; /* cast away const */
|
||||
tif->tif_rawcc = sp->stream.avail_in;
|
||||
|
||||
return 1;
|
||||
tif->tif_rawcp = (uint8_t *)sp->stream.next_in; /* cast away const */
|
||||
tif->tif_rawcc = sp->stream.avail_in;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
LZMASetupEncode(TIFF* tif)
|
||||
static int LZMASetupEncode(TIFF *tif)
|
||||
{
|
||||
LZMAState* sp = EncoderState(tif);
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
if (sp->state & LSTATE_INIT_DECODE) {
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
assert(sp != NULL);
|
||||
if (sp->state & LSTATE_INIT_DECODE)
|
||||
{
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
|
||||
sp->state |= LSTATE_INIT_ENCODE;
|
||||
return 1;
|
||||
sp->state |= LSTATE_INIT_ENCODE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset encoding state at the start of a strip.
|
||||
*/
|
||||
static int
|
||||
LZMAPreEncode(TIFF* tif, uint16_t s)
|
||||
static int LZMAPreEncode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "LZMAPreEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
lzma_ret ret;
|
||||
static const char module[] = "LZMAPreEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
lzma_ret ret;
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
if( sp->state != LSTATE_INIT_ENCODE )
|
||||
tif->tif_setupencode(tif);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
if (sp->state != LSTATE_INIT_ENCODE)
|
||||
tif->tif_setupencode(tif);
|
||||
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
|
||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
||||
if (ret != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in lzma_stream_encoder(): %s", LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
|
||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
||||
if (ret != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in lzma_stream_encoder(): %s",
|
||||
LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a chunk of pixels.
|
||||
*/
|
||||
static int
|
||||
LZMAEncode(TIFF* tif, uint8_t* bp, tmsize_t cc, uint16_t s)
|
||||
static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
static const char module[] = "LZMAEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
static const char module[] = "LZMAEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_ENCODE);
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_ENCODE);
|
||||
|
||||
(void) s;
|
||||
sp->stream.next_in = bp;
|
||||
sp->stream.avail_in = (size_t) cc;
|
||||
if ((tmsize_t)sp->stream.avail_in != cc) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
do {
|
||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||
if (ret != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Encoding error at scanline %"PRIu32", %s",
|
||||
tif->tif_row, LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
if (sp->stream.avail_out == 0) {
|
||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in LZMAPreEncode */
|
||||
}
|
||||
} while (sp->stream.avail_in > 0);
|
||||
return 1;
|
||||
(void)s;
|
||||
sp->stream.next_in = bp;
|
||||
sp->stream.avail_in = (size_t)cc;
|
||||
if ((tmsize_t)sp->stream.avail_in != cc)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma cannot deal with buffers this size");
|
||||
return 0;
|
||||
}
|
||||
do
|
||||
{
|
||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||
if (ret != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Encoding error at scanline %" PRIu32 ", %s",
|
||||
tif->tif_row, LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
if (sp->stream.avail_out == 0)
|
||||
{
|
||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out =
|
||||
(size_t)
|
||||
tif->tif_rawdatasize; /* this is a safe typecast, as check
|
||||
is made already in LZMAPreEncode */
|
||||
}
|
||||
} while (sp->stream.avail_in > 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finish off an encoded strip by flushing the last
|
||||
* string and tacking on an End Of Information code.
|
||||
*/
|
||||
static int
|
||||
LZMAPostEncode(TIFF* tif)
|
||||
static int LZMAPostEncode(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "LZMAPostEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
lzma_ret ret;
|
||||
static const char module[] = "LZMAPostEncode";
|
||||
LZMAState *sp = EncoderState(tif);
|
||||
lzma_ret ret;
|
||||
|
||||
sp->stream.avail_in = 0;
|
||||
do {
|
||||
ret = lzma_code(&sp->stream, LZMA_FINISH);
|
||||
switch (ret) {
|
||||
case LZMA_STREAM_END:
|
||||
case LZMA_OK:
|
||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
|
||||
tif->tif_rawcc =
|
||||
tif->tif_rawdatasize - sp->stream.avail_out;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */
|
||||
}
|
||||
break;
|
||||
default:
|
||||
TIFFErrorExtR(tif, module, "Liblzma error: %s",
|
||||
LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
} while (ret != LZMA_STREAM_END);
|
||||
return 1;
|
||||
sp->stream.avail_in = 0;
|
||||
do
|
||||
{
|
||||
ret = lzma_code(&sp->stream, LZMA_FINISH);
|
||||
switch (ret)
|
||||
{
|
||||
case LZMA_STREAM_END:
|
||||
case LZMA_OK:
|
||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
||||
{
|
||||
tif->tif_rawcc =
|
||||
tif->tif_rawdatasize - sp->stream.avail_out;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->stream.next_out = tif->tif_rawdata;
|
||||
sp->stream.avail_out =
|
||||
(size_t)
|
||||
tif->tif_rawdatasize; /* this is a safe typecast, as
|
||||
check is made already in
|
||||
ZIPPreEncode */
|
||||
}
|
||||
break;
|
||||
default:
|
||||
TIFFErrorExtR(tif, module, "Liblzma error: %s",
|
||||
LZMAStrerror(ret));
|
||||
return 0;
|
||||
}
|
||||
} while (ret != LZMA_STREAM_END);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
LZMACleanup(TIFF* tif)
|
||||
static void LZMACleanup(TIFF *tif)
|
||||
{
|
||||
LZMAState* sp = LState(tif);
|
||||
LZMAState *sp = LState(tif);
|
||||
|
||||
assert(sp != 0);
|
||||
assert(sp != 0);
|
||||
|
||||
(void)TIFFPredictorCleanup(tif);
|
||||
(void)TIFFPredictorCleanup(tif);
|
||||
|
||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||
|
||||
if (sp->state) {
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
_TIFFfreeExt(tif, sp);
|
||||
tif->tif_data = NULL;
|
||||
if (sp->state)
|
||||
{
|
||||
lzma_end(&sp->stream);
|
||||
sp->state = 0;
|
||||
}
|
||||
_TIFFfreeExt(tif, sp);
|
||||
tif->tif_data = NULL;
|
||||
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
}
|
||||
|
||||
static int
|
||||
LZMAVSetField(TIFF* tif, uint32_t tag, va_list ap)
|
||||
static int LZMAVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||
{
|
||||
static const char module[] = "LZMAVSetField";
|
||||
LZMAState* sp = LState(tif);
|
||||
static const char module[] = "LZMAVSetField";
|
||||
LZMAState *sp = LState(tif);
|
||||
|
||||
switch (tag) {
|
||||
case TIFFTAG_LZMAPRESET:
|
||||
sp->preset = (int) va_arg(ap, int);
|
||||
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
||||
lzma_ret ret = lzma_stream_encoder(&sp->stream,
|
||||
sp->filters,
|
||||
sp->check);
|
||||
if (ret != LZMA_OK) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Liblzma error: %s",
|
||||
LZMAStrerror(ret));
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
return (*sp->vsetparent)(tif, tag, ap);
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
switch (tag)
|
||||
{
|
||||
case TIFFTAG_LZMAPRESET:
|
||||
sp->preset = (int)va_arg(ap, int);
|
||||
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
||||
if (sp->state & LSTATE_INIT_ENCODE)
|
||||
{
|
||||
lzma_ret ret =
|
||||
lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
||||
if (ret != LZMA_OK)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Liblzma error: %s",
|
||||
LZMAStrerror(ret));
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
return (*sp->vsetparent)(tif, tag, ap);
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
static int
|
||||
LZMAVGetField(TIFF* tif, uint32_t tag, va_list ap)
|
||||
static int LZMAVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||
{
|
||||
LZMAState* sp = LState(tif);
|
||||
LZMAState *sp = LState(tif);
|
||||
|
||||
switch (tag) {
|
||||
case TIFFTAG_LZMAPRESET:
|
||||
*va_arg(ap, int*) = sp->preset;
|
||||
break;
|
||||
default:
|
||||
return (*sp->vgetparent)(tif, tag, ap);
|
||||
}
|
||||
return 1;
|
||||
switch (tag)
|
||||
{
|
||||
case TIFFTAG_LZMAPRESET:
|
||||
*va_arg(ap, int *) = sp->preset;
|
||||
break;
|
||||
default:
|
||||
return (*sp->vgetparent)(tif, tag, ap);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const TIFFField lzmaFields[] = {
|
||||
{ TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED,
|
||||
FIELD_PSEUDO, TRUE, FALSE, "LZMA2 Compression Preset", NULL },
|
||||
{TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE,
|
||||
"LZMA2 Compression Preset", NULL},
|
||||
};
|
||||
|
||||
int
|
||||
TIFFInitLZMA(TIFF* tif, int scheme)
|
||||
int TIFFInitLZMA(TIFF *tif, int scheme)
|
||||
{
|
||||
static const char module[] = "TIFFInitLZMA";
|
||||
LZMAState* sp;
|
||||
lzma_stream tmp_stream = LZMA_STREAM_INIT;
|
||||
static const char module[] = "TIFFInitLZMA";
|
||||
LZMAState *sp;
|
||||
lzma_stream tmp_stream = LZMA_STREAM_INIT;
|
||||
|
||||
(void)scheme;
|
||||
assert( scheme == COMPRESSION_LZMA );
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_LZMA);
|
||||
|
||||
/*
|
||||
* Merge codec-specific tag information.
|
||||
*/
|
||||
if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields))) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Merging LZMA2 codec-specific tags failed");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Merge codec-specific tag information.
|
||||
*/
|
||||
if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields)))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Merging LZMA2 codec-specific tags failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate state block so tag methods have storage to record values.
|
||||
*/
|
||||
tif->tif_data = (uint8_t*) _TIFFmallocExt(tif, sizeof(LZMAState));
|
||||
if (tif->tif_data == NULL)
|
||||
goto bad;
|
||||
sp = LState(tif);
|
||||
memcpy(&sp->stream, &tmp_stream, sizeof(lzma_stream));
|
||||
/*
|
||||
* Allocate state block so tag methods have storage to record values.
|
||||
*/
|
||||
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZMAState));
|
||||
if (tif->tif_data == NULL)
|
||||
goto bad;
|
||||
sp = LState(tif);
|
||||
memcpy(&sp->stream, &tmp_stream, sizeof(lzma_stream));
|
||||
|
||||
/*
|
||||
* Override parent get/set field methods.
|
||||
*/
|
||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
||||
tif->tif_tagmethods.vgetfield = LZMAVGetField; /* hook for codec tags */
|
||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
||||
tif->tif_tagmethods.vsetfield = LZMAVSetField; /* hook for codec tags */
|
||||
/*
|
||||
* Override parent get/set field methods.
|
||||
*/
|
||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
||||
tif->tif_tagmethods.vgetfield = LZMAVGetField; /* hook for codec tags */
|
||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
||||
tif->tif_tagmethods.vsetfield = LZMAVSetField; /* hook for codec tags */
|
||||
|
||||
/* Default values for codec-specific fields */
|
||||
sp->preset = LZMA_PRESET_DEFAULT; /* default comp. level */
|
||||
sp->check = LZMA_CHECK_NONE;
|
||||
sp->state = 0;
|
||||
/* Default values for codec-specific fields */
|
||||
sp->preset = LZMA_PRESET_DEFAULT; /* default comp. level */
|
||||
sp->check = LZMA_CHECK_NONE;
|
||||
sp->state = 0;
|
||||
|
||||
/* Data filters. So far we are using delta and LZMA2 filters only. */
|
||||
sp->opt_delta.type = LZMA_DELTA_TYPE_BYTE;
|
||||
/*
|
||||
* The sample size in bytes seems to be reasonable distance for delta
|
||||
* filter.
|
||||
*/
|
||||
sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8) ?
|
||||
1 : tif->tif_dir.td_bitspersample / 8;
|
||||
sp->filters[0].id = LZMA_FILTER_DELTA;
|
||||
sp->filters[0].options = &sp->opt_delta;
|
||||
/* Data filters. So far we are using delta and LZMA2 filters only. */
|
||||
sp->opt_delta.type = LZMA_DELTA_TYPE_BYTE;
|
||||
/*
|
||||
* The sample size in bytes seems to be reasonable distance for delta
|
||||
* filter.
|
||||
*/
|
||||
sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8)
|
||||
? 1
|
||||
: tif->tif_dir.td_bitspersample / 8;
|
||||
sp->filters[0].id = LZMA_FILTER_DELTA;
|
||||
sp->filters[0].options = &sp->opt_delta;
|
||||
|
||||
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
||||
sp->filters[1].id = LZMA_FILTER_LZMA2;
|
||||
sp->filters[1].options = &sp->opt_lzma;
|
||||
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
||||
sp->filters[1].id = LZMA_FILTER_LZMA2;
|
||||
sp->filters[1].options = &sp->opt_lzma;
|
||||
|
||||
sp->filters[2].id = LZMA_VLI_UNKNOWN;
|
||||
sp->filters[2].options = NULL;
|
||||
sp->filters[2].id = LZMA_VLI_UNKNOWN;
|
||||
sp->filters[2].options = NULL;
|
||||
|
||||
/*
|
||||
* Install codec methods.
|
||||
*/
|
||||
tif->tif_fixuptags = LZMAFixupTags;
|
||||
tif->tif_setupdecode = LZMASetupDecode;
|
||||
tif->tif_predecode = LZMAPreDecode;
|
||||
tif->tif_decoderow = LZMADecode;
|
||||
tif->tif_decodestrip = LZMADecode;
|
||||
tif->tif_decodetile = LZMADecode;
|
||||
tif->tif_setupencode = LZMASetupEncode;
|
||||
tif->tif_preencode = LZMAPreEncode;
|
||||
tif->tif_postencode = LZMAPostEncode;
|
||||
tif->tif_encoderow = LZMAEncode;
|
||||
tif->tif_encodestrip = LZMAEncode;
|
||||
tif->tif_encodetile = LZMAEncode;
|
||||
tif->tif_cleanup = LZMACleanup;
|
||||
/*
|
||||
* Setup predictor setup.
|
||||
*/
|
||||
(void) TIFFPredictorInit(tif);
|
||||
return 1;
|
||||
/*
|
||||
* Install codec methods.
|
||||
*/
|
||||
tif->tif_fixuptags = LZMAFixupTags;
|
||||
tif->tif_setupdecode = LZMASetupDecode;
|
||||
tif->tif_predecode = LZMAPreDecode;
|
||||
tif->tif_decoderow = LZMADecode;
|
||||
tif->tif_decodestrip = LZMADecode;
|
||||
tif->tif_decodetile = LZMADecode;
|
||||
tif->tif_setupencode = LZMASetupEncode;
|
||||
tif->tif_preencode = LZMAPreEncode;
|
||||
tif->tif_postencode = LZMAPostEncode;
|
||||
tif->tif_encoderow = LZMAEncode;
|
||||
tif->tif_encodestrip = LZMAEncode;
|
||||
tif->tif_encodetile = LZMAEncode;
|
||||
tif->tif_cleanup = LZMACleanup;
|
||||
/*
|
||||
* Setup predictor setup.
|
||||
*/
|
||||
(void)TIFFPredictorInit(tif);
|
||||
return 1;
|
||||
bad:
|
||||
TIFFErrorExtR(tif, module,
|
||||
"No space for LZMA2 state block");
|
||||
return 0;
|
||||
TIFFErrorExtR(tif, module, "No space for LZMA2 state block");
|
||||
return 0;
|
||||
}
|
||||
#endif /* LZMA_SUPPORT */
|
||||
|
||||
2194
libtiff/tif_lzw.c
2194
libtiff/tif_lzw.c
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -30,149 +30,165 @@
|
||||
* NeXT 2-bit Grey Scale Compression Algorithm Support
|
||||
*/
|
||||
|
||||
#define SETPIXEL(op, v) { \
|
||||
switch (npixels++ & 3) { \
|
||||
case 0: op[0] = (unsigned char) ((v) << 6); break; \
|
||||
case 1: op[0] |= (v) << 4; break; \
|
||||
case 2: op[0] |= (v) << 2; break; \
|
||||
case 3: *op++ |= (v); op_offset++; break; \
|
||||
} \
|
||||
}
|
||||
#define SETPIXEL(op, v) \
|
||||
{ \
|
||||
switch (npixels++ & 3) \
|
||||
{ \
|
||||
case 0: \
|
||||
op[0] = (unsigned char)((v) << 6); \
|
||||
break; \
|
||||
case 1: \
|
||||
op[0] |= (v) << 4; \
|
||||
break; \
|
||||
case 2: \
|
||||
op[0] |= (v) << 2; \
|
||||
break; \
|
||||
case 3: \
|
||||
*op++ |= (v); \
|
||||
op_offset++; \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define LITERALROW 0x00
|
||||
#define LITERALSPAN 0x40
|
||||
#define WHITE ((1<<2)-1)
|
||||
#define LITERALROW 0x00
|
||||
#define LITERALSPAN 0x40
|
||||
#define WHITE ((1 << 2) - 1)
|
||||
|
||||
static int
|
||||
NeXTDecode(TIFF* tif, uint8_t* buf, tmsize_t occ, uint16_t s)
|
||||
static int NeXTDecode(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
|
||||
{
|
||||
static const char module[] = "NeXTDecode";
|
||||
unsigned char *bp, *op;
|
||||
tmsize_t cc;
|
||||
uint8_t* row;
|
||||
tmsize_t scanline, n;
|
||||
static const char module[] = "NeXTDecode";
|
||||
unsigned char *bp, *op;
|
||||
tmsize_t cc;
|
||||
uint8_t *row;
|
||||
tmsize_t scanline, n;
|
||||
|
||||
(void) s;
|
||||
/*
|
||||
* Each scanline is assumed to start off as all
|
||||
* white (we assume a PhotometricInterpretation
|
||||
* of ``min-is-black'').
|
||||
*/
|
||||
for (op = (unsigned char*) buf, cc = occ; cc-- > 0;)
|
||||
*op++ = 0xff;
|
||||
(void)s;
|
||||
/*
|
||||
* Each scanline is assumed to start off as all
|
||||
* white (we assume a PhotometricInterpretation
|
||||
* of ``min-is-black'').
|
||||
*/
|
||||
for (op = (unsigned char *)buf, cc = occ; cc-- > 0;)
|
||||
*op++ = 0xff;
|
||||
|
||||
bp = (unsigned char *)tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
scanline = tif->tif_scanlinesize;
|
||||
if (occ % scanline)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||
return (0);
|
||||
}
|
||||
for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline) {
|
||||
n = *bp++;
|
||||
cc--;
|
||||
switch (n) {
|
||||
case LITERALROW:
|
||||
/*
|
||||
* The entire scanline is given as literal values.
|
||||
*/
|
||||
if (cc < scanline)
|
||||
goto bad;
|
||||
_TIFFmemcpy(row, bp, scanline);
|
||||
bp += scanline;
|
||||
cc -= scanline;
|
||||
break;
|
||||
case LITERALSPAN: {
|
||||
tmsize_t off;
|
||||
/*
|
||||
* The scanline has a literal span that begins at some
|
||||
* offset.
|
||||
*/
|
||||
if( cc < 4 )
|
||||
goto bad;
|
||||
off = (bp[0] * 256) + bp[1];
|
||||
n = (bp[2] * 256) + bp[3];
|
||||
if (cc < 4+n || off+n > scanline)
|
||||
goto bad;
|
||||
_TIFFmemcpy(row+off, bp+4, n);
|
||||
bp += 4+n;
|
||||
cc -= 4+n;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
uint32_t npixels = 0, grey;
|
||||
tmsize_t op_offset = 0;
|
||||
uint32_t imagewidth = tif->tif_dir.td_imagewidth;
|
||||
if( isTiled(tif) )
|
||||
imagewidth = tif->tif_dir.td_tilewidth;
|
||||
bp = (unsigned char *)tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
scanline = tif->tif_scanlinesize;
|
||||
if (occ % scanline)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||
return (0);
|
||||
}
|
||||
for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline)
|
||||
{
|
||||
n = *bp++;
|
||||
cc--;
|
||||
switch (n)
|
||||
{
|
||||
case LITERALROW:
|
||||
/*
|
||||
* The entire scanline is given as literal values.
|
||||
*/
|
||||
if (cc < scanline)
|
||||
goto bad;
|
||||
_TIFFmemcpy(row, bp, scanline);
|
||||
bp += scanline;
|
||||
cc -= scanline;
|
||||
break;
|
||||
case LITERALSPAN:
|
||||
{
|
||||
tmsize_t off;
|
||||
/*
|
||||
* The scanline has a literal span that begins at some
|
||||
* offset.
|
||||
*/
|
||||
if (cc < 4)
|
||||
goto bad;
|
||||
off = (bp[0] * 256) + bp[1];
|
||||
n = (bp[2] * 256) + bp[3];
|
||||
if (cc < 4 + n || off + n > scanline)
|
||||
goto bad;
|
||||
_TIFFmemcpy(row + off, bp + 4, n);
|
||||
bp += 4 + n;
|
||||
cc -= 4 + n;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
uint32_t npixels = 0, grey;
|
||||
tmsize_t op_offset = 0;
|
||||
uint32_t imagewidth = tif->tif_dir.td_imagewidth;
|
||||
if (isTiled(tif))
|
||||
imagewidth = tif->tif_dir.td_tilewidth;
|
||||
|
||||
/*
|
||||
* The scanline is composed of a sequence of constant
|
||||
* color ``runs''. We shift into ``run mode'' and
|
||||
* interpret bytes as codes of the form
|
||||
* <color><npixels> until we've filled the scanline.
|
||||
*/
|
||||
op = row;
|
||||
for (;;) {
|
||||
grey = (uint32_t)((n >> 6) & 0x3);
|
||||
n &= 0x3f;
|
||||
/*
|
||||
* Ensure the run does not exceed the scanline
|
||||
* bounds, potentially resulting in a security
|
||||
* issue.
|
||||
*/
|
||||
while (n-- > 0 && npixels < imagewidth && op_offset < scanline)
|
||||
SETPIXEL(op, grey);
|
||||
if (npixels >= imagewidth)
|
||||
break;
|
||||
if (op_offset >= scanline ) {
|
||||
TIFFErrorExtR(tif, module, "Invalid data for scanline %"PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
/*
|
||||
* The scanline is composed of a sequence of constant
|
||||
* color ``runs''. We shift into ``run mode'' and
|
||||
* interpret bytes as codes of the form
|
||||
* <color><npixels> until we've filled the scanline.
|
||||
*/
|
||||
op = row;
|
||||
for (;;)
|
||||
{
|
||||
grey = (uint32_t)((n >> 6) & 0x3);
|
||||
n &= 0x3f;
|
||||
/*
|
||||
* Ensure the run does not exceed the scanline
|
||||
* bounds, potentially resulting in a security
|
||||
* issue.
|
||||
*/
|
||||
while (n-- > 0 && npixels < imagewidth &&
|
||||
op_offset < scanline)
|
||||
SETPIXEL(op, grey);
|
||||
if (npixels >= imagewidth)
|
||||
break;
|
||||
if (op_offset >= scanline)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Invalid data for scanline %" PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
}
|
||||
if (cc == 0)
|
||||
goto bad;
|
||||
n = *bp++;
|
||||
cc--;
|
||||
}
|
||||
if (cc == 0)
|
||||
goto bad;
|
||||
n = *bp++;
|
||||
cc--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t*) bp;
|
||||
tif->tif_rawcc = cc;
|
||||
return (1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t *)bp;
|
||||
tif->tif_rawcc = cc;
|
||||
return (1);
|
||||
bad:
|
||||
TIFFErrorExtR(tif, module, "Not enough data for scanline %"PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
NeXTPreDecode(TIFF* tif, uint16_t s)
|
||||
static int NeXTPreDecode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "NeXTPreDecode";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
(void)s;
|
||||
static const char module[] = "NeXTPreDecode";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
(void)s;
|
||||
|
||||
if( td->td_bitspersample != 2 )
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Unsupported BitsPerSample = %"PRIu16,
|
||||
td->td_bitspersample);
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
if (td->td_bitspersample != 2)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Unsupported BitsPerSample = %" PRIu16,
|
||||
td->td_bitspersample);
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
int
|
||||
TIFFInitNeXT(TIFF* tif, int scheme)
|
||||
|
||||
int TIFFInitNeXT(TIFF *tif, int scheme)
|
||||
{
|
||||
(void) scheme;
|
||||
tif->tif_predecode = NeXTPreDecode;
|
||||
tif->tif_decoderow = NeXTDecode;
|
||||
tif->tif_decodestrip = NeXTDecode;
|
||||
tif->tif_decodetile = NeXTDecode;
|
||||
return (1);
|
||||
(void)scheme;
|
||||
tif->tif_predecode = NeXTPreDecode;
|
||||
tif->tif_decoderow = NeXTDecode;
|
||||
tif->tif_decodestrip = NeXTDecode;
|
||||
tif->tif_decodetile = NeXTDecode;
|
||||
return (1);
|
||||
}
|
||||
#endif /* NEXT_SUPPORT */
|
||||
|
||||
4890
libtiff/tif_ojpeg.c
4890
libtiff/tif_ojpeg.c
File diff suppressed because it is too large
Load Diff
1188
libtiff/tif_open.c
1188
libtiff/tif_open.c
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -31,157 +31,178 @@
|
||||
*/
|
||||
#include <stdio.h>
|
||||
|
||||
static int
|
||||
PackBitsPreEncode(TIFF* tif, uint16_t s)
|
||||
static int PackBitsPreEncode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
(void) s;
|
||||
(void)s;
|
||||
|
||||
tif->tif_data = (uint8_t*)_TIFFmallocExt(tif, sizeof(tmsize_t));
|
||||
if (tif->tif_data == NULL)
|
||||
return (0);
|
||||
/*
|
||||
* Calculate the scanline/tile-width size in bytes.
|
||||
*/
|
||||
if (isTiled(tif))
|
||||
*(tmsize_t*)tif->tif_data = TIFFTileRowSize(tif);
|
||||
else
|
||||
*(tmsize_t*)tif->tif_data = TIFFScanlineSize(tif);
|
||||
return (1);
|
||||
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(tmsize_t));
|
||||
if (tif->tif_data == NULL)
|
||||
return (0);
|
||||
/*
|
||||
* Calculate the scanline/tile-width size in bytes.
|
||||
*/
|
||||
if (isTiled(tif))
|
||||
*(tmsize_t *)tif->tif_data = TIFFTileRowSize(tif);
|
||||
else
|
||||
*(tmsize_t *)tif->tif_data = TIFFScanlineSize(tif);
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
PackBitsPostEncode(TIFF* tif)
|
||||
static int PackBitsPostEncode(TIFF *tif)
|
||||
{
|
||||
if (tif->tif_data)
|
||||
_TIFFfreeExt(tif, tif->tif_data);
|
||||
return (1);
|
||||
if (tif->tif_data)
|
||||
_TIFFfreeExt(tif, tif->tif_data);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a run of pixels.
|
||||
*/
|
||||
static int
|
||||
PackBitsEncode(TIFF* tif, uint8_t* buf, tmsize_t cc, uint16_t s)
|
||||
static int PackBitsEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
unsigned char* bp = (unsigned char*) buf;
|
||||
uint8_t* op;
|
||||
uint8_t* ep;
|
||||
uint8_t* lastliteral;
|
||||
long n, slop;
|
||||
int b;
|
||||
enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
|
||||
unsigned char *bp = (unsigned char *)buf;
|
||||
uint8_t *op;
|
||||
uint8_t *ep;
|
||||
uint8_t *lastliteral;
|
||||
long n, slop;
|
||||
int b;
|
||||
enum
|
||||
{
|
||||
BASE,
|
||||
LITERAL,
|
||||
RUN,
|
||||
LITERAL_RUN
|
||||
} state;
|
||||
|
||||
(void) s;
|
||||
op = tif->tif_rawcp;
|
||||
ep = tif->tif_rawdata + tif->tif_rawdatasize;
|
||||
state = BASE;
|
||||
lastliteral = 0;
|
||||
while (cc > 0) {
|
||||
/*
|
||||
* Find the longest string of identical bytes.
|
||||
*/
|
||||
b = *bp++;
|
||||
cc--;
|
||||
n = 1;
|
||||
for (; cc > 0 && b == *bp; cc--, bp++)
|
||||
n++;
|
||||
again:
|
||||
if (op + 2 >= ep) { /* insure space for new data */
|
||||
/*
|
||||
* Be careful about writing the last
|
||||
* literal. Must write up to that point
|
||||
* and then copy the remainder to the
|
||||
* front of the buffer.
|
||||
*/
|
||||
if (state == LITERAL || state == LITERAL_RUN) {
|
||||
slop = (long)(op - lastliteral);
|
||||
tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
|
||||
if (!TIFFFlushData1(tif))
|
||||
return (0);
|
||||
op = tif->tif_rawcp;
|
||||
while (slop-- > 0)
|
||||
*op++ = *lastliteral++;
|
||||
lastliteral = tif->tif_rawcp;
|
||||
} else {
|
||||
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
||||
if (!TIFFFlushData1(tif))
|
||||
return (0);
|
||||
op = tif->tif_rawcp;
|
||||
}
|
||||
}
|
||||
switch (state) {
|
||||
case BASE: /* initial state, set run/literal */
|
||||
if (n > 1) {
|
||||
state = RUN;
|
||||
if (n > 128) {
|
||||
*op++ = (uint8_t) -127;
|
||||
*op++ = (uint8_t) b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1));
|
||||
*op++ = (uint8_t) b;
|
||||
} else {
|
||||
lastliteral = op;
|
||||
*op++ = 0;
|
||||
*op++ = (uint8_t) b;
|
||||
state = LITERAL;
|
||||
}
|
||||
break;
|
||||
case LITERAL: /* last object was literal string */
|
||||
if (n > 1) {
|
||||
state = LITERAL_RUN;
|
||||
if (n > 128) {
|
||||
*op++ = (uint8_t) -127;
|
||||
*op++ = (uint8_t) b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1)); /* encode run */
|
||||
*op++ = (uint8_t) b;
|
||||
} else { /* extend literal */
|
||||
if (++(*lastliteral) == 127)
|
||||
state = BASE;
|
||||
*op++ = (uint8_t) b;
|
||||
}
|
||||
break;
|
||||
case RUN: /* last object was run */
|
||||
if (n > 1) {
|
||||
if (n > 128) {
|
||||
*op++ = (uint8_t) -127;
|
||||
*op++ = (uint8_t) b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1));
|
||||
*op++ = (uint8_t) b;
|
||||
} else {
|
||||
lastliteral = op;
|
||||
*op++ = 0;
|
||||
*op++ = (uint8_t) b;
|
||||
state = LITERAL;
|
||||
}
|
||||
break;
|
||||
case LITERAL_RUN: /* literal followed by a run */
|
||||
/*
|
||||
* Check to see if previous run should
|
||||
* be converted to a literal, in which
|
||||
* case we convert literal-run-literal
|
||||
* to a single literal.
|
||||
*/
|
||||
if (n == 1 && op[-2] == (uint8_t) -1 &&
|
||||
*lastliteral < 126) {
|
||||
state = (((*lastliteral) += 2) == 127 ?
|
||||
BASE : LITERAL);
|
||||
op[-2] = op[-1]; /* replicate */
|
||||
} else
|
||||
state = RUN;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
||||
tif->tif_rawcp = op;
|
||||
return (1);
|
||||
(void)s;
|
||||
op = tif->tif_rawcp;
|
||||
ep = tif->tif_rawdata + tif->tif_rawdatasize;
|
||||
state = BASE;
|
||||
lastliteral = 0;
|
||||
while (cc > 0)
|
||||
{
|
||||
/*
|
||||
* Find the longest string of identical bytes.
|
||||
*/
|
||||
b = *bp++;
|
||||
cc--;
|
||||
n = 1;
|
||||
for (; cc > 0 && b == *bp; cc--, bp++)
|
||||
n++;
|
||||
again:
|
||||
if (op + 2 >= ep)
|
||||
{ /* insure space for new data */
|
||||
/*
|
||||
* Be careful about writing the last
|
||||
* literal. Must write up to that point
|
||||
* and then copy the remainder to the
|
||||
* front of the buffer.
|
||||
*/
|
||||
if (state == LITERAL || state == LITERAL_RUN)
|
||||
{
|
||||
slop = (long)(op - lastliteral);
|
||||
tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
|
||||
if (!TIFFFlushData1(tif))
|
||||
return (0);
|
||||
op = tif->tif_rawcp;
|
||||
while (slop-- > 0)
|
||||
*op++ = *lastliteral++;
|
||||
lastliteral = tif->tif_rawcp;
|
||||
}
|
||||
else
|
||||
{
|
||||
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
||||
if (!TIFFFlushData1(tif))
|
||||
return (0);
|
||||
op = tif->tif_rawcp;
|
||||
}
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case BASE: /* initial state, set run/literal */
|
||||
if (n > 1)
|
||||
{
|
||||
state = RUN;
|
||||
if (n > 128)
|
||||
{
|
||||
*op++ = (uint8_t)-127;
|
||||
*op++ = (uint8_t)b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1));
|
||||
*op++ = (uint8_t)b;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastliteral = op;
|
||||
*op++ = 0;
|
||||
*op++ = (uint8_t)b;
|
||||
state = LITERAL;
|
||||
}
|
||||
break;
|
||||
case LITERAL: /* last object was literal string */
|
||||
if (n > 1)
|
||||
{
|
||||
state = LITERAL_RUN;
|
||||
if (n > 128)
|
||||
{
|
||||
*op++ = (uint8_t)-127;
|
||||
*op++ = (uint8_t)b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1)); /* encode run */
|
||||
*op++ = (uint8_t)b;
|
||||
}
|
||||
else
|
||||
{ /* extend literal */
|
||||
if (++(*lastliteral) == 127)
|
||||
state = BASE;
|
||||
*op++ = (uint8_t)b;
|
||||
}
|
||||
break;
|
||||
case RUN: /* last object was run */
|
||||
if (n > 1)
|
||||
{
|
||||
if (n > 128)
|
||||
{
|
||||
*op++ = (uint8_t)-127;
|
||||
*op++ = (uint8_t)b;
|
||||
n -= 128;
|
||||
goto again;
|
||||
}
|
||||
*op++ = (uint8_t)(-(n - 1));
|
||||
*op++ = (uint8_t)b;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastliteral = op;
|
||||
*op++ = 0;
|
||||
*op++ = (uint8_t)b;
|
||||
state = LITERAL;
|
||||
}
|
||||
break;
|
||||
case LITERAL_RUN: /* literal followed by a run */
|
||||
/*
|
||||
* Check to see if previous run should
|
||||
* be converted to a literal, in which
|
||||
* case we convert literal-run-literal
|
||||
* to a single literal.
|
||||
*/
|
||||
if (n == 1 && op[-2] == (uint8_t)-1 && *lastliteral < 126)
|
||||
{
|
||||
state = (((*lastliteral) += 2) == 127 ? BASE : LITERAL);
|
||||
op[-2] = op[-1]; /* replicate */
|
||||
}
|
||||
else
|
||||
state = RUN;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
||||
tif->tif_rawcp = op;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -191,104 +212,112 @@ PackBitsEncode(TIFF* tif, uint8_t* buf, tmsize_t cc, uint16_t s)
|
||||
* the decoder if data is read, for example, by scanlines
|
||||
* when it was encoded by strips.
|
||||
*/
|
||||
static int
|
||||
PackBitsEncodeChunk(TIFF* tif, uint8_t* bp, tmsize_t cc, uint16_t s)
|
||||
static int PackBitsEncodeChunk(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
tmsize_t rowsize = *(tmsize_t*)tif->tif_data;
|
||||
tmsize_t rowsize = *(tmsize_t *)tif->tif_data;
|
||||
|
||||
while (cc > 0) {
|
||||
tmsize_t chunk = rowsize;
|
||||
|
||||
if( cc < chunk )
|
||||
chunk = cc;
|
||||
while (cc > 0)
|
||||
{
|
||||
tmsize_t chunk = rowsize;
|
||||
|
||||
if (PackBitsEncode(tif, bp, chunk, s) < 0)
|
||||
return (-1);
|
||||
bp += chunk;
|
||||
cc -= chunk;
|
||||
}
|
||||
return (1);
|
||||
if (cc < chunk)
|
||||
chunk = cc;
|
||||
|
||||
if (PackBitsEncode(tif, bp, chunk, s) < 0)
|
||||
return (-1);
|
||||
bp += chunk;
|
||||
cc -= chunk;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
PackBitsDecode(TIFF* tif, uint8_t* op, tmsize_t occ, uint16_t s)
|
||||
static int PackBitsDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||
{
|
||||
static const char module[] = "PackBitsDecode";
|
||||
int8_t *bp;
|
||||
tmsize_t cc;
|
||||
long n;
|
||||
int b;
|
||||
static const char module[] = "PackBitsDecode";
|
||||
int8_t *bp;
|
||||
tmsize_t cc;
|
||||
long n;
|
||||
int b;
|
||||
|
||||
(void) s;
|
||||
bp = (int8_t*) tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
while (cc > 0 && occ > 0) {
|
||||
n = (long) *bp++;
|
||||
cc--;
|
||||
if (n < 0) { /* replicate next byte -n+1 times */
|
||||
if (n == -128) /* nop */
|
||||
continue;
|
||||
n = -n + 1;
|
||||
if( occ < (tmsize_t)n )
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Discarding %"TIFF_SSIZE_FORMAT" bytes to avoid buffer overrun",
|
||||
(tmsize_t)n - occ);
|
||||
n = (long)occ;
|
||||
}
|
||||
if( cc == 0 )
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Terminating PackBitsDecode due to lack of data.");
|
||||
break;
|
||||
}
|
||||
occ -= n;
|
||||
b = *bp++;
|
||||
cc--;
|
||||
while (n-- > 0)
|
||||
*op++ = (uint8_t) b;
|
||||
} else { /* copy next n+1 bytes literally */
|
||||
if (occ < (tmsize_t)(n + 1))
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Discarding %"TIFF_SSIZE_FORMAT" bytes to avoid buffer overrun",
|
||||
(tmsize_t)n - occ + 1);
|
||||
n = (long)occ - 1;
|
||||
}
|
||||
if (cc < (tmsize_t) (n+1))
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Terminating PackBitsDecode due to lack of data.");
|
||||
break;
|
||||
}
|
||||
_TIFFmemcpy(op, bp, ++n);
|
||||
op += n; occ -= n;
|
||||
bp += n; cc -= n;
|
||||
}
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t*) bp;
|
||||
tif->tif_rawcc = cc;
|
||||
if (occ > 0) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data for scanline %"PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
(void)s;
|
||||
bp = (int8_t *)tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
while (cc > 0 && occ > 0)
|
||||
{
|
||||
n = (long)*bp++;
|
||||
cc--;
|
||||
if (n < 0)
|
||||
{ /* replicate next byte -n+1 times */
|
||||
if (n == -128) /* nop */
|
||||
continue;
|
||||
n = -n + 1;
|
||||
if (occ < (tmsize_t)n)
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Discarding %" TIFF_SSIZE_FORMAT
|
||||
" bytes to avoid buffer overrun",
|
||||
(tmsize_t)n - occ);
|
||||
n = (long)occ;
|
||||
}
|
||||
if (cc == 0)
|
||||
{
|
||||
TIFFWarningExtR(
|
||||
tif, module,
|
||||
"Terminating PackBitsDecode due to lack of data.");
|
||||
break;
|
||||
}
|
||||
occ -= n;
|
||||
b = *bp++;
|
||||
cc--;
|
||||
while (n-- > 0)
|
||||
*op++ = (uint8_t)b;
|
||||
}
|
||||
else
|
||||
{ /* copy next n+1 bytes literally */
|
||||
if (occ < (tmsize_t)(n + 1))
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"Discarding %" TIFF_SSIZE_FORMAT
|
||||
" bytes to avoid buffer overrun",
|
||||
(tmsize_t)n - occ + 1);
|
||||
n = (long)occ - 1;
|
||||
}
|
||||
if (cc < (tmsize_t)(n + 1))
|
||||
{
|
||||
TIFFWarningExtR(
|
||||
tif, module,
|
||||
"Terminating PackBitsDecode due to lack of data.");
|
||||
break;
|
||||
}
|
||||
_TIFFmemcpy(op, bp, ++n);
|
||||
op += n;
|
||||
occ -= n;
|
||||
bp += n;
|
||||
cc -= n;
|
||||
}
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t *)bp;
|
||||
tif->tif_rawcc = cc;
|
||||
if (occ > 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
|
||||
tif->tif_row);
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
int
|
||||
TIFFInitPackBits(TIFF* tif, int scheme)
|
||||
int TIFFInitPackBits(TIFF *tif, int scheme)
|
||||
{
|
||||
(void) scheme;
|
||||
tif->tif_decoderow = PackBitsDecode;
|
||||
tif->tif_decodestrip = PackBitsDecode;
|
||||
tif->tif_decodetile = PackBitsDecode;
|
||||
tif->tif_preencode = PackBitsPreEncode;
|
||||
tif->tif_postencode = PackBitsPostEncode;
|
||||
tif->tif_encoderow = PackBitsEncode;
|
||||
tif->tif_encodestrip = PackBitsEncodeChunk;
|
||||
tif->tif_encodetile = PackBitsEncodeChunk;
|
||||
return (1);
|
||||
(void)scheme;
|
||||
tif->tif_decoderow = PackBitsDecode;
|
||||
tif->tif_decodestrip = PackBitsDecode;
|
||||
tif->tif_decodetile = PackBitsDecode;
|
||||
tif->tif_preencode = PackBitsPreEncode;
|
||||
tif->tif_postencode = PackBitsPostEncode;
|
||||
tif->tif_encoderow = PackBitsEncode;
|
||||
tif->tif_encodestrip = PackBitsEncodeChunk;
|
||||
tif->tif_encodetile = PackBitsEncodeChunk;
|
||||
return (1);
|
||||
}
|
||||
#endif /* PACKBITS_SUPPORT */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#ifndef _TIFFPREDICT_
|
||||
#define _TIFFPREDICT_
|
||||
#define _TIFFPREDICT_
|
||||
|
||||
#include "tiffio.h"
|
||||
#include "tiffiop.h"
|
||||
@@ -32,40 +32,42 @@
|
||||
* ``Library-private'' Support for the Predictor Tag
|
||||
*/
|
||||
|
||||
typedef int (*TIFFEncodeDecodeMethod)(TIFF* tif, uint8_t* buf, tmsize_t size);
|
||||
typedef int (*TIFFEncodeDecodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
|
||||
|
||||
/*
|
||||
* Codecs that want to support the Predictor tag must place
|
||||
* this structure first in their private state block so that
|
||||
* the predictor code can cast tif_data to find its state.
|
||||
*/
|
||||
typedef struct {
|
||||
int predictor; /* predictor tag value */
|
||||
tmsize_t stride; /* sample stride over data */
|
||||
tmsize_t rowsize; /* tile/strip row size */
|
||||
typedef struct
|
||||
{
|
||||
int predictor; /* predictor tag value */
|
||||
tmsize_t stride; /* sample stride over data */
|
||||
tmsize_t rowsize; /* tile/strip row size */
|
||||
|
||||
TIFFCodeMethod encoderow; /* parent codec encode/decode row */
|
||||
TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */
|
||||
TIFFCodeMethod encodetile; /* parent codec encode/decode tile */
|
||||
TIFFEncodeDecodeMethod encodepfunc; /* horizontal differencer */
|
||||
TIFFCodeMethod encoderow; /* parent codec encode/decode row */
|
||||
TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */
|
||||
TIFFCodeMethod encodetile; /* parent codec encode/decode tile */
|
||||
TIFFEncodeDecodeMethod encodepfunc; /* horizontal differencer */
|
||||
|
||||
TIFFCodeMethod decoderow; /* parent codec encode/decode row */
|
||||
TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */
|
||||
TIFFCodeMethod decodetile; /* parent codec encode/decode tile */
|
||||
TIFFEncodeDecodeMethod decodepfunc; /* horizontal accumulator */
|
||||
TIFFCodeMethod decoderow; /* parent codec encode/decode row */
|
||||
TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */
|
||||
TIFFCodeMethod decodetile; /* parent codec encode/decode tile */
|
||||
TIFFEncodeDecodeMethod decodepfunc; /* horizontal accumulator */
|
||||
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
TIFFPrintMethod printdir; /* super-class method */
|
||||
TIFFBoolMethod setupdecode; /* super-class method */
|
||||
TIFFBoolMethod setupencode; /* super-class method */
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
TIFFPrintMethod printdir; /* super-class method */
|
||||
TIFFBoolMethod setupdecode; /* super-class method */
|
||||
TIFFBoolMethod setupencode; /* super-class method */
|
||||
} TIFFPredictorState;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
extern int TIFFPredictorInit(TIFF*);
|
||||
extern int TIFFPredictorCleanup(TIFF*);
|
||||
extern int TIFFPredictorInit(TIFF *);
|
||||
extern int TIFFPredictorCleanup(TIFF *);
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
1283
libtiff/tif_print.c
1283
libtiff/tif_print.c
File diff suppressed because it is too large
Load Diff
2402
libtiff/tif_read.c
2402
libtiff/tif_read.c
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1996 Sam Leffler
|
||||
* Copyright (c) 1991-1996 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -74,345 +74,331 @@ using namespace std;
|
||||
struct tiffis_data;
|
||||
struct tiffos_data;
|
||||
|
||||
extern "C" {
|
||||
|
||||
static tmsize_t _tiffosReadProc(thandle_t, void*, tmsize_t);
|
||||
static tmsize_t _tiffisReadProc(thandle_t fd, void* buf, tmsize_t size);
|
||||
static tmsize_t _tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size);
|
||||
static tmsize_t _tiffisWriteProc(thandle_t, void*, tmsize_t);
|
||||
static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||
static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||
static uint64_t _tiffosSizeProc(thandle_t fd);
|
||||
static uint64_t _tiffisSizeProc(thandle_t fd);
|
||||
static int _tiffosCloseProc(thandle_t fd);
|
||||
static int _tiffisCloseProc(thandle_t fd);
|
||||
static int _tiffDummyMapProc(thandle_t , void** base, toff_t* size );
|
||||
static void _tiffDummyUnmapProc(thandle_t , void* base, toff_t size );
|
||||
static TIFF* _tiffStreamOpen(const char* name, const char* mode, void *fd);
|
||||
|
||||
struct tiffis_data
|
||||
extern "C"
|
||||
{
|
||||
istream *stream;
|
||||
|
||||
static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t);
|
||||
static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size);
|
||||
static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size);
|
||||
static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t);
|
||||
static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||
static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||
static uint64_t _tiffosSizeProc(thandle_t fd);
|
||||
static uint64_t _tiffisSizeProc(thandle_t fd);
|
||||
static int _tiffosCloseProc(thandle_t fd);
|
||||
static int _tiffisCloseProc(thandle_t fd);
|
||||
static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size);
|
||||
static void _tiffDummyUnmapProc(thandle_t, void *base, toff_t size);
|
||||
static TIFF *_tiffStreamOpen(const char *name, const char *mode, void *fd);
|
||||
|
||||
struct tiffis_data
|
||||
{
|
||||
istream *stream;
|
||||
ios::pos_type start_pos;
|
||||
};
|
||||
};
|
||||
|
||||
struct tiffos_data
|
||||
{
|
||||
ostream *stream;
|
||||
ios::pos_type start_pos;
|
||||
};
|
||||
struct tiffos_data
|
||||
{
|
||||
ostream *stream;
|
||||
ios::pos_type start_pos;
|
||||
};
|
||||
|
||||
static tmsize_t
|
||||
_tiffosReadProc(thandle_t, void*, tmsize_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t) { return 0; }
|
||||
|
||||
static tmsize_t
|
||||
_tiffisReadProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
|
||||
// Verify that type does not overflow.
|
||||
streamsize request_size = size;
|
||||
if (static_cast<tmsize_t>(request_size) != size)
|
||||
return static_cast<tmsize_t>(-1);
|
||||
return static_cast<tmsize_t>(-1);
|
||||
|
||||
data->stream->read((char *) buf, request_size);
|
||||
data->stream->read((char *)buf, request_size);
|
||||
|
||||
return static_cast<tmsize_t>(data->stream->gcount());
|
||||
}
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
_tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
ios::pos_type pos = os->tellp();
|
||||
static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
ios::pos_type pos = os->tellp();
|
||||
|
||||
// Verify that type does not overflow.
|
||||
streamsize request_size = size;
|
||||
if (static_cast<tmsize_t>(request_size) != size)
|
||||
return static_cast<tmsize_t>(-1);
|
||||
return static_cast<tmsize_t>(-1);
|
||||
|
||||
os->write(reinterpret_cast<const char *>(buf), request_size);
|
||||
os->write(reinterpret_cast<const char *>(buf), request_size);
|
||||
|
||||
return static_cast<tmsize_t>(os->tellp() - pos);
|
||||
}
|
||||
return static_cast<tmsize_t>(os->tellp() - pos);
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
_tiffisWriteProc(thandle_t, void*, tmsize_t)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t) { return 0; }
|
||||
|
||||
static uint64_t
|
||||
_tiffosSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
|
||||
// if the stream has already failed, don't do anything
|
||||
if( os->fail() )
|
||||
return static_cast<uint64_t>(-1);
|
||||
// if the stream has already failed, don't do anything
|
||||
if (os->fail())
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
switch(whence) {
|
||||
case SEEK_SET:
|
||||
{
|
||||
// Compute 64-bit offset
|
||||
uint64_t new_offset = static_cast<uint64_t>(data->start_pos) + off;
|
||||
switch (whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
{
|
||||
// Compute 64-bit offset
|
||||
uint64_t new_offset =
|
||||
static_cast<uint64_t>(data->start_pos) + off;
|
||||
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||
if (static_cast<uint64_t>(offset) != new_offset)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
os->seekp(offset, ios::beg);
|
||||
break;
|
||||
}
|
||||
case SEEK_CUR:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||
if (static_cast<uint64_t>(offset) != new_offset)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
os->seekp(offset, ios::cur);
|
||||
break;
|
||||
}
|
||||
case SEEK_END:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
os->seekp(offset, ios::beg);
|
||||
break;
|
||||
}
|
||||
case SEEK_CUR:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
os->seekp(offset, ios::end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
os->seekp(offset, ios::cur);
|
||||
break;
|
||||
}
|
||||
case SEEK_END:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
// Attempt to workaround problems with seeking past the end of the
|
||||
// stream. ofstream doesn't have a problem with this but
|
||||
// ostrstream/ostringstream does. In that situation, add intermediate
|
||||
// '\0' characters.
|
||||
if( os->fail() ) {
|
||||
ios::iostate old_state;
|
||||
ios::pos_type origin;
|
||||
os->seekp(offset, ios::end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
old_state = os->rdstate();
|
||||
// reset the fail bit or else tellp() won't work below
|
||||
os->clear(os->rdstate() & ~ios::failbit);
|
||||
switch( whence ) {
|
||||
case SEEK_SET:
|
||||
default:
|
||||
origin = data->start_pos;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
origin = os->tellp();
|
||||
break;
|
||||
case SEEK_END:
|
||||
os->seekp(0, ios::end);
|
||||
origin = os->tellp();
|
||||
break;
|
||||
}
|
||||
// restore original stream state
|
||||
os->clear(old_state);
|
||||
// Attempt to workaround problems with seeking past the end of the
|
||||
// stream. ofstream doesn't have a problem with this but
|
||||
// ostrstream/ostringstream does. In that situation, add intermediate
|
||||
// '\0' characters.
|
||||
if (os->fail())
|
||||
{
|
||||
ios::iostate old_state;
|
||||
ios::pos_type origin;
|
||||
|
||||
// only do something if desired seek position is valid
|
||||
if((static_cast<uint64_t>(origin) + off) > static_cast<uint64_t>(data->start_pos) ) {
|
||||
uint64_t num_fill;
|
||||
old_state = os->rdstate();
|
||||
// reset the fail bit or else tellp() won't work below
|
||||
os->clear(os->rdstate() & ~ios::failbit);
|
||||
switch (whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
default:
|
||||
origin = data->start_pos;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
origin = os->tellp();
|
||||
break;
|
||||
case SEEK_END:
|
||||
os->seekp(0, ios::end);
|
||||
origin = os->tellp();
|
||||
break;
|
||||
}
|
||||
// restore original stream state
|
||||
os->clear(old_state);
|
||||
|
||||
// clear the fail bit
|
||||
os->clear(os->rdstate() & ~ios::failbit);
|
||||
// only do something if desired seek position is valid
|
||||
if ((static_cast<uint64_t>(origin) + off) >
|
||||
static_cast<uint64_t>(data->start_pos))
|
||||
{
|
||||
uint64_t num_fill;
|
||||
|
||||
// extend the stream to the expected size
|
||||
os->seekp(0, ios::end);
|
||||
num_fill = (static_cast<uint64_t>(origin)) + off - os->tellp();
|
||||
for(uint64_t i = 0; i < num_fill; i++ )
|
||||
os->put('\0');
|
||||
// clear the fail bit
|
||||
os->clear(os->rdstate() & ~ios::failbit);
|
||||
|
||||
// retry the seek
|
||||
os->seekp(static_cast<ios::off_type>(static_cast<uint64_t>(origin) + off), ios::beg);
|
||||
}
|
||||
}
|
||||
// extend the stream to the expected size
|
||||
os->seekp(0, ios::end);
|
||||
num_fill = (static_cast<uint64_t>(origin)) + off - os->tellp();
|
||||
for (uint64_t i = 0; i < num_fill; i++)
|
||||
os->put('\0');
|
||||
|
||||
return static_cast<uint64_t>(os->tellp());
|
||||
}
|
||||
// retry the seek
|
||||
os->seekp(static_cast<ios::off_type>(
|
||||
static_cast<uint64_t>(origin) + off),
|
||||
ios::beg);
|
||||
}
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
_tiffisSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
return static_cast<uint64_t>(os->tellp());
|
||||
}
|
||||
|
||||
switch(whence) {
|
||||
case SEEK_SET:
|
||||
{
|
||||
// Compute 64-bit offset
|
||||
uint64_t new_offset = static_cast<uint64_t>(data->start_pos) + off;
|
||||
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||
if (static_cast<uint64_t>(offset) != new_offset)
|
||||
return static_cast<uint64_t>(-1);
|
||||
static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
|
||||
data->stream->seekg(offset, ios::beg);
|
||||
break;
|
||||
}
|
||||
case SEEK_CUR:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
switch (whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
{
|
||||
// Compute 64-bit offset
|
||||
uint64_t new_offset =
|
||||
static_cast<uint64_t>(data->start_pos) + off;
|
||||
|
||||
data->stream->seekg(offset, ios::cur);
|
||||
break;
|
||||
}
|
||||
case SEEK_END:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||
if (static_cast<uint64_t>(offset) != new_offset)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
data->stream->seekg(offset, ios::end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
data->stream->seekg(offset, ios::beg);
|
||||
break;
|
||||
}
|
||||
case SEEK_CUR:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
return (uint64_t) (data->stream->tellg() - data->start_pos);
|
||||
}
|
||||
data->stream->seekg(offset, ios::cur);
|
||||
break;
|
||||
}
|
||||
case SEEK_END:
|
||||
{
|
||||
// Verify that value does not overflow
|
||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||
if (static_cast<uint64_t>(offset) != off)
|
||||
return static_cast<uint64_t>(-1);
|
||||
|
||||
static uint64_t
|
||||
_tiffosSizeProc(thandle_t fd)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
ios::pos_type pos = os->tellp();
|
||||
ios::pos_type len;
|
||||
data->stream->seekg(offset, ios::end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
os->seekp(0, ios::end);
|
||||
len = os->tellp();
|
||||
os->seekp(pos);
|
||||
return (uint64_t)(data->stream->tellg() - data->start_pos);
|
||||
}
|
||||
|
||||
return (uint64_t) len;
|
||||
}
|
||||
static uint64_t _tiffosSizeProc(thandle_t fd)
|
||||
{
|
||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||
ostream *os = data->stream;
|
||||
ios::pos_type pos = os->tellp();
|
||||
ios::pos_type len;
|
||||
|
||||
static uint64_t
|
||||
_tiffisSizeProc(thandle_t fd)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
ios::pos_type pos = data->stream->tellg();
|
||||
ios::pos_type len;
|
||||
os->seekp(0, ios::end);
|
||||
len = os->tellp();
|
||||
os->seekp(pos);
|
||||
|
||||
data->stream->seekg(0, ios::end);
|
||||
len = data->stream->tellg();
|
||||
data->stream->seekg(pos);
|
||||
return (uint64_t)len;
|
||||
}
|
||||
|
||||
return (uint64_t) len;
|
||||
}
|
||||
static uint64_t _tiffisSizeProc(thandle_t fd)
|
||||
{
|
||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||
ios::pos_type pos = data->stream->tellg();
|
||||
ios::pos_type len;
|
||||
|
||||
static int
|
||||
_tiffosCloseProc(thandle_t fd)
|
||||
{
|
||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||
delete reinterpret_cast<tiffos_data *>(fd);
|
||||
return 0;
|
||||
}
|
||||
data->stream->seekg(0, ios::end);
|
||||
len = data->stream->tellg();
|
||||
data->stream->seekg(pos);
|
||||
|
||||
static int
|
||||
_tiffisCloseProc(thandle_t fd)
|
||||
{
|
||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||
delete reinterpret_cast<tiffis_data *>(fd);
|
||||
return 0;
|
||||
}
|
||||
return (uint64_t)len;
|
||||
}
|
||||
|
||||
static int
|
||||
_tiffDummyMapProc(thandle_t , void** base, toff_t* size )
|
||||
{
|
||||
(void) base;
|
||||
(void) size;
|
||||
return (0);
|
||||
}
|
||||
static int _tiffosCloseProc(thandle_t fd)
|
||||
{
|
||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||
delete reinterpret_cast<tiffos_data *>(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
_tiffDummyUnmapProc(thandle_t , void* base, toff_t size )
|
||||
{
|
||||
(void) base;
|
||||
(void) size;
|
||||
}
|
||||
static int _tiffisCloseProc(thandle_t fd)
|
||||
{
|
||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||
delete reinterpret_cast<tiffis_data *>(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Open a TIFF file descriptor for read/writing.
|
||||
*/
|
||||
static TIFF*
|
||||
_tiffStreamOpen(const char* name, const char* mode, void *fd)
|
||||
{
|
||||
TIFF* tif;
|
||||
static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size)
|
||||
{
|
||||
(void)base;
|
||||
(void)size;
|
||||
return (0);
|
||||
}
|
||||
|
||||
if( strchr(mode, 'w') ) {
|
||||
tiffos_data *data = new tiffos_data;
|
||||
data->stream = reinterpret_cast<ostream *>(fd);
|
||||
data->start_pos = data->stream->tellp();
|
||||
static void _tiffDummyUnmapProc(thandle_t, void *base, toff_t size)
|
||||
{
|
||||
(void)base;
|
||||
(void)size;
|
||||
}
|
||||
|
||||
// Open for writing.
|
||||
tif = TIFFClientOpen(name, mode,
|
||||
reinterpret_cast<thandle_t>(data),
|
||||
_tiffosReadProc,
|
||||
_tiffosWriteProc,
|
||||
_tiffosSeekProc,
|
||||
_tiffosCloseProc,
|
||||
_tiffosSizeProc,
|
||||
_tiffDummyMapProc,
|
||||
_tiffDummyUnmapProc);
|
||||
if (!tif) {
|
||||
delete data;
|
||||
}
|
||||
} else {
|
||||
tiffis_data *data = new tiffis_data;
|
||||
data->stream = reinterpret_cast<istream *>(fd);
|
||||
data->start_pos = data->stream->tellg();
|
||||
// Open for reading.
|
||||
tif = TIFFClientOpen(name, mode,
|
||||
reinterpret_cast<thandle_t>(data),
|
||||
_tiffisReadProc,
|
||||
_tiffisWriteProc,
|
||||
_tiffisSeekProc,
|
||||
_tiffisCloseProc,
|
||||
_tiffisSizeProc,
|
||||
_tiffDummyMapProc,
|
||||
_tiffDummyUnmapProc);
|
||||
if (!tif) {
|
||||
delete data;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Open a TIFF file descriptor for read/writing.
|
||||
*/
|
||||
static TIFF *_tiffStreamOpen(const char *name, const char *mode, void *fd)
|
||||
{
|
||||
TIFF *tif;
|
||||
|
||||
return (tif);
|
||||
}
|
||||
if (strchr(mode, 'w'))
|
||||
{
|
||||
tiffos_data *data = new tiffos_data;
|
||||
data->stream = reinterpret_cast<ostream *>(fd);
|
||||
data->start_pos = data->stream->tellp();
|
||||
|
||||
// Open for writing.
|
||||
tif = TIFFClientOpen(
|
||||
name, mode, reinterpret_cast<thandle_t>(data), _tiffosReadProc,
|
||||
_tiffosWriteProc, _tiffosSeekProc, _tiffosCloseProc,
|
||||
_tiffosSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
|
||||
if (!tif)
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tiffis_data *data = new tiffis_data;
|
||||
data->stream = reinterpret_cast<istream *>(fd);
|
||||
data->start_pos = data->stream->tellg();
|
||||
// Open for reading.
|
||||
tif = TIFFClientOpen(
|
||||
name, mode, reinterpret_cast<thandle_t>(data), _tiffisReadProc,
|
||||
_tiffisWriteProc, _tiffisSeekProc, _tiffisCloseProc,
|
||||
_tiffisSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
|
||||
if (!tif)
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
}
|
||||
|
||||
return (tif);
|
||||
}
|
||||
|
||||
} /* extern "C" */
|
||||
|
||||
TIFF*
|
||||
TIFFStreamOpen(const char* name, ostream *os)
|
||||
TIFF *TIFFStreamOpen(const char *name, ostream *os)
|
||||
{
|
||||
// If os is either a ostrstream or ostringstream, and has no data
|
||||
// written to it yet, then tellp() will return -1 which will break us.
|
||||
// We workaround this by writing out a dummy character and
|
||||
// then seek back to the beginning.
|
||||
if( !os->fail() && static_cast<int>(os->tellp()) < 0 ) {
|
||||
*os << '\0';
|
||||
os->seekp(0);
|
||||
}
|
||||
// If os is either a ostrstream or ostringstream, and has no data
|
||||
// written to it yet, then tellp() will return -1 which will break us.
|
||||
// We workaround this by writing out a dummy character and
|
||||
// then seek back to the beginning.
|
||||
if (!os->fail() && static_cast<int>(os->tellp()) < 0)
|
||||
{
|
||||
*os << '\0';
|
||||
os->seekp(0);
|
||||
}
|
||||
|
||||
// NB: We don't support mapped files with streams so add 'm'
|
||||
return _tiffStreamOpen(name, "wm", os);
|
||||
// NB: We don't support mapped files with streams so add 'm'
|
||||
return _tiffStreamOpen(name, "wm", os);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFStreamOpen(const char* name, istream *is)
|
||||
TIFF *TIFFStreamOpen(const char *name, istream *is)
|
||||
{
|
||||
// NB: We don't support mapped files with streams so add 'm'
|
||||
return _tiffStreamOpen(name, "rm", is);
|
||||
// NB: We don't support mapped files with streams so add 'm'
|
||||
return _tiffStreamOpen(name, "rm", is);
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -32,146 +32,145 @@
|
||||
/*
|
||||
* Compute which strip a (row,sample) value is in.
|
||||
*/
|
||||
uint32_t
|
||||
TIFFComputeStrip(TIFF* tif, uint32_t row, uint16_t sample)
|
||||
uint32_t TIFFComputeStrip(TIFF *tif, uint32_t row, uint16_t sample)
|
||||
{
|
||||
static const char module[] = "TIFFComputeStrip";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t strip;
|
||||
static const char module[] = "TIFFComputeStrip";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t strip;
|
||||
|
||||
strip = row / td->td_rowsperstrip;
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
||||
if (sample >= td->td_samplesperpixel) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"%lu: Sample out of range, max %lu",
|
||||
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
|
||||
return (0);
|
||||
}
|
||||
strip += (uint32_t)sample * td->td_stripsperimage;
|
||||
}
|
||||
return (strip);
|
||||
strip = row / td->td_rowsperstrip;
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
{
|
||||
if (sample >= td->td_samplesperpixel)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "%lu: Sample out of range, max %lu",
|
||||
(unsigned long)sample,
|
||||
(unsigned long)td->td_samplesperpixel);
|
||||
return (0);
|
||||
}
|
||||
strip += (uint32_t)sample * td->td_stripsperimage;
|
||||
}
|
||||
return (strip);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute how many strips are in an image.
|
||||
*/
|
||||
uint32_t
|
||||
TIFFNumberOfStrips(TIFF* tif)
|
||||
uint32_t TIFFNumberOfStrips(TIFF *tif)
|
||||
{
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t nstrips;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t nstrips;
|
||||
|
||||
nstrips = (td->td_rowsperstrip == (uint32_t) -1 ? 1 :
|
||||
TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
nstrips = _TIFFMultiply32(tif, nstrips, (uint32_t)td->td_samplesperpixel,
|
||||
"TIFFNumberOfStrips");
|
||||
return (nstrips);
|
||||
nstrips = (td->td_rowsperstrip == (uint32_t)-1
|
||||
? 1
|
||||
: TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
nstrips =
|
||||
_TIFFMultiply32(tif, nstrips, (uint32_t)td->td_samplesperpixel,
|
||||
"TIFFNumberOfStrips");
|
||||
return (nstrips);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the # bytes in a variable height, row-aligned strip.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFVStripSize64(TIFF* tif, uint32_t nrows)
|
||||
uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows)
|
||||
{
|
||||
static const char module[] = "TIFFVStripSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
if (nrows==(uint32_t)(-1))
|
||||
nrows=td->td_imagelength;
|
||||
if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&&
|
||||
(td->td_photometric == PHOTOMETRIC_YCBCR)&&
|
||||
(!isUpSampled(tif)))
|
||||
{
|
||||
/*
|
||||
* Packed YCbCr data contain one Cb+Cr for every
|
||||
* HorizontalSampling*VerticalSampling Y values.
|
||||
* Must also roundup width and height when calculating
|
||||
* since images that are not a multiple of the
|
||||
* horizontal/vertical subsampling area include
|
||||
* YCbCr data for the extended image.
|
||||
*/
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint32_t samplingblocks_ver;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
if(td->td_samplesperpixel!=3)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,
|
||||
"Invalid td_samplesperpixel value");
|
||||
return 0;
|
||||
}
|
||||
TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
|
||||
ycbcrsubsampling+1);
|
||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
|
||||
||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
|
||||
{
|
||||
TIFFErrorExtR(tif,module,
|
||||
"Invalid YCbCr subsampling (%dx%d)",
|
||||
ycbcrsubsampling[0],
|
||||
ycbcrsubsampling[1] );
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
|
||||
samplingblocks_hor=TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
|
||||
samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]);
|
||||
samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
||||
samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
|
||||
return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
|
||||
}
|
||||
else
|
||||
return(_TIFFMultiply64(tif,nrows,TIFFScanlineSize64(tif),module));
|
||||
static const char module[] = "TIFFVStripSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
if (nrows == (uint32_t)(-1))
|
||||
nrows = td->td_imagelength;
|
||||
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
||||
(td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
|
||||
{
|
||||
/*
|
||||
* Packed YCbCr data contain one Cb+Cr for every
|
||||
* HorizontalSampling*VerticalSampling Y values.
|
||||
* Must also roundup width and height when calculating
|
||||
* since images that are not a multiple of the
|
||||
* horizontal/vertical subsampling area include
|
||||
* YCbCr data for the extended image.
|
||||
*/
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint32_t samplingblocks_ver;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
if (td->td_samplesperpixel != 3)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
|
||||
return 0;
|
||||
}
|
||||
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
|
||||
ycbcrsubsampling[0] != 4) ||
|
||||
(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
|
||||
ycbcrsubsampling[1] != 4))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
|
||||
ycbcrsubsampling[0], ycbcrsubsampling[1]);
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||
samplingblocks_hor =
|
||||
TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
|
||||
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
||||
samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
|
||||
samplingblock_samples, module);
|
||||
samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
|
||||
tif, samplingrow_samples, td->td_bitspersample, module));
|
||||
return (
|
||||
_TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
|
||||
}
|
||||
else
|
||||
return (_TIFFMultiply64(tif, nrows, TIFFScanlineSize64(tif), module));
|
||||
}
|
||||
tmsize_t
|
||||
TIFFVStripSize(TIFF* tif, uint32_t nrows)
|
||||
tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows)
|
||||
{
|
||||
static const char module[] = "TIFFVStripSize";
|
||||
uint64_t m;
|
||||
m=TIFFVStripSize64(tif,nrows);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFVStripSize";
|
||||
uint64_t m;
|
||||
m = TIFFVStripSize64(tif, nrows);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the # bytes in a raw strip.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFRawStripSize64(TIFF* tif, uint32_t strip)
|
||||
uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip)
|
||||
{
|
||||
static const char module[] = "TIFFRawStripSize64";
|
||||
uint64_t bytecount = TIFFGetStrileByteCount(tif, strip);
|
||||
static const char module[] = "TIFFRawStripSize64";
|
||||
uint64_t bytecount = TIFFGetStrileByteCount(tif, strip);
|
||||
|
||||
if (bytecount == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"%"PRIu64": Invalid strip byte count, strip %lu",
|
||||
(uint64_t) bytecount,
|
||||
(unsigned long) strip);
|
||||
bytecount = (uint64_t) -1;
|
||||
}
|
||||
if (bytecount == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"%" PRIu64 ": Invalid strip byte count, strip %lu",
|
||||
(uint64_t)bytecount, (unsigned long)strip);
|
||||
bytecount = (uint64_t)-1;
|
||||
}
|
||||
|
||||
return bytecount;
|
||||
return bytecount;
|
||||
}
|
||||
tmsize_t
|
||||
TIFFRawStripSize(TIFF* tif, uint32_t strip)
|
||||
tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip)
|
||||
{
|
||||
static const char module[] = "TIFFRawStripSize";
|
||||
uint64_t m;
|
||||
tmsize_t n;
|
||||
m=TIFFRawStripSize64(tif,strip);
|
||||
if (m==(uint64_t)(-1))
|
||||
n=(tmsize_t)(-1);
|
||||
else
|
||||
{
|
||||
n=(tmsize_t)m;
|
||||
if ((uint64_t)n != m)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Integer overflow");
|
||||
n=0;
|
||||
}
|
||||
}
|
||||
return(n);
|
||||
static const char module[] = "TIFFRawStripSize";
|
||||
uint64_t m;
|
||||
tmsize_t n;
|
||||
m = TIFFRawStripSize64(tif, strip);
|
||||
if (m == (uint64_t)(-1))
|
||||
n = (tmsize_t)(-1);
|
||||
else
|
||||
{
|
||||
n = (tmsize_t)m;
|
||||
if ((uint64_t)n != m)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Integer overflow");
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
return (n);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -182,22 +181,20 @@ TIFFRawStripSize(TIFF* tif, uint32_t strip)
|
||||
* truncated to reflect the actual space required
|
||||
* to hold the strip.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFStripSize64(TIFF* tif)
|
||||
uint64_t TIFFStripSize64(TIFF *tif)
|
||||
{
|
||||
TIFFDirectory* td = &tif->tif_dir;
|
||||
uint32_t rps = td->td_rowsperstrip;
|
||||
if (rps > td->td_imagelength)
|
||||
rps = td->td_imagelength;
|
||||
return (TIFFVStripSize64(tif, rps));
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t rps = td->td_rowsperstrip;
|
||||
if (rps > td->td_imagelength)
|
||||
rps = td->td_imagelength;
|
||||
return (TIFFVStripSize64(tif, rps));
|
||||
}
|
||||
tmsize_t
|
||||
TIFFStripSize(TIFF* tif)
|
||||
tmsize_t TIFFStripSize(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFStripSize";
|
||||
uint64_t m;
|
||||
m=TIFFStripSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFStripSize";
|
||||
uint64_t m;
|
||||
m = TIFFStripSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -206,34 +203,33 @@ TIFFStripSize(TIFF* tif)
|
||||
* request is <1 then we choose a strip size according
|
||||
* to certain heuristics.
|
||||
*/
|
||||
uint32_t
|
||||
TIFFDefaultStripSize(TIFF* tif, uint32_t request)
|
||||
uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request)
|
||||
{
|
||||
return (*tif->tif_defstripsize)(tif, request);
|
||||
return (*tif->tif_defstripsize)(tif, request);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
_TIFFDefaultStripSize(TIFF* tif, uint32_t s)
|
||||
uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s)
|
||||
{
|
||||
if ((int32_t) s < 1) {
|
||||
/*
|
||||
* If RowsPerStrip is unspecified, try to break the
|
||||
* image up into strips that are approximately
|
||||
* STRIP_SIZE_DEFAULT bytes long.
|
||||
*/
|
||||
uint64_t scanlinesize;
|
||||
uint64_t rows;
|
||||
scanlinesize=TIFFScanlineSize64(tif);
|
||||
if (scanlinesize==0)
|
||||
scanlinesize=1;
|
||||
rows= (uint64_t)STRIP_SIZE_DEFAULT / scanlinesize;
|
||||
if (rows==0)
|
||||
rows=1;
|
||||
else if (rows>0xFFFFFFFF)
|
||||
rows=0xFFFFFFFF;
|
||||
s=(uint32_t)rows;
|
||||
}
|
||||
return (s);
|
||||
if ((int32_t)s < 1)
|
||||
{
|
||||
/*
|
||||
* If RowsPerStrip is unspecified, try to break the
|
||||
* image up into strips that are approximately
|
||||
* STRIP_SIZE_DEFAULT bytes long.
|
||||
*/
|
||||
uint64_t scanlinesize;
|
||||
uint64_t rows;
|
||||
scanlinesize = TIFFScanlineSize64(tif);
|
||||
if (scanlinesize == 0)
|
||||
scanlinesize = 1;
|
||||
rows = (uint64_t)STRIP_SIZE_DEFAULT / scanlinesize;
|
||||
if (rows == 0)
|
||||
rows = 1;
|
||||
else if (rows > 0xFFFFFFFF)
|
||||
rows = 0xFFFFFFFF;
|
||||
s = (uint32_t)rows;
|
||||
}
|
||||
return (s);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -246,70 +242,79 @@ _TIFFDefaultStripSize(TIFF* tif, uint32_t s)
|
||||
* subsampling lines divided by vertical subsampling. It should thus make
|
||||
* sense when multiplied by a multiple of vertical subsampling.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFScanlineSize64(TIFF* tif)
|
||||
uint64_t TIFFScanlineSize64(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFScanlineSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t scanline_size;
|
||||
if (td->td_planarconfig==PLANARCONFIG_CONTIG)
|
||||
{
|
||||
if ((td->td_photometric==PHOTOMETRIC_YCBCR)&&
|
||||
(td->td_samplesperpixel==3)&&
|
||||
(!isUpSampled(tif)))
|
||||
{
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
if(td->td_samplesperpixel!=3)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,
|
||||
"Invalid td_samplesperpixel value");
|
||||
return 0;
|
||||
}
|
||||
TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,
|
||||
ycbcrsubsampling+0,
|
||||
ycbcrsubsampling+1);
|
||||
if (((ycbcrsubsampling[0]!=1)&&(ycbcrsubsampling[0]!=2)&&(ycbcrsubsampling[0]!=4)) ||
|
||||
((ycbcrsubsampling[1]!=1)&&(ycbcrsubsampling[1]!=2)&&(ycbcrsubsampling[1]!=4)))
|
||||
{
|
||||
TIFFErrorExtR(tif,module,
|
||||
"Invalid YCbCr subsampling");
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples = ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
|
||||
samplingblocks_hor = TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
|
||||
samplingrow_samples = _TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
||||
samplingrow_size = TIFFhowmany_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module),8);
|
||||
scanline_size = (samplingrow_size/ycbcrsubsampling[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint64_t scanline_samples;
|
||||
scanline_samples=_TIFFMultiply64(tif,td->td_imagewidth,td->td_samplesperpixel,module);
|
||||
scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,scanline_samples,td->td_bitspersample,module),8);
|
||||
}
|
||||
}
|
||||
else
|
||||
static const char module[] = "TIFFScanlineSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t scanline_size;
|
||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||
{
|
||||
if ((td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
||||
(td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
|
||||
{
|
||||
scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8);
|
||||
}
|
||||
if (scanline_size == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Computed scanline size is zero");
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
if (td->td_samplesperpixel != 3)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
|
||||
return 0;
|
||||
}
|
||||
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||
if (((ycbcrsubsampling[0] != 1) && (ycbcrsubsampling[0] != 2) &&
|
||||
(ycbcrsubsampling[0] != 4)) ||
|
||||
((ycbcrsubsampling[1] != 1) && (ycbcrsubsampling[1] != 2) &&
|
||||
(ycbcrsubsampling[1] != 4)))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling");
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples =
|
||||
ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||
samplingblocks_hor =
|
||||
TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
|
||||
samplingrow_samples = _TIFFMultiply64(
|
||||
tif, samplingblocks_hor, samplingblock_samples, module);
|
||||
samplingrow_size =
|
||||
TIFFhowmany_64(_TIFFMultiply64(tif, samplingrow_samples,
|
||||
td->td_bitspersample, module),
|
||||
8);
|
||||
scanline_size = (samplingrow_size / ycbcrsubsampling[1]);
|
||||
}
|
||||
return(scanline_size);
|
||||
else
|
||||
{
|
||||
uint64_t scanline_samples;
|
||||
scanline_samples = _TIFFMultiply64(tif, td->td_imagewidth,
|
||||
td->td_samplesperpixel, module);
|
||||
scanline_size =
|
||||
TIFFhowmany_64(_TIFFMultiply64(tif, scanline_samples,
|
||||
td->td_bitspersample, module),
|
||||
8);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
scanline_size =
|
||||
TIFFhowmany_64(_TIFFMultiply64(tif, td->td_imagewidth,
|
||||
td->td_bitspersample, module),
|
||||
8);
|
||||
}
|
||||
if (scanline_size == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Computed scanline size is zero");
|
||||
return 0;
|
||||
}
|
||||
return (scanline_size);
|
||||
}
|
||||
tmsize_t
|
||||
TIFFScanlineSize(TIFF* tif)
|
||||
tmsize_t TIFFScanlineSize(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFScanlineSize";
|
||||
uint64_t m;
|
||||
m=TIFFScanlineSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFScanlineSize";
|
||||
uint64_t m;
|
||||
m = TIFFScanlineSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -318,26 +323,28 @@ TIFFScanlineSize(TIFF* tif)
|
||||
* I/O size returned by TIFFScanlineSize which may be less
|
||||
* if data is store as separate planes).
|
||||
*/
|
||||
uint64_t
|
||||
TIFFRasterScanlineSize64(TIFF* tif)
|
||||
uint64_t TIFFRasterScanlineSize64(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFRasterScanlineSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t scanline;
|
||||
static const char module[] = "TIFFRasterScanlineSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t scanline;
|
||||
|
||||
scanline = _TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
|
||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
||||
scanline = _TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
|
||||
return (TIFFhowmany8_64(scanline));
|
||||
} else
|
||||
return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
|
||||
td->td_samplesperpixel, module));
|
||||
scanline =
|
||||
_TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
|
||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||
{
|
||||
scanline =
|
||||
_TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
|
||||
return (TIFFhowmany8_64(scanline));
|
||||
}
|
||||
else
|
||||
return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
|
||||
td->td_samplesperpixel, module));
|
||||
}
|
||||
tmsize_t
|
||||
TIFFRasterScanlineSize(TIFF* tif)
|
||||
tmsize_t TIFFRasterScanlineSize(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFRasterScanlineSize";
|
||||
uint64_t m;
|
||||
m=TIFFRasterScanlineSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFRasterScanlineSize";
|
||||
uint64_t m;
|
||||
m = TIFFRasterScanlineSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -30,169 +30,218 @@
|
||||
#include "tiffiop.h"
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabShort)
|
||||
void
|
||||
TIFFSwabShort(uint16_t* wp)
|
||||
void TIFFSwabShort(uint16_t *wp)
|
||||
{
|
||||
register unsigned char* cp = (unsigned char*) wp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint16_t) == 2);
|
||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
||||
register unsigned char *cp = (unsigned char *)wp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint16_t) == 2);
|
||||
t = cp[1];
|
||||
cp[1] = cp[0];
|
||||
cp[0] = t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong)
|
||||
void
|
||||
TIFFSwabLong(uint32_t* lp)
|
||||
void TIFFSwabLong(uint32_t *lp)
|
||||
{
|
||||
register unsigned char* cp = (unsigned char*) lp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint32_t) == 4);
|
||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
||||
register unsigned char *cp = (unsigned char *)lp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint32_t) == 4);
|
||||
t = cp[3];
|
||||
cp[3] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[2];
|
||||
cp[2] = cp[1];
|
||||
cp[1] = t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong8)
|
||||
void
|
||||
TIFFSwabLong8(uint64_t* lp)
|
||||
void TIFFSwabLong8(uint64_t *lp)
|
||||
{
|
||||
register unsigned char* cp = (unsigned char*) lp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint64_t) == 8);
|
||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
||||
register unsigned char *cp = (unsigned char *)lp;
|
||||
unsigned char t;
|
||||
assert(sizeof(uint64_t) == 8);
|
||||
t = cp[7];
|
||||
cp[7] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[6];
|
||||
cp[6] = cp[1];
|
||||
cp[1] = t;
|
||||
t = cp[5];
|
||||
cp[5] = cp[2];
|
||||
cp[2] = t;
|
||||
t = cp[4];
|
||||
cp[4] = cp[3];
|
||||
cp[3] = t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfShort)
|
||||
void
|
||||
TIFFSwabArrayOfShort(register uint16_t* wp, tmsize_t n)
|
||||
void TIFFSwabArrayOfShort(register uint16_t *wp, tmsize_t n)
|
||||
{
|
||||
register unsigned char* cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint16_t) == 2);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char*) wp;
|
||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
||||
wp++;
|
||||
}
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint16_t) == 2);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)wp;
|
||||
t = cp[1];
|
||||
cp[1] = cp[0];
|
||||
cp[0] = t;
|
||||
wp++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfTriples)
|
||||
void
|
||||
TIFFSwabArrayOfTriples(register uint8_t* tp, tmsize_t n)
|
||||
void TIFFSwabArrayOfTriples(register uint8_t *tp, tmsize_t n)
|
||||
{
|
||||
unsigned char* cp;
|
||||
unsigned char t;
|
||||
unsigned char *cp;
|
||||
unsigned char t;
|
||||
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char*) tp;
|
||||
t = cp[2]; cp[2] = cp[0]; cp[0] = t;
|
||||
tp += 3;
|
||||
}
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)tp;
|
||||
t = cp[2];
|
||||
cp[2] = cp[0];
|
||||
cp[0] = t;
|
||||
tp += 3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong)
|
||||
void
|
||||
TIFFSwabArrayOfLong(register uint32_t* lp, tmsize_t n)
|
||||
void TIFFSwabArrayOfLong(register uint32_t *lp, tmsize_t n)
|
||||
{
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint32_t) == 4);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char *)lp;
|
||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
||||
lp++;
|
||||
}
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint32_t) == 4);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)lp;
|
||||
t = cp[3];
|
||||
cp[3] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[2];
|
||||
cp[2] = cp[1];
|
||||
cp[1] = t;
|
||||
lp++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong8)
|
||||
void
|
||||
TIFFSwabArrayOfLong8(register uint64_t* lp, tmsize_t n)
|
||||
void TIFFSwabArrayOfLong8(register uint64_t *lp, tmsize_t n)
|
||||
{
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint64_t) == 8);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char *)lp;
|
||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
||||
lp++;
|
||||
}
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(uint64_t) == 8);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)lp;
|
||||
t = cp[7];
|
||||
cp[7] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[6];
|
||||
cp[6] = cp[1];
|
||||
cp[1] = t;
|
||||
t = cp[5];
|
||||
cp[5] = cp[2];
|
||||
cp[2] = t;
|
||||
t = cp[4];
|
||||
cp[4] = cp[3];
|
||||
cp[3] = t;
|
||||
lp++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabFloat)
|
||||
void
|
||||
TIFFSwabFloat(float* fp)
|
||||
void TIFFSwabFloat(float *fp)
|
||||
{
|
||||
register unsigned char* cp = (unsigned char*) fp;
|
||||
unsigned char t;
|
||||
assert(sizeof(float)==4);
|
||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
||||
register unsigned char *cp = (unsigned char *)fp;
|
||||
unsigned char t;
|
||||
assert(sizeof(float) == 4);
|
||||
t = cp[3];
|
||||
cp[3] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[2];
|
||||
cp[2] = cp[1];
|
||||
cp[1] = t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfFloat)
|
||||
void
|
||||
TIFFSwabArrayOfFloat(register float* fp, tmsize_t n)
|
||||
void TIFFSwabArrayOfFloat(register float *fp, tmsize_t n)
|
||||
{
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(float)==4);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char *)fp;
|
||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
||||
fp++;
|
||||
}
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(float) == 4);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)fp;
|
||||
t = cp[3];
|
||||
cp[3] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[2];
|
||||
cp[2] = cp[1];
|
||||
cp[1] = t;
|
||||
fp++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabDouble)
|
||||
void
|
||||
TIFFSwabDouble(double *dp)
|
||||
void TIFFSwabDouble(double *dp)
|
||||
{
|
||||
register unsigned char* cp = (unsigned char*) dp;
|
||||
unsigned char t;
|
||||
assert(sizeof(double)==8);
|
||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
||||
register unsigned char *cp = (unsigned char *)dp;
|
||||
unsigned char t;
|
||||
assert(sizeof(double) == 8);
|
||||
t = cp[7];
|
||||
cp[7] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[6];
|
||||
cp[6] = cp[1];
|
||||
cp[1] = t;
|
||||
t = cp[5];
|
||||
cp[5] = cp[2];
|
||||
cp[2] = t;
|
||||
t = cp[4];
|
||||
cp[4] = cp[3];
|
||||
cp[3] = t;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfDouble)
|
||||
void
|
||||
TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
|
||||
void TIFFSwabArrayOfDouble(double *dp, tmsize_t n)
|
||||
{
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(double)==8);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0) {
|
||||
cp = (unsigned char *)dp;
|
||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
||||
dp++;
|
||||
}
|
||||
register unsigned char *cp;
|
||||
register unsigned char t;
|
||||
assert(sizeof(double) == 8);
|
||||
/* XXX unroll loop some */
|
||||
while (n-- > 0)
|
||||
{
|
||||
cp = (unsigned char *)dp;
|
||||
t = cp[7];
|
||||
cp[7] = cp[0];
|
||||
cp[0] = t;
|
||||
t = cp[6];
|
||||
cp[6] = cp[1];
|
||||
cp[1] = t;
|
||||
t = cp[5];
|
||||
cp[5] = cp[2];
|
||||
cp[2] = t;
|
||||
t = cp[4];
|
||||
cp[4] = cp[3];
|
||||
cp[3] = t;
|
||||
dp++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -206,96 +255,75 @@ TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
|
||||
* do not reverse bit values.
|
||||
*/
|
||||
static const unsigned char TIFFBitRevTable[256] = {
|
||||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
|
||||
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
|
||||
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
||||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
|
||||
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
|
||||
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
||||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
|
||||
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
|
||||
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
||||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
|
||||
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
|
||||
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
||||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
|
||||
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
|
||||
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
||||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
|
||||
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
|
||||
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
||||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
|
||||
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
|
||||
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
||||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
|
||||
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
|
||||
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
||||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
|
||||
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
|
||||
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
||||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
|
||||
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
|
||||
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
||||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
|
||||
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
|
||||
};
|
||||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
|
||||
0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
||||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
|
||||
0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
||||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
|
||||
0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
||||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
|
||||
0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
||||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
|
||||
0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
||||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
|
||||
0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
||||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
|
||||
0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
||||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
|
||||
0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
||||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
|
||||
0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
||||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
|
||||
0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
||||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
|
||||
0x3f, 0xbf, 0x7f, 0xff};
|
||||
static const unsigned char TIFFNoBitRevTable[256] = {
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
|
||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
|
||||
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
|
||||
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
|
||||
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
|
||||
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
||||
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
||||
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
|
||||
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
||||
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
|
||||
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
||||
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
|
||||
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
|
||||
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
|
||||
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
||||
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
|
||||
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
|
||||
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
|
||||
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
|
||||
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
|
||||
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
|
||||
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
|
||||
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
|
||||
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
|
||||
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
|
||||
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
|
||||
0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
|
||||
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
|
||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
|
||||
0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
|
||||
0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
||||
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
|
||||
0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
||||
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
|
||||
0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
|
||||
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
|
||||
0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
||||
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
|
||||
0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
|
||||
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
|
||||
0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
|
||||
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
|
||||
0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
|
||||
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
|
||||
0xfc, 0xfd, 0xfe, 0xff,
|
||||
};
|
||||
|
||||
const unsigned char*
|
||||
TIFFGetBitRevTable(int reversed)
|
||||
const unsigned char *TIFFGetBitRevTable(int reversed)
|
||||
{
|
||||
return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
|
||||
return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
|
||||
}
|
||||
|
||||
void
|
||||
TIFFReverseBits(uint8_t* cp, tmsize_t n)
|
||||
void TIFFReverseBits(uint8_t *cp, tmsize_t n)
|
||||
{
|
||||
for (; n > 8; n -= 8) {
|
||||
cp[0] = TIFFBitRevTable[cp[0]];
|
||||
cp[1] = TIFFBitRevTable[cp[1]];
|
||||
cp[2] = TIFFBitRevTable[cp[2]];
|
||||
cp[3] = TIFFBitRevTable[cp[3]];
|
||||
cp[4] = TIFFBitRevTable[cp[4]];
|
||||
cp[5] = TIFFBitRevTable[cp[5]];
|
||||
cp[6] = TIFFBitRevTable[cp[6]];
|
||||
cp[7] = TIFFBitRevTable[cp[7]];
|
||||
cp += 8;
|
||||
}
|
||||
while (n-- > 0) {
|
||||
*cp = TIFFBitRevTable[*cp];
|
||||
cp++;
|
||||
}
|
||||
for (; n > 8; n -= 8)
|
||||
{
|
||||
cp[0] = TIFFBitRevTable[cp[0]];
|
||||
cp[1] = TIFFBitRevTable[cp[1]];
|
||||
cp[2] = TIFFBitRevTable[cp[2]];
|
||||
cp[3] = TIFFBitRevTable[cp[3]];
|
||||
cp[4] = TIFFBitRevTable[cp[4]];
|
||||
cp[5] = TIFFBitRevTable[cp[5]];
|
||||
cp[6] = TIFFBitRevTable[cp[6]];
|
||||
cp[7] = TIFFBitRevTable[cp[7]];
|
||||
cp += 8;
|
||||
}
|
||||
while (n-- > 0)
|
||||
{
|
||||
*cp = TIFFBitRevTable[*cp];
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -41,148 +41,158 @@
|
||||
* or 3-bit delta values are used, with the deltas packed
|
||||
* into a single byte.
|
||||
*/
|
||||
#define THUNDER_DATA 0x3f /* mask for 6-bit data */
|
||||
#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
|
||||
#define THUNDER_DATA 0x3f /* mask for 6-bit data */
|
||||
#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
|
||||
/* code values */
|
||||
#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
|
||||
#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
|
||||
#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
|
||||
#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
|
||||
#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
|
||||
#define THUNDER_RAW 0xc0 /* raw data encoded */
|
||||
#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
|
||||
#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
|
||||
#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
|
||||
#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
|
||||
#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
|
||||
#define THUNDER_RAW 0xc0 /* raw data encoded */
|
||||
|
||||
static const int twobitdeltas[4] = { 0, 1, 0, -1 };
|
||||
static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
|
||||
static const int twobitdeltas[4] = {0, 1, 0, -1};
|
||||
static const int threebitdeltas[8] = {0, 1, 2, 3, 0, -3, -2, -1};
|
||||
|
||||
#define SETPIXEL(op, v) { \
|
||||
lastpixel = (v) & 0xf; \
|
||||
if ( npixels < maxpixels ) \
|
||||
{ \
|
||||
if (npixels++ & 1) \
|
||||
*op++ |= lastpixel; \
|
||||
else \
|
||||
op[0] = (uint8_t) (lastpixel << 4); \
|
||||
} \
|
||||
#define SETPIXEL(op, v) \
|
||||
{ \
|
||||
lastpixel = (v)&0xf; \
|
||||
if (npixels < maxpixels) \
|
||||
{ \
|
||||
if (npixels++ & 1) \
|
||||
*op++ |= lastpixel; \
|
||||
else \
|
||||
op[0] = (uint8_t)(lastpixel << 4); \
|
||||
} \
|
||||
}
|
||||
|
||||
static int ThunderSetupDecode(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "ThunderSetupDecode";
|
||||
|
||||
if (tif->tif_dir.td_bitspersample != 4)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Wrong bitspersample value (%d), Thunder decoder only "
|
||||
"supports 4bits per sample.",
|
||||
(int)tif->tif_dir.td_bitspersample);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
ThunderSetupDecode(TIFF* tif)
|
||||
static int ThunderDecode(TIFF *tif, uint8_t *op, tmsize_t maxpixels)
|
||||
{
|
||||
static const char module[] = "ThunderSetupDecode";
|
||||
static const char module[] = "ThunderDecode";
|
||||
register unsigned char *bp;
|
||||
register tmsize_t cc;
|
||||
unsigned int lastpixel;
|
||||
tmsize_t npixels;
|
||||
|
||||
if( tif->tif_dir.td_bitspersample != 4 )
|
||||
bp = (unsigned char *)tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
lastpixel = 0;
|
||||
npixels = 0;
|
||||
while (cc > 0 && npixels < maxpixels)
|
||||
{
|
||||
int n, delta;
|
||||
|
||||
n = *bp++;
|
||||
cc--;
|
||||
switch (n & THUNDER_CODE)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Wrong bitspersample value (%d), Thunder decoder only supports 4bits per sample.",
|
||||
(int) tif->tif_dir.td_bitspersample );
|
||||
return 0;
|
||||
case THUNDER_RUN: /* pixel run */
|
||||
/*
|
||||
* Replicate the last pixel n times,
|
||||
* where n is the lower-order 6 bits.
|
||||
*/
|
||||
if (npixels & 1)
|
||||
{
|
||||
op[0] |= lastpixel;
|
||||
lastpixel = *op++;
|
||||
npixels++;
|
||||
n--;
|
||||
}
|
||||
else
|
||||
lastpixel |= lastpixel << 4;
|
||||
npixels += n;
|
||||
if (npixels < maxpixels)
|
||||
{
|
||||
for (; n > 0; n -= 2)
|
||||
*op++ = (uint8_t)lastpixel;
|
||||
}
|
||||
if (n == -1)
|
||||
*--op &= 0xf0;
|
||||
lastpixel &= 0xf;
|
||||
break;
|
||||
case THUNDER_2BITDELTAS: /* 2-bit deltas */
|
||||
if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op,
|
||||
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op,
|
||||
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
if ((delta = (n & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op,
|
||||
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
break;
|
||||
case THUNDER_3BITDELTAS: /* 3-bit deltas */
|
||||
if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
|
||||
SETPIXEL(
|
||||
op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||
if ((delta = (n & 7)) != DELTA3_SKIP)
|
||||
SETPIXEL(
|
||||
op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||
break;
|
||||
case THUNDER_RAW: /* raw data */
|
||||
SETPIXEL(op, n);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t *)bp;
|
||||
tif->tif_rawcc = cc;
|
||||
if (npixels != maxpixels)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"%s data at scanline %lu (%" PRIu64 " != %" PRIu64 ")",
|
||||
npixels < maxpixels ? "Not enough" : "Too much",
|
||||
(unsigned long)tif->tif_row, (uint64_t)npixels,
|
||||
(uint64_t)maxpixels);
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
ThunderDecode(TIFF* tif, uint8_t* op, tmsize_t maxpixels)
|
||||
static int ThunderDecodeRow(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ThunderDecode";
|
||||
register unsigned char *bp;
|
||||
register tmsize_t cc;
|
||||
unsigned int lastpixel;
|
||||
tmsize_t npixels;
|
||||
static const char module[] = "ThunderDecodeRow";
|
||||
uint8_t *row = buf;
|
||||
|
||||
bp = (unsigned char *)tif->tif_rawcp;
|
||||
cc = tif->tif_rawcc;
|
||||
lastpixel = 0;
|
||||
npixels = 0;
|
||||
while (cc > 0 && npixels < maxpixels) {
|
||||
int n, delta;
|
||||
|
||||
n = *bp++;
|
||||
cc--;
|
||||
switch (n & THUNDER_CODE) {
|
||||
case THUNDER_RUN: /* pixel run */
|
||||
/*
|
||||
* Replicate the last pixel n times,
|
||||
* where n is the lower-order 6 bits.
|
||||
*/
|
||||
if (npixels & 1) {
|
||||
op[0] |= lastpixel;
|
||||
lastpixel = *op++; npixels++; n--;
|
||||
} else
|
||||
lastpixel |= lastpixel << 4;
|
||||
npixels += n;
|
||||
if (npixels < maxpixels) {
|
||||
for (; n > 0; n -= 2)
|
||||
*op++ = (uint8_t) lastpixel;
|
||||
}
|
||||
if (n == -1)
|
||||
*--op &= 0xf0;
|
||||
lastpixel &= 0xf;
|
||||
break;
|
||||
case THUNDER_2BITDELTAS: /* 2-bit deltas */
|
||||
if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
if ((delta = (n & 3)) != DELTA2_SKIP)
|
||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||
break;
|
||||
case THUNDER_3BITDELTAS: /* 3-bit deltas */
|
||||
if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
|
||||
SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||
if ((delta = (n & 7)) != DELTA3_SKIP)
|
||||
SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||
break;
|
||||
case THUNDER_RAW: /* raw data */
|
||||
SETPIXEL(op, n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
tif->tif_rawcp = (uint8_t*) bp;
|
||||
tif->tif_rawcc = cc;
|
||||
if (npixels != maxpixels) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"%s data at scanline %lu (%"PRIu64" != %"PRIu64")",
|
||||
npixels < maxpixels ? "Not enough" : "Too much",
|
||||
(unsigned long) tif->tif_row,
|
||||
(uint64_t) npixels,
|
||||
(uint64_t) maxpixels);
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (1);
|
||||
(void)s;
|
||||
if (occ % tif->tif_scanlinesize)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||
return (0);
|
||||
}
|
||||
while (occ > 0)
|
||||
{
|
||||
if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
|
||||
return (0);
|
||||
occ -= tif->tif_scanlinesize;
|
||||
row += tif->tif_scanlinesize;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
ThunderDecodeRow(TIFF* tif, uint8_t* buf, tmsize_t occ, uint16_t s)
|
||||
int TIFFInitThunderScan(TIFF *tif, int scheme)
|
||||
{
|
||||
static const char module[] = "ThunderDecodeRow";
|
||||
uint8_t* row = buf;
|
||||
|
||||
(void) s;
|
||||
if (occ % tif->tif_scanlinesize)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||
return (0);
|
||||
}
|
||||
while (occ > 0) {
|
||||
if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
|
||||
return (0);
|
||||
occ -= tif->tif_scanlinesize;
|
||||
row += tif->tif_scanlinesize;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
(void)scheme;
|
||||
|
||||
int
|
||||
TIFFInitThunderScan(TIFF* tif, int scheme)
|
||||
{
|
||||
(void) scheme;
|
||||
|
||||
tif->tif_setupdecode = ThunderSetupDecode;
|
||||
tif->tif_decoderow = ThunderDecodeRow;
|
||||
tif->tif_decodestrip = ThunderDecodeRow;
|
||||
return (1);
|
||||
tif->tif_setupdecode = ThunderSetupDecode;
|
||||
tif->tif_decoderow = ThunderDecodeRow;
|
||||
tif->tif_decodestrip = ThunderDecodeRow;
|
||||
return (1);
|
||||
}
|
||||
#endif /* THUNDER_SUPPORT */
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -32,234 +32,230 @@
|
||||
/*
|
||||
* Compute which tile an (x,y,z,s) value is in.
|
||||
*/
|
||||
uint32_t
|
||||
TIFFComputeTile(TIFF* tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
|
||||
uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
|
||||
uint16_t s)
|
||||
{
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t dx = td->td_tilewidth;
|
||||
uint32_t dy = td->td_tilelength;
|
||||
uint32_t dz = td->td_tiledepth;
|
||||
uint32_t tile = 1;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t dx = td->td_tilewidth;
|
||||
uint32_t dy = td->td_tilelength;
|
||||
uint32_t dz = td->td_tiledepth;
|
||||
uint32_t tile = 1;
|
||||
|
||||
if (td->td_imagedepth == 1)
|
||||
z = 0;
|
||||
if (dx == (uint32_t) -1)
|
||||
dx = td->td_imagewidth;
|
||||
if (dy == (uint32_t) -1)
|
||||
dy = td->td_imagelength;
|
||||
if (dz == (uint32_t) -1)
|
||||
dz = td->td_imagedepth;
|
||||
if (dx != 0 && dy != 0 && dz != 0) {
|
||||
uint32_t xpt = TIFFhowmany_32(td->td_imagewidth, dx);
|
||||
uint32_t ypt = TIFFhowmany_32(td->td_imagelength, dy);
|
||||
uint32_t zpt = TIFFhowmany_32(td->td_imagedepth, dz);
|
||||
if (td->td_imagedepth == 1)
|
||||
z = 0;
|
||||
if (dx == (uint32_t)-1)
|
||||
dx = td->td_imagewidth;
|
||||
if (dy == (uint32_t)-1)
|
||||
dy = td->td_imagelength;
|
||||
if (dz == (uint32_t)-1)
|
||||
dz = td->td_imagedepth;
|
||||
if (dx != 0 && dy != 0 && dz != 0)
|
||||
{
|
||||
uint32_t xpt = TIFFhowmany_32(td->td_imagewidth, dx);
|
||||
uint32_t ypt = TIFFhowmany_32(td->td_imagelength, dy);
|
||||
uint32_t zpt = TIFFhowmany_32(td->td_imagedepth, dz);
|
||||
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
tile = (xpt*ypt*zpt)*s +
|
||||
(xpt*ypt)*(z/dz) +
|
||||
xpt*(y/dy) +
|
||||
x/dx;
|
||||
else
|
||||
tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx;
|
||||
}
|
||||
return (tile);
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
tile = (xpt * ypt * zpt) * s + (xpt * ypt) * (z / dz) +
|
||||
xpt * (y / dy) + x / dx;
|
||||
else
|
||||
tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx;
|
||||
}
|
||||
return (tile);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check an (x,y,z,s) coordinate
|
||||
* against the image bounds.
|
||||
*/
|
||||
int
|
||||
TIFFCheckTile(TIFF* tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
|
||||
int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
|
||||
{
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
|
||||
if (x >= td->td_imagewidth) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%lu: Col out of range, max %lu",
|
||||
(unsigned long) x,
|
||||
(unsigned long) (td->td_imagewidth - 1));
|
||||
return (0);
|
||||
}
|
||||
if (y >= td->td_imagelength) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%lu: Row out of range, max %lu",
|
||||
(unsigned long) y,
|
||||
(unsigned long) (td->td_imagelength - 1));
|
||||
return (0);
|
||||
}
|
||||
if (z >= td->td_imagedepth) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%lu: Depth out of range, max %lu",
|
||||
(unsigned long) z,
|
||||
(unsigned long) (td->td_imagedepth - 1));
|
||||
return (0);
|
||||
}
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
|
||||
s >= td->td_samplesperpixel) {
|
||||
TIFFErrorExtR(tif, tif->tif_name,
|
||||
"%lu: Sample out of range, max %lu",
|
||||
(unsigned long) s,
|
||||
(unsigned long) (td->td_samplesperpixel - 1));
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
if (x >= td->td_imagewidth)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%lu: Col out of range, max %lu",
|
||||
(unsigned long)x, (unsigned long)(td->td_imagewidth - 1));
|
||||
return (0);
|
||||
}
|
||||
if (y >= td->td_imagelength)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%lu: Row out of range, max %lu",
|
||||
(unsigned long)y,
|
||||
(unsigned long)(td->td_imagelength - 1));
|
||||
return (0);
|
||||
}
|
||||
if (z >= td->td_imagedepth)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%lu: Depth out of range, max %lu",
|
||||
(unsigned long)z, (unsigned long)(td->td_imagedepth - 1));
|
||||
return (0);
|
||||
}
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
|
||||
s >= td->td_samplesperpixel)
|
||||
{
|
||||
TIFFErrorExtR(tif, tif->tif_name, "%lu: Sample out of range, max %lu",
|
||||
(unsigned long)s,
|
||||
(unsigned long)(td->td_samplesperpixel - 1));
|
||||
return (0);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute how many tiles are in an image.
|
||||
*/
|
||||
uint32_t
|
||||
TIFFNumberOfTiles(TIFF* tif)
|
||||
uint32_t TIFFNumberOfTiles(TIFF *tif)
|
||||
{
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t dx = td->td_tilewidth;
|
||||
uint32_t dy = td->td_tilelength;
|
||||
uint32_t dz = td->td_tiledepth;
|
||||
uint32_t ntiles;
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint32_t dx = td->td_tilewidth;
|
||||
uint32_t dy = td->td_tilelength;
|
||||
uint32_t dz = td->td_tiledepth;
|
||||
uint32_t ntiles;
|
||||
|
||||
if (dx == (uint32_t) -1)
|
||||
dx = td->td_imagewidth;
|
||||
if (dy == (uint32_t) -1)
|
||||
dy = td->td_imagelength;
|
||||
if (dz == (uint32_t) -1)
|
||||
dz = td->td_imagedepth;
|
||||
ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
|
||||
_TIFFMultiply32(tif, _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
|
||||
TIFFhowmany_32(td->td_imagelength, dy),
|
||||
"TIFFNumberOfTiles"),
|
||||
TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel,
|
||||
"TIFFNumberOfTiles");
|
||||
return (ntiles);
|
||||
if (dx == (uint32_t)-1)
|
||||
dx = td->td_imagewidth;
|
||||
if (dy == (uint32_t)-1)
|
||||
dy = td->td_imagelength;
|
||||
if (dz == (uint32_t)-1)
|
||||
dz = td->td_imagedepth;
|
||||
ntiles =
|
||||
(dx == 0 || dy == 0 || dz == 0)
|
||||
? 0
|
||||
: _TIFFMultiply32(
|
||||
tif,
|
||||
_TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
|
||||
TIFFhowmany_32(td->td_imagelength, dy),
|
||||
"TIFFNumberOfTiles"),
|
||||
TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
|
||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||
ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel,
|
||||
"TIFFNumberOfTiles");
|
||||
return (ntiles);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the # bytes in each row of a tile.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFTileRowSize64(TIFF* tif)
|
||||
uint64_t TIFFTileRowSize64(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFTileRowSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t rowsize;
|
||||
uint64_t tilerowsize;
|
||||
static const char module[] = "TIFFTileRowSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
uint64_t rowsize;
|
||||
uint64_t tilerowsize;
|
||||
|
||||
if (td->td_tilelength == 0)
|
||||
if (td->td_tilelength == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Tile length is zero");
|
||||
return 0;
|
||||
}
|
||||
if (td->td_tilewidth == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Tile width is zero");
|
||||
return (0);
|
||||
}
|
||||
rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
|
||||
"TIFFTileRowSize");
|
||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||
{
|
||||
if (td->td_samplesperpixel == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Tile length is zero");
|
||||
return 0;
|
||||
TIFFErrorExtR(tif, module, "Samples per pixel is zero");
|
||||
return 0;
|
||||
}
|
||||
if (td->td_tilewidth == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Tile width is zero");
|
||||
return (0);
|
||||
}
|
||||
rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
|
||||
"TIFFTileRowSize");
|
||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||
{
|
||||
if (td->td_samplesperpixel == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Samples per pixel is zero");
|
||||
return 0;
|
||||
}
|
||||
rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
|
||||
"TIFFTileRowSize");
|
||||
}
|
||||
tilerowsize=TIFFhowmany8_64(rowsize);
|
||||
if (tilerowsize == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif,module,"Computed tile row size is zero");
|
||||
return 0;
|
||||
}
|
||||
return (tilerowsize);
|
||||
rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
|
||||
"TIFFTileRowSize");
|
||||
}
|
||||
tilerowsize = TIFFhowmany8_64(rowsize);
|
||||
if (tilerowsize == 0)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Computed tile row size is zero");
|
||||
return 0;
|
||||
}
|
||||
return (tilerowsize);
|
||||
}
|
||||
tmsize_t
|
||||
TIFFTileRowSize(TIFF* tif)
|
||||
tmsize_t TIFFTileRowSize(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFTileRowSize";
|
||||
uint64_t m;
|
||||
m=TIFFTileRowSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFTileRowSize";
|
||||
uint64_t m;
|
||||
m = TIFFTileRowSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the # bytes in a variable length, row-aligned tile.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFVTileSize64(TIFF* tif, uint32_t nrows)
|
||||
uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows)
|
||||
{
|
||||
static const char module[] = "TIFFVTileSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
|
||||
td->td_tiledepth == 0)
|
||||
return (0);
|
||||
if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&&
|
||||
(td->td_photometric==PHOTOMETRIC_YCBCR)&&
|
||||
(td->td_samplesperpixel==3)&&
|
||||
(!isUpSampled(tif)))
|
||||
{
|
||||
/*
|
||||
* Packed YCbCr data contain one Cb+Cr for every
|
||||
* HorizontalSampling*VerticalSampling Y values.
|
||||
* Must also roundup width and height when calculating
|
||||
* since images that are not a multiple of the
|
||||
* horizontal/vertical subsampling area include
|
||||
* YCbCr data for the extended image.
|
||||
*/
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint32_t samplingblocks_ver;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
|
||||
ycbcrsubsampling+1);
|
||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
|
||||
||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
|
||||
{
|
||||
TIFFErrorExtR(tif,module,
|
||||
"Invalid YCbCr subsampling (%dx%d)",
|
||||
ycbcrsubsampling[0],
|
||||
ycbcrsubsampling[1] );
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
|
||||
samplingblocks_hor=TIFFhowmany_32(td->td_tilewidth,ycbcrsubsampling[0]);
|
||||
samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]);
|
||||
samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
||||
samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
|
||||
return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
|
||||
}
|
||||
else
|
||||
return(_TIFFMultiply64(tif,nrows,TIFFTileRowSize64(tif),module));
|
||||
static const char module[] = "TIFFVTileSize64";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
|
||||
td->td_tiledepth == 0)
|
||||
return (0);
|
||||
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
||||
(td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
||||
(td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
|
||||
{
|
||||
/*
|
||||
* Packed YCbCr data contain one Cb+Cr for every
|
||||
* HorizontalSampling*VerticalSampling Y values.
|
||||
* Must also roundup width and height when calculating
|
||||
* since images that are not a multiple of the
|
||||
* horizontal/vertical subsampling area include
|
||||
* YCbCr data for the extended image.
|
||||
*/
|
||||
uint16_t ycbcrsubsampling[2];
|
||||
uint16_t samplingblock_samples;
|
||||
uint32_t samplingblocks_hor;
|
||||
uint32_t samplingblocks_ver;
|
||||
uint64_t samplingrow_samples;
|
||||
uint64_t samplingrow_size;
|
||||
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
|
||||
ycbcrsubsampling[0] != 4) ||
|
||||
(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
|
||||
ycbcrsubsampling[1] != 4))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
|
||||
ycbcrsubsampling[0], ycbcrsubsampling[1]);
|
||||
return 0;
|
||||
}
|
||||
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||
samplingblocks_hor =
|
||||
TIFFhowmany_32(td->td_tilewidth, ycbcrsubsampling[0]);
|
||||
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
||||
samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
|
||||
samplingblock_samples, module);
|
||||
samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
|
||||
tif, samplingrow_samples, td->td_bitspersample, module));
|
||||
return (
|
||||
_TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
|
||||
}
|
||||
else
|
||||
return (_TIFFMultiply64(tif, nrows, TIFFTileRowSize64(tif), module));
|
||||
}
|
||||
tmsize_t
|
||||
TIFFVTileSize(TIFF* tif, uint32_t nrows)
|
||||
tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows)
|
||||
{
|
||||
static const char module[] = "TIFFVTileSize";
|
||||
uint64_t m;
|
||||
m=TIFFVTileSize64(tif,nrows);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFVTileSize";
|
||||
uint64_t m;
|
||||
m = TIFFVTileSize64(tif, nrows);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the # bytes in a row-aligned tile.
|
||||
*/
|
||||
uint64_t
|
||||
TIFFTileSize64(TIFF* tif)
|
||||
uint64_t TIFFTileSize64(TIFF *tif)
|
||||
{
|
||||
return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
|
||||
return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
|
||||
}
|
||||
tmsize_t
|
||||
TIFFTileSize(TIFF* tif)
|
||||
tmsize_t TIFFTileSize(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "TIFFTileSize";
|
||||
uint64_t m;
|
||||
m=TIFFTileSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
static const char module[] = "TIFFTileSize";
|
||||
uint64_t m;
|
||||
m = TIFFTileSize64(tif);
|
||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -268,23 +264,21 @@ TIFFTileSize(TIFF* tif)
|
||||
* request is <1 then we choose a size according
|
||||
* to certain heuristics.
|
||||
*/
|
||||
void
|
||||
TIFFDefaultTileSize(TIFF* tif, uint32_t* tw, uint32_t* th)
|
||||
void TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
|
||||
{
|
||||
(*tif->tif_deftilesize)(tif, tw, th);
|
||||
(*tif->tif_deftilesize)(tif, tw, th);
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFDefaultTileSize(TIFF* tif, uint32_t* tw, uint32_t* th)
|
||||
void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
|
||||
{
|
||||
(void) tif;
|
||||
if (*(int32_t*) tw < 1)
|
||||
*tw = 256;
|
||||
if (*(int32_t*) th < 1)
|
||||
*th = 256;
|
||||
/* roundup to a multiple of 16 per the spec */
|
||||
if (*tw & 0xf)
|
||||
*tw = TIFFroundup_32(*tw, 16);
|
||||
if (*th & 0xf)
|
||||
*th = TIFFroundup_32(*th, 16);
|
||||
(void)tif;
|
||||
if (*(int32_t *)tw < 1)
|
||||
*tw = 256;
|
||||
if (*(int32_t *)th < 1)
|
||||
*th = 256;
|
||||
/* roundup to a multiple of 16 per the spec */
|
||||
if (*tw & 0xf)
|
||||
*tw = TIFFroundup_32(*tw, 16);
|
||||
if (*th & 0xf)
|
||||
*th = TIFFroundup_32(*th, 16);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include "tif_config.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
@@ -40,188 +40,175 @@
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
# include <fcntl.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_IO_H
|
||||
# include <io.h>
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#include "tiffiop.h"
|
||||
|
||||
|
||||
#define TIFF_IO_MAX 2147483647U
|
||||
|
||||
|
||||
typedef union fd_as_handle_union
|
||||
{
|
||||
int fd;
|
||||
thandle_t h;
|
||||
int fd;
|
||||
thandle_t h;
|
||||
} fd_as_handle_union_t;
|
||||
|
||||
static tmsize_t
|
||||
_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
fd_as_handle_union_t fdh;
|
||||
const size_t bytes_total = (size_t) size;
|
||||
size_t bytes_read;
|
||||
tmsize_t count = -1;
|
||||
if ((tmsize_t) bytes_total != size)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return (tmsize_t) -1;
|
||||
}
|
||||
fdh.h = fd;
|
||||
for (bytes_read=0; bytes_read < bytes_total; bytes_read+=count)
|
||||
{
|
||||
char *buf_offset = (char *) buf+bytes_read;
|
||||
size_t io_size = bytes_total-bytes_read;
|
||||
if (io_size > TIFF_IO_MAX)
|
||||
io_size = TIFF_IO_MAX;
|
||||
count=read(fdh.fd, buf_offset, (TIFFIOSize_t) io_size);
|
||||
if (count <= 0)
|
||||
break;
|
||||
}
|
||||
if (count < 0)
|
||||
return (tmsize_t)-1;
|
||||
return (tmsize_t) bytes_read;
|
||||
fd_as_handle_union_t fdh;
|
||||
const size_t bytes_total = (size_t)size;
|
||||
size_t bytes_read;
|
||||
tmsize_t count = -1;
|
||||
if ((tmsize_t)bytes_total != size)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return (tmsize_t)-1;
|
||||
}
|
||||
fdh.h = fd;
|
||||
for (bytes_read = 0; bytes_read < bytes_total; bytes_read += count)
|
||||
{
|
||||
char *buf_offset = (char *)buf + bytes_read;
|
||||
size_t io_size = bytes_total - bytes_read;
|
||||
if (io_size > TIFF_IO_MAX)
|
||||
io_size = TIFF_IO_MAX;
|
||||
count = read(fdh.fd, buf_offset, (TIFFIOSize_t)io_size);
|
||||
if (count <= 0)
|
||||
break;
|
||||
}
|
||||
if (count < 0)
|
||||
return (tmsize_t)-1;
|
||||
return (tmsize_t)bytes_read;
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
fd_as_handle_union_t fdh;
|
||||
const size_t bytes_total = (size_t) size;
|
||||
size_t bytes_written;
|
||||
tmsize_t count = -1;
|
||||
if ((tmsize_t) bytes_total != size)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return (tmsize_t) -1;
|
||||
}
|
||||
fdh.h = fd;
|
||||
for (bytes_written=0; bytes_written < bytes_total; bytes_written+=count)
|
||||
{
|
||||
const char *buf_offset = (char *) buf+bytes_written;
|
||||
size_t io_size = bytes_total-bytes_written;
|
||||
if (io_size > TIFF_IO_MAX)
|
||||
io_size = TIFF_IO_MAX;
|
||||
count=write(fdh.fd, buf_offset, (TIFFIOSize_t) io_size);
|
||||
if (count <= 0)
|
||||
break;
|
||||
}
|
||||
if (count < 0)
|
||||
return (tmsize_t)-1;
|
||||
return (tmsize_t) bytes_written;
|
||||
/* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
|
||||
fd_as_handle_union_t fdh;
|
||||
const size_t bytes_total = (size_t)size;
|
||||
size_t bytes_written;
|
||||
tmsize_t count = -1;
|
||||
if ((tmsize_t)bytes_total != size)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return (tmsize_t)-1;
|
||||
}
|
||||
fdh.h = fd;
|
||||
for (bytes_written = 0; bytes_written < bytes_total; bytes_written += count)
|
||||
{
|
||||
const char *buf_offset = (char *)buf + bytes_written;
|
||||
size_t io_size = bytes_total - bytes_written;
|
||||
if (io_size > TIFF_IO_MAX)
|
||||
io_size = TIFF_IO_MAX;
|
||||
count = write(fdh.fd, buf_offset, (TIFFIOSize_t)io_size);
|
||||
if (count <= 0)
|
||||
break;
|
||||
}
|
||||
if (count < 0)
|
||||
return (tmsize_t)-1;
|
||||
return (tmsize_t)bytes_written;
|
||||
/* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
_tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
fd_as_handle_union_t fdh;
|
||||
_TIFF_off_t off_io = (_TIFF_off_t) off;
|
||||
if ((uint64_t) off_io != off)
|
||||
{
|
||||
errno=EINVAL;
|
||||
return (uint64_t) -1; /* this is really gross */
|
||||
}
|
||||
fdh.h = fd;
|
||||
return((uint64_t)_TIFF_lseek_f(fdh.fd, off_io, whence));
|
||||
fd_as_handle_union_t fdh;
|
||||
_TIFF_off_t off_io = (_TIFF_off_t)off;
|
||||
if ((uint64_t)off_io != off)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return (uint64_t)-1; /* this is really gross */
|
||||
}
|
||||
fdh.h = fd;
|
||||
return ((uint64_t)_TIFF_lseek_f(fdh.fd, off_io, whence));
|
||||
}
|
||||
|
||||
static int
|
||||
_tiffCloseProc(thandle_t fd)
|
||||
static int _tiffCloseProc(thandle_t fd)
|
||||
{
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
return(close(fdh.fd));
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
return (close(fdh.fd));
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
_tiffSizeProc(thandle_t fd)
|
||||
static uint64_t _tiffSizeProc(thandle_t fd)
|
||||
{
|
||||
_TIFF_stat_s sb;
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
if (_TIFF_fstat_f(fdh.fd,&sb)<0)
|
||||
return(0);
|
||||
else
|
||||
return((uint64_t)sb.st_size);
|
||||
_TIFF_stat_s sb;
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
if (_TIFF_fstat_f(fdh.fd, &sb) < 0)
|
||||
return (0);
|
||||
else
|
||||
return ((uint64_t)sb.st_size);
|
||||
}
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
#include <sys/mman.h>
|
||||
|
||||
static int
|
||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
||||
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||
{
|
||||
uint64_t size64 = _tiffSizeProc(fd);
|
||||
tmsize_t sizem = (tmsize_t)size64;
|
||||
if (size64 && (uint64_t)sizem == size64) {
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
*pbase = (void*)
|
||||
mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
|
||||
if (*pbase != (void*) -1) {
|
||||
*psize = (tmsize_t)sizem;
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
uint64_t size64 = _tiffSizeProc(fd);
|
||||
tmsize_t sizem = (tmsize_t)size64;
|
||||
if (size64 && (uint64_t)sizem == size64)
|
||||
{
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.h = fd;
|
||||
*pbase =
|
||||
(void *)mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
|
||||
if (*pbase != (void *)-1)
|
||||
{
|
||||
*psize = (tmsize_t)sizem;
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
||||
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||
{
|
||||
(void) fd;
|
||||
(void) munmap(base, (off_t) size);
|
||||
(void)fd;
|
||||
(void)munmap(base, (off_t)size);
|
||||
}
|
||||
#else /* !HAVE_MMAP */
|
||||
static int
|
||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
||||
#else /* !HAVE_MMAP */
|
||||
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||
{
|
||||
(void) fd; (void) pbase; (void) psize;
|
||||
return (0);
|
||||
(void)fd;
|
||||
(void)pbase;
|
||||
(void)psize;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
||||
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||
{
|
||||
(void) fd; (void) base; (void) size;
|
||||
(void)fd;
|
||||
(void)base;
|
||||
(void)size;
|
||||
}
|
||||
#endif /* !HAVE_MMAP */
|
||||
|
||||
/*
|
||||
* Open a TIFF file descriptor for read/writing.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFFdOpen(int fd, const char* name, const char* mode)
|
||||
TIFF *TIFFFdOpen(int fd, const char *name, const char *mode)
|
||||
{
|
||||
return TIFFFdOpenExt(fd, name, mode, NULL);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFFdOpenExt(int fd, const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFFdOpenExt(int fd, const char *name, const char *mode,
|
||||
TIFFOpenOptions *opts)
|
||||
{
|
||||
TIFF* tif;
|
||||
TIFF *tif;
|
||||
|
||||
fd_as_handle_union_t fdh;
|
||||
fdh.fd = fd;
|
||||
tif = TIFFClientOpenExt(name, mode,
|
||||
fdh.h,
|
||||
_tiffReadProc,
|
||||
_tiffWriteProc,
|
||||
_tiffSeekProc,
|
||||
_tiffCloseProc,
|
||||
_tiffSizeProc,
|
||||
_tiffMapProc,
|
||||
_tiffUnmapProc,
|
||||
opts);
|
||||
tif = TIFFClientOpenExt(name, mode, fdh.h, _tiffReadProc, _tiffWriteProc,
|
||||
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
||||
_tiffMapProc, _tiffUnmapProc, opts);
|
||||
if (tif)
|
||||
tif->tif_fd = fd;
|
||||
return (tif);
|
||||
@@ -230,42 +217,45 @@ TIFFFdOpenExt(int fd, const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
/*
|
||||
* Open a TIFF file for read/writing.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFOpen(const char* name, const char* mode)
|
||||
TIFF *TIFFOpen(const char *name, const char *mode)
|
||||
{
|
||||
return TIFFOpenExt(name, mode, NULL);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFOpenExt(const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
|
||||
{
|
||||
static const char module[] = "TIFFOpen";
|
||||
int m, fd;
|
||||
TIFF* tif;
|
||||
static const char module[] = "TIFFOpen";
|
||||
int m, fd;
|
||||
TIFF *tif;
|
||||
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
if (m == -1)
|
||||
return ((TIFF*)0);
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
if (m == -1)
|
||||
return ((TIFF *)0);
|
||||
|
||||
/* for cygwin and mingw */
|
||||
#ifdef O_BINARY
|
||||
m |= O_BINARY;
|
||||
m |= O_BINARY;
|
||||
#endif
|
||||
|
||||
fd = open(name, m, 0666);
|
||||
if (fd < 0) {
|
||||
if (errno > 0 && strerror(errno) != NULL ) {
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: %s", name, strerror(errno) );
|
||||
} else {
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||
}
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
fd = open(name, m, 0666);
|
||||
if (fd < 0)
|
||||
{
|
||||
if (errno > 0 && strerror(errno) != NULL)
|
||||
{
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: %s", name,
|
||||
strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||
}
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
tif = TIFFFdOpenExt((int)fd, name, mode, opts);
|
||||
if(!tif)
|
||||
close(fd);
|
||||
return tif;
|
||||
tif = TIFFFdOpenExt((int)fd, name, mode, opts);
|
||||
if (!tif)
|
||||
close(fd);
|
||||
return tif;
|
||||
}
|
||||
|
||||
#ifdef __WIN32__
|
||||
@@ -273,124 +263,108 @@ TIFFOpenExt(const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
/*
|
||||
* Open a TIFF file with a Unicode filename, for read/writing.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFOpenW(const wchar_t* name, const char* mode)
|
||||
TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
|
||||
{
|
||||
return TIFFOpenWExt(name, mode, NULL);
|
||||
}
|
||||
TIFF*
|
||||
TIFFOpenWExt(const wchar_t* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
|
||||
{
|
||||
static const char module[] = "TIFFOpenW";
|
||||
int m, fd;
|
||||
int mbsize;
|
||||
char *mbname;
|
||||
TIFF* tif;
|
||||
static const char module[] = "TIFFOpenW";
|
||||
int m, fd;
|
||||
int mbsize;
|
||||
char *mbname;
|
||||
TIFF *tif;
|
||||
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
if (m == -1)
|
||||
return ((TIFF*)0);
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
if (m == -1)
|
||||
return ((TIFF *)0);
|
||||
|
||||
/* for cygwin and mingw */
|
||||
#ifdef O_BINARY
|
||||
m |= O_BINARY;
|
||||
m |= O_BINARY;
|
||||
#endif
|
||||
|
||||
fd = _wopen(name, m, 0666);
|
||||
if (fd < 0) {
|
||||
_TIFFErrorEarly(opts, NULL, module, "%ls: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
fd = _wopen(name, m, 0666);
|
||||
if (fd < 0)
|
||||
{
|
||||
_TIFFErrorEarly(opts, NULL, module, "%ls: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
mbname = NULL;
|
||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||
if (mbsize > 0) {
|
||||
mbname = _TIFFmalloc(mbsize);
|
||||
if (!mbname) {
|
||||
_TIFFErrorEarly(opts, NULL, module,
|
||||
"Can't allocate space for filename conversion buffer");
|
||||
return ((TIFF*)0);
|
||||
}
|
||||
mbname = NULL;
|
||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||
if (mbsize > 0)
|
||||
{
|
||||
mbname = _TIFFmalloc(mbsize);
|
||||
if (!mbname)
|
||||
{
|
||||
_TIFFErrorEarly(
|
||||
opts, NULL, module,
|
||||
"Can't allocate space for filename conversion buffer");
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
|
||||
NULL, NULL);
|
||||
}
|
||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
|
||||
}
|
||||
|
||||
tif = TIFFFdOpenExt((int)fd, (mbname != NULL) ? mbname : "<unknown>",
|
||||
mode, opts);
|
||||
|
||||
_TIFFfree(mbname);
|
||||
|
||||
if(!tif)
|
||||
close(fd);
|
||||
return tif;
|
||||
tif = TIFFFdOpenExt((int)fd, (mbname != NULL) ? mbname : "<unknown>", mode,
|
||||
opts);
|
||||
|
||||
_TIFFfree(mbname);
|
||||
|
||||
if (!tif)
|
||||
close(fd);
|
||||
return tif;
|
||||
}
|
||||
#endif
|
||||
|
||||
void*
|
||||
_TIFFmalloc(tmsize_t s)
|
||||
void *_TIFFmalloc(tmsize_t s)
|
||||
{
|
||||
if (s == 0)
|
||||
return ((void *) NULL);
|
||||
if (s == 0)
|
||||
return ((void *)NULL);
|
||||
|
||||
return (malloc((size_t) s));
|
||||
return (malloc((size_t)s));
|
||||
}
|
||||
|
||||
void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
||||
void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
||||
{
|
||||
if( nmemb == 0 || siz == 0 )
|
||||
return ((void *) NULL);
|
||||
if (nmemb == 0 || siz == 0)
|
||||
return ((void *)NULL);
|
||||
|
||||
return calloc((size_t) nmemb, (size_t)siz);
|
||||
return calloc((size_t)nmemb, (size_t)siz);
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFfree(void* p)
|
||||
void _TIFFfree(void *p) { free(p); }
|
||||
|
||||
void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
|
||||
|
||||
void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
|
||||
|
||||
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
|
||||
{
|
||||
free(p);
|
||||
memcpy(d, s, (size_t)c);
|
||||
}
|
||||
|
||||
void*
|
||||
_TIFFrealloc(void* p, tmsize_t s)
|
||||
int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
|
||||
{
|
||||
return (realloc(p, (size_t) s));
|
||||
return (memcmp(p1, p2, (size_t)c));
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFmemset(void* p, int v, tmsize_t c)
|
||||
static void unixWarningHandler(const char *module, const char *fmt, va_list ap)
|
||||
{
|
||||
memset(p, v, (size_t) c);
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFmemcpy(void* d, const void* s, tmsize_t c)
|
||||
{
|
||||
memcpy(d, s, (size_t) c);
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
|
||||
{
|
||||
return (memcmp(p1, p2, (size_t) c));
|
||||
}
|
||||
|
||||
static void
|
||||
unixWarningHandler(const char* module, const char* fmt, va_list ap)
|
||||
{
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
fprintf(stderr, "Warning, ");
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
fprintf(stderr, "Warning, ");
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
}
|
||||
TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
|
||||
|
||||
static void
|
||||
unixErrorHandler(const char* module, const char* fmt, va_list ap)
|
||||
static void unixErrorHandler(const char *module, const char *fmt, va_list ap)
|
||||
{
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
}
|
||||
TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
|
||||
|
||||
@@ -2,31 +2,27 @@
|
||||
* Copyright (c) 1992-1997 Sam Leffler
|
||||
* Copyright (c) 1992-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
#include "tiffiop.h"
|
||||
|
||||
static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
|
||||
|
||||
const char*
|
||||
TIFFGetVersion(void)
|
||||
{
|
||||
return (TIFFVersion);
|
||||
}
|
||||
const char *TIFFGetVersion(void) { return (TIFFVersion); }
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -29,71 +29,77 @@
|
||||
|
||||
TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;
|
||||
|
||||
TIFFErrorHandler
|
||||
TIFFSetWarningHandler(TIFFErrorHandler handler)
|
||||
TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler)
|
||||
{
|
||||
TIFFErrorHandler prev = _TIFFwarningHandler;
|
||||
_TIFFwarningHandler = handler;
|
||||
return (prev);
|
||||
TIFFErrorHandler prev = _TIFFwarningHandler;
|
||||
_TIFFwarningHandler = handler;
|
||||
return (prev);
|
||||
}
|
||||
|
||||
TIFFErrorHandlerExt
|
||||
TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
|
||||
TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
|
||||
{
|
||||
TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
|
||||
_TIFFwarningHandlerExt = handler;
|
||||
return (prev);
|
||||
TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
|
||||
_TIFFwarningHandlerExt = handler;
|
||||
return (prev);
|
||||
}
|
||||
|
||||
void
|
||||
TIFFWarning(const char* module, const char* fmt, ...)
|
||||
void TIFFWarning(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (_TIFFwarningHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(0, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
va_list ap;
|
||||
if (_TIFFwarningHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(0, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...)
|
||||
void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (_TIFFwarningHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
va_list ap;
|
||||
if (_TIFFwarningHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void TIFFWarningExtR(TIFF* tif, const char* module, const char* fmt, ...)
|
||||
void TIFFWarningExtR(TIFF *tif, const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if (tif && tif->tif_warnhandler) {
|
||||
va_start(ap, fmt);
|
||||
int stop = (*tif->tif_warnhandler)(tif, tif->tif_warnhandler_user_data, module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop) return;
|
||||
}
|
||||
if (_TIFFwarningHandler) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt) {
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(tif ? tif->tif_clientdata : 0, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
va_list ap;
|
||||
if (tif && tif->tif_warnhandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
int stop = (*tif->tif_warnhandler)(tif, tif->tif_warnhandler_user_data,
|
||||
module, fmt, ap);
|
||||
va_end(ap);
|
||||
if (stop)
|
||||
return;
|
||||
}
|
||||
if (_TIFFwarningHandler)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (_TIFFwarningHandlerExt)
|
||||
{
|
||||
va_start(ap, fmt);
|
||||
(*_TIFFwarningHandlerExt)(tif ? tif->tif_clientdata : 0, module, fmt,
|
||||
ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
1333
libtiff/tif_webp.c
1333
libtiff/tif_webp.c
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,23 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
@@ -55,121 +55,111 @@ static inline thandle_t thandle_from_int(int ifd)
|
||||
return (thandle_t)(intptr_t)ifd;
|
||||
}
|
||||
|
||||
static inline int thandle_to_int(thandle_t fd)
|
||||
static inline int thandle_to_int(thandle_t fd) { return (int)(intptr_t)fd; }
|
||||
|
||||
static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
return (int)(intptr_t)fd;
|
||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
|
||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||
* chunks */
|
||||
uint8_t *ma;
|
||||
uint64_t mb;
|
||||
DWORD n;
|
||||
DWORD o;
|
||||
tmsize_t p;
|
||||
ma = (uint8_t *)buf;
|
||||
mb = size;
|
||||
p = 0;
|
||||
while (mb > 0)
|
||||
{
|
||||
n = 0x80000000UL;
|
||||
if ((uint64_t)n > mb)
|
||||
n = (DWORD)mb;
|
||||
if (!ReadFile(fd, (LPVOID)ma, n, &o, NULL))
|
||||
return (0);
|
||||
ma += o;
|
||||
mb -= o;
|
||||
p += o;
|
||||
if (o != n)
|
||||
break;
|
||||
}
|
||||
return (p);
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||
{
|
||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
|
||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||
* chunks */
|
||||
uint8_t* ma;
|
||||
uint64_t mb;
|
||||
DWORD n;
|
||||
DWORD o;
|
||||
tmsize_t p;
|
||||
ma=(uint8_t*)buf;
|
||||
mb=size;
|
||||
p=0;
|
||||
while (mb>0)
|
||||
{
|
||||
n=0x80000000UL;
|
||||
if ((uint64_t)n>mb)
|
||||
n=(DWORD)mb;
|
||||
if (!ReadFile(fd,(LPVOID)ma,n,&o,NULL))
|
||||
return(0);
|
||||
ma+=o;
|
||||
mb-=o;
|
||||
p+=o;
|
||||
if (o!=n)
|
||||
break;
|
||||
}
|
||||
return(p);
|
||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
|
||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||
* chunks */
|
||||
uint8_t *ma;
|
||||
uint64_t mb;
|
||||
DWORD n;
|
||||
DWORD o;
|
||||
tmsize_t p;
|
||||
ma = (uint8_t *)buf;
|
||||
mb = size;
|
||||
p = 0;
|
||||
while (mb > 0)
|
||||
{
|
||||
n = 0x80000000UL;
|
||||
if ((uint64_t)n > mb)
|
||||
n = (DWORD)mb;
|
||||
if (!WriteFile(fd, (LPVOID)ma, n, &o, NULL))
|
||||
return (0);
|
||||
ma += o;
|
||||
mb -= o;
|
||||
p += o;
|
||||
if (o != n)
|
||||
break;
|
||||
}
|
||||
return (p);
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
||||
static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
{
|
||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
|
||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||
* chunks */
|
||||
uint8_t* ma;
|
||||
uint64_t mb;
|
||||
DWORD n;
|
||||
DWORD o;
|
||||
tmsize_t p;
|
||||
ma=(uint8_t*)buf;
|
||||
mb=size;
|
||||
p=0;
|
||||
while (mb>0)
|
||||
{
|
||||
n=0x80000000UL;
|
||||
if ((uint64_t)n>mb)
|
||||
n=(DWORD)mb;
|
||||
if (!WriteFile(fd,(LPVOID)ma,n,&o,NULL))
|
||||
return(0);
|
||||
ma+=o;
|
||||
mb-=o;
|
||||
p+=o;
|
||||
if (o!=n)
|
||||
break;
|
||||
}
|
||||
return(p);
|
||||
LARGE_INTEGER offli;
|
||||
DWORD dwMoveMethod;
|
||||
offli.QuadPart = off;
|
||||
switch (whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
dwMoveMethod = FILE_BEGIN;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
dwMoveMethod = FILE_CURRENT;
|
||||
break;
|
||||
case SEEK_END:
|
||||
dwMoveMethod = FILE_END;
|
||||
break;
|
||||
default:
|
||||
dwMoveMethod = FILE_BEGIN;
|
||||
break;
|
||||
}
|
||||
offli.LowPart =
|
||||
SetFilePointer(fd, offli.LowPart, &offli.HighPart, dwMoveMethod);
|
||||
if ((offli.LowPart == INVALID_SET_FILE_POINTER) &&
|
||||
(GetLastError() != NO_ERROR))
|
||||
offli.QuadPart = 0;
|
||||
return (offli.QuadPart);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
_tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||
static int _tiffCloseProc(thandle_t fd) { return (CloseHandle(fd) ? 0 : -1); }
|
||||
|
||||
static uint64_t _tiffSizeProc(thandle_t fd)
|
||||
{
|
||||
LARGE_INTEGER offli;
|
||||
DWORD dwMoveMethod;
|
||||
offli.QuadPart = off;
|
||||
switch(whence)
|
||||
{
|
||||
case SEEK_SET:
|
||||
dwMoveMethod = FILE_BEGIN;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
dwMoveMethod = FILE_CURRENT;
|
||||
break;
|
||||
case SEEK_END:
|
||||
dwMoveMethod = FILE_END;
|
||||
break;
|
||||
default:
|
||||
dwMoveMethod = FILE_BEGIN;
|
||||
break;
|
||||
}
|
||||
offli.LowPart=SetFilePointer(fd,offli.LowPart,&offli.HighPart,dwMoveMethod);
|
||||
if ((offli.LowPart==INVALID_SET_FILE_POINTER)&&(GetLastError()!=NO_ERROR))
|
||||
offli.QuadPart=0;
|
||||
return(offli.QuadPart);
|
||||
LARGE_INTEGER m;
|
||||
if (GetFileSizeEx(fd, &m))
|
||||
return (m.QuadPart);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
_tiffCloseProc(thandle_t fd)
|
||||
static int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||
{
|
||||
return (CloseHandle(fd) ? 0 : -1);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
_tiffSizeProc(thandle_t fd)
|
||||
{
|
||||
LARGE_INTEGER m;
|
||||
if (GetFileSizeEx(fd,&m))
|
||||
return(m.QuadPart);
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
_tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
||||
{
|
||||
(void) fd;
|
||||
(void) pbase;
|
||||
(void) psize;
|
||||
return (0);
|
||||
(void)fd;
|
||||
(void)pbase;
|
||||
(void)psize;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -183,45 +173,42 @@ _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
||||
* This removes a nasty OS dependency and cures a problem
|
||||
* with Visual C++ 5.0
|
||||
*/
|
||||
static int
|
||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
||||
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||
{
|
||||
uint64_t size;
|
||||
tmsize_t sizem;
|
||||
HANDLE hMapFile;
|
||||
uint64_t size;
|
||||
tmsize_t sizem;
|
||||
HANDLE hMapFile;
|
||||
|
||||
size = _tiffSizeProc(fd);
|
||||
sizem = (tmsize_t)size;
|
||||
if (!size || (uint64_t)sizem!=size)
|
||||
return (0);
|
||||
size = _tiffSizeProc(fd);
|
||||
sizem = (tmsize_t)size;
|
||||
if (!size || (uint64_t)sizem != size)
|
||||
return (0);
|
||||
|
||||
/* By passing in 0 for the maximum file size, it specifies that we
|
||||
create a file mapping object for the full file size. */
|
||||
hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, 0, NULL);
|
||||
if (hMapFile == NULL)
|
||||
return (0);
|
||||
*pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
|
||||
CloseHandle(hMapFile);
|
||||
if (*pbase == NULL)
|
||||
return (0);
|
||||
*psize = size;
|
||||
return(1);
|
||||
/* By passing in 0 for the maximum file size, it specifies that we
|
||||
create a file mapping object for the full file size. */
|
||||
hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, 0, NULL);
|
||||
if (hMapFile == NULL)
|
||||
return (0);
|
||||
*pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
|
||||
CloseHandle(hMapFile);
|
||||
if (*pbase == NULL)
|
||||
return (0);
|
||||
*psize = size;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static void
|
||||
_tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size)
|
||||
static void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||
{
|
||||
(void) fd;
|
||||
(void) base;
|
||||
(void) size;
|
||||
(void)fd;
|
||||
(void)base;
|
||||
(void)size;
|
||||
}
|
||||
|
||||
static void
|
||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
||||
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||
{
|
||||
(void) fd;
|
||||
(void) size;
|
||||
UnmapViewOfFile(base);
|
||||
(void)fd;
|
||||
(void)size;
|
||||
UnmapViewOfFile(base);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -229,41 +216,36 @@ _tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
||||
* Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
|
||||
* string, which forces the file to be opened unmapped.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFFdOpen(int ifd, const char* name, const char* mode)
|
||||
TIFF *TIFFFdOpen(int ifd, const char *name, const char *mode)
|
||||
{
|
||||
return TIFFFdOpenExt(ifd, name, mode, NULL);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFFdOpenExt(int ifd, const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFFdOpenExt(int ifd, const char *name, const char *mode,
|
||||
TIFFOpenOptions *opts)
|
||||
{
|
||||
TIFF* tif;
|
||||
int fSuppressMap;
|
||||
int m;
|
||||
TIFF *tif;
|
||||
int fSuppressMap;
|
||||
int m;
|
||||
|
||||
fSuppressMap=0;
|
||||
for (m=0; mode[m]!=0; m++)
|
||||
{
|
||||
if (mode[m]=='u')
|
||||
{
|
||||
fSuppressMap=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fSuppressMap = 0;
|
||||
for (m = 0; mode[m] != 0; m++)
|
||||
{
|
||||
if (mode[m] == 'u')
|
||||
{
|
||||
fSuppressMap = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tif = TIFFClientOpenExt(name, mode, thandle_from_int(ifd),
|
||||
_tiffReadProc,
|
||||
_tiffWriteProc,
|
||||
_tiffSeekProc,
|
||||
_tiffCloseProc,
|
||||
_tiffSizeProc,
|
||||
fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
|
||||
fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc,
|
||||
opts);
|
||||
if (tif)
|
||||
tif->tif_fd = ifd;
|
||||
return (tif);
|
||||
tif = TIFFClientOpenExt(
|
||||
name, mode, thandle_from_int(ifd), _tiffReadProc, _tiffWriteProc,
|
||||
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
||||
fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
|
||||
fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc, opts);
|
||||
if (tif)
|
||||
tif->tif_fd = ifd;
|
||||
return (tif);
|
||||
}
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
@@ -271,182 +253,189 @@ TIFFFdOpenExt(int ifd, const char* name, const char* mode, TIFFOpenOptions* opts
|
||||
/*
|
||||
* Open a TIFF file for read/writing.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFOpen(const char* name, const char* mode)
|
||||
TIFF *TIFFOpen(const char *name, const char *mode)
|
||||
{
|
||||
return TIFFOpenExt(name, mode, NULL);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFOpenExt(const char* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
|
||||
{
|
||||
static const char module[] = "TIFFOpen";
|
||||
thandle_t fd;
|
||||
int m;
|
||||
DWORD dwMode;
|
||||
TIFF* tif;
|
||||
static const char module[] = "TIFFOpen";
|
||||
thandle_t fd;
|
||||
int m;
|
||||
DWORD dwMode;
|
||||
TIFF *tif;
|
||||
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
|
||||
switch(m) {
|
||||
case O_RDONLY: dwMode = OPEN_EXISTING; break;
|
||||
case O_RDWR: dwMode = OPEN_ALWAYS; break;
|
||||
case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
|
||||
case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
||||
case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
||||
default: return ((TIFF*)0);
|
||||
}
|
||||
|
||||
fd = (thandle_t)CreateFileA(name,
|
||||
(m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE),
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||
(m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (fd == INVALID_HANDLE_VALUE) {
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
switch (m)
|
||||
{
|
||||
case O_RDONLY:
|
||||
dwMode = OPEN_EXISTING;
|
||||
break;
|
||||
case O_RDWR:
|
||||
dwMode = OPEN_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_CREAT:
|
||||
dwMode = OPEN_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_TRUNC:
|
||||
dwMode = CREATE_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_CREAT | O_TRUNC:
|
||||
dwMode = CREATE_ALWAYS;
|
||||
break;
|
||||
default:
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
tif = TIFFFdOpenExt(thandle_to_int(fd), name, mode, opts);
|
||||
if(!tif)
|
||||
CloseHandle(fd);
|
||||
return tif;
|
||||
fd = (thandle_t)CreateFileA(
|
||||
name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (fd == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
tif = TIFFFdOpenExt(thandle_to_int(fd), name, mode, opts);
|
||||
if (!tif)
|
||||
CloseHandle(fd);
|
||||
return tif;
|
||||
}
|
||||
|
||||
/*
|
||||
* Open a TIFF file with a Unicode filename, for read/writing.
|
||||
*/
|
||||
TIFF*
|
||||
TIFFOpenW(const wchar_t* name, const char* mode)
|
||||
TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
|
||||
{
|
||||
return TIFFOpenWExt(name, mode, NULL);
|
||||
}
|
||||
|
||||
TIFF*
|
||||
TIFFOpenWExt(const wchar_t* name, const char* mode, TIFFOpenOptions* opts)
|
||||
TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
|
||||
{
|
||||
static const char module[] = "TIFFOpenW";
|
||||
thandle_t fd;
|
||||
int m;
|
||||
DWORD dwMode;
|
||||
int mbsize;
|
||||
char *mbname;
|
||||
TIFF *tif;
|
||||
static const char module[] = "TIFFOpenW";
|
||||
thandle_t fd;
|
||||
int m;
|
||||
DWORD dwMode;
|
||||
int mbsize;
|
||||
char *mbname;
|
||||
TIFF *tif;
|
||||
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||
|
||||
switch(m) {
|
||||
case O_RDONLY: dwMode = OPEN_EXISTING; break;
|
||||
case O_RDWR: dwMode = OPEN_ALWAYS; break;
|
||||
case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
|
||||
case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
||||
case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
||||
default: return ((TIFF*)0);
|
||||
}
|
||||
switch (m)
|
||||
{
|
||||
case O_RDONLY:
|
||||
dwMode = OPEN_EXISTING;
|
||||
break;
|
||||
case O_RDWR:
|
||||
dwMode = OPEN_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_CREAT:
|
||||
dwMode = OPEN_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_TRUNC:
|
||||
dwMode = CREATE_ALWAYS;
|
||||
break;
|
||||
case O_RDWR | O_CREAT | O_TRUNC:
|
||||
dwMode = CREATE_ALWAYS;
|
||||
break;
|
||||
default:
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
fd = (thandle_t)CreateFileW(name,
|
||||
(m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE),
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||
(m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (fd == INVALID_HANDLE_VALUE) {
|
||||
_TIFFErrorEarly(opts, NULL, module, "%S: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
fd = (thandle_t)CreateFileW(
|
||||
name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
|
||||
NULL);
|
||||
if (fd == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
_TIFFErrorEarly(opts, NULL, module, "%S: Cannot open", name);
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
mbname = NULL;
|
||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||
if (mbsize > 0) {
|
||||
mbname = (char *)_TIFFmalloc(mbsize);
|
||||
if (!mbname) {
|
||||
_TIFFErrorEarly(opts, NULL, module,
|
||||
"Can't allocate space for filename conversion buffer");
|
||||
return ((TIFF*)0);
|
||||
}
|
||||
mbname = NULL;
|
||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||
if (mbsize > 0)
|
||||
{
|
||||
mbname = (char *)_TIFFmalloc(mbsize);
|
||||
if (!mbname)
|
||||
{
|
||||
_TIFFErrorEarly(
|
||||
opts, NULL, module,
|
||||
"Can't allocate space for filename conversion buffer");
|
||||
return ((TIFF *)0);
|
||||
}
|
||||
|
||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
|
||||
NULL, NULL);
|
||||
}
|
||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
|
||||
}
|
||||
|
||||
tif = TIFFFdOpenExt(thandle_to_int(fd),
|
||||
(mbname != NULL) ? mbname : "<unknown>", mode, opts);
|
||||
if(!tif)
|
||||
CloseHandle(fd);
|
||||
tif = TIFFFdOpenExt(thandle_to_int(fd),
|
||||
(mbname != NULL) ? mbname : "<unknown>", mode, opts);
|
||||
if (!tif)
|
||||
CloseHandle(fd);
|
||||
|
||||
_TIFFfree(mbname);
|
||||
_TIFFfree(mbname);
|
||||
|
||||
return tif;
|
||||
return tif;
|
||||
}
|
||||
|
||||
#endif /* ndef _WIN32_WCE */
|
||||
|
||||
void*
|
||||
_TIFFmalloc(tmsize_t s)
|
||||
void *_TIFFmalloc(tmsize_t s)
|
||||
{
|
||||
if (s == 0)
|
||||
return ((void *) NULL);
|
||||
if (s == 0)
|
||||
return ((void *)NULL);
|
||||
|
||||
return (malloc((size_t) s));
|
||||
return (malloc((size_t)s));
|
||||
}
|
||||
|
||||
void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
||||
void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
||||
{
|
||||
if( nmemb == 0 || siz == 0 )
|
||||
return ((void *) NULL);
|
||||
if (nmemb == 0 || siz == 0)
|
||||
return ((void *)NULL);
|
||||
|
||||
return calloc((size_t) nmemb, (size_t)siz);
|
||||
return calloc((size_t)nmemb, (size_t)siz);
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFfree(void* p)
|
||||
void _TIFFfree(void *p) { free(p); }
|
||||
|
||||
void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
|
||||
|
||||
void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
|
||||
|
||||
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
|
||||
{
|
||||
free(p);
|
||||
memcpy(d, s, (size_t)c);
|
||||
}
|
||||
|
||||
void*
|
||||
_TIFFrealloc(void* p, tmsize_t s)
|
||||
int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
|
||||
{
|
||||
return (realloc(p, (size_t) s));
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFmemset(void* p, int v, tmsize_t c)
|
||||
{
|
||||
memset(p, v, (size_t) c);
|
||||
}
|
||||
|
||||
void
|
||||
_TIFFmemcpy(void* d, const void* s, tmsize_t c)
|
||||
{
|
||||
memcpy(d, s, (size_t) c);
|
||||
}
|
||||
|
||||
int
|
||||
_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
|
||||
{
|
||||
return (memcmp(p1, p2, (size_t) c));
|
||||
return (memcmp(p1, p2, (size_t)c));
|
||||
}
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
|
||||
static void
|
||||
Win32WarningHandler(const char* module, const char* fmt, va_list ap)
|
||||
static void Win32WarningHandler(const char *module, const char *fmt, va_list ap)
|
||||
{
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
fprintf(stderr, "Warning, ");
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
fprintf(stderr, "Warning, ");
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
}
|
||||
TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
|
||||
|
||||
static void
|
||||
Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
|
||||
static void Win32ErrorHandler(const char *module, const char *fmt, va_list ap)
|
||||
{
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
if (module != NULL)
|
||||
fprintf(stderr, "%s: ", module);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, ".\n");
|
||||
}
|
||||
TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
|
||||
|
||||
|
||||
1262
libtiff/tif_write.c
1262
libtiff/tif_write.c
File diff suppressed because it is too large
Load Diff
1048
libtiff/tif_zip.c
1048
libtiff/tif_zip.c
File diff suppressed because it is too large
Load Diff
@@ -1,35 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Planet Labs
|
||||
* Author: <even.rouault at spatialys.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
* Copyright (c) 2017, Planet Labs
|
||||
* Author: <even.rouault at spatialys.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "tiffiop.h"
|
||||
#ifdef ZSTD_SUPPORT
|
||||
/*
|
||||
* TIFF Library.
|
||||
*
|
||||
* ZSTD Compression Support
|
||||
*
|
||||
*/
|
||||
* TIFF Library.
|
||||
*
|
||||
* ZSTD Compression Support
|
||||
*
|
||||
*/
|
||||
|
||||
#include "tif_predict.h"
|
||||
#include "zstd.h"
|
||||
@@ -37,401 +37,400 @@
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
* State block for each open TIFF file using ZSTD compression/decompression.
|
||||
*/
|
||||
typedef struct {
|
||||
TIFFPredictorState predict;
|
||||
ZSTD_DStream* dstream;
|
||||
ZSTD_CStream* cstream;
|
||||
int compression_level; /* compression level */
|
||||
ZSTD_outBuffer out_buffer;
|
||||
int state; /* state flags */
|
||||
* State block for each open TIFF file using ZSTD compression/decompression.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
TIFFPredictorState predict;
|
||||
ZSTD_DStream *dstream;
|
||||
ZSTD_CStream *cstream;
|
||||
int compression_level; /* compression level */
|
||||
ZSTD_outBuffer out_buffer;
|
||||
int state; /* state flags */
|
||||
#define LSTATE_INIT_DECODE 0x01
|
||||
#define LSTATE_INIT_ENCODE 0x02
|
||||
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
TIFFVGetMethod vgetparent; /* super-class method */
|
||||
TIFFVSetMethod vsetparent; /* super-class method */
|
||||
} ZSTDState;
|
||||
|
||||
#define LState(tif) ((ZSTDState*) (tif)->tif_data)
|
||||
#define DecoderState(tif) LState(tif)
|
||||
#define EncoderState(tif) LState(tif)
|
||||
#define LState(tif) ((ZSTDState *)(tif)->tif_data)
|
||||
#define DecoderState(tif) LState(tif)
|
||||
#define EncoderState(tif) LState(tif)
|
||||
|
||||
static int ZSTDEncode(TIFF* tif, uint8_t* bp, tmsize_t cc, uint16_t s);
|
||||
static int ZSTDDecode(TIFF* tif, uint8_t* op, tmsize_t occ, uint16_t s);
|
||||
static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||
static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||
|
||||
static int
|
||||
ZSTDFixupTags(TIFF* tif)
|
||||
static int ZSTDFixupTags(TIFF *tif)
|
||||
{
|
||||
(void) tif;
|
||||
return 1;
|
||||
(void)tif;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
ZSTDSetupDecode(TIFF* tif)
|
||||
static int ZSTDSetupDecode(TIFF *tif)
|
||||
{
|
||||
ZSTDState* sp = DecoderState(tif);
|
||||
ZSTDState *sp = DecoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
assert(sp != NULL);
|
||||
|
||||
/* if we were last encoding, terminate this mode */
|
||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
||||
ZSTD_freeCStream(sp->cstream);
|
||||
sp->cstream = NULL;
|
||||
sp->state = 0;
|
||||
}
|
||||
/* if we were last encoding, terminate this mode */
|
||||
if (sp->state & LSTATE_INIT_ENCODE)
|
||||
{
|
||||
ZSTD_freeCStream(sp->cstream);
|
||||
sp->cstream = NULL;
|
||||
sp->state = 0;
|
||||
}
|
||||
|
||||
sp->state |= LSTATE_INIT_DECODE;
|
||||
return 1;
|
||||
sp->state |= LSTATE_INIT_DECODE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup state for decoding a strip.
|
||||
*/
|
||||
static int
|
||||
ZSTDPreDecode(TIFF* tif, uint16_t s)
|
||||
* Setup state for decoding a strip.
|
||||
*/
|
||||
static int ZSTDPreDecode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ZSTDPreDecode";
|
||||
ZSTDState* sp = DecoderState(tif);
|
||||
size_t zstd_ret;
|
||||
static const char module[] = "ZSTDPreDecode";
|
||||
ZSTDState *sp = DecoderState(tif);
|
||||
size_t zstd_ret;
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
|
||||
if( (sp->state & LSTATE_INIT_DECODE) == 0 )
|
||||
tif->tif_setupdecode(tif);
|
||||
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
||||
tif->tif_setupdecode(tif);
|
||||
|
||||
if( sp->dstream == NULL )
|
||||
if (sp->dstream == NULL)
|
||||
{
|
||||
sp->dstream = ZSTD_createDStream();
|
||||
if (sp->dstream == NULL)
|
||||
{
|
||||
sp->dstream = ZSTD_createDStream();
|
||||
if( sp->dstream == NULL ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Cannot allocate decompression stream");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
zstd_ret = ZSTD_initDStream(sp->dstream);
|
||||
if( ZSTD_isError(zstd_ret) ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in ZSTD_initDStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
TIFFErrorExtR(tif, module, "Cannot allocate decompression stream");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
zstd_ret = ZSTD_initDStream(sp->dstream);
|
||||
if (ZSTD_isError(zstd_ret))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in ZSTD_initDStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
ZSTDDecode(TIFF* tif, uint8_t* op, tmsize_t occ, uint16_t s)
|
||||
static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ZSTDDecode";
|
||||
ZSTDState* sp = DecoderState(tif);
|
||||
ZSTD_inBuffer in_buffer;
|
||||
ZSTD_outBuffer out_buffer;
|
||||
size_t zstd_ret;
|
||||
static const char module[] = "ZSTDDecode";
|
||||
ZSTDState *sp = DecoderState(tif);
|
||||
ZSTD_inBuffer in_buffer;
|
||||
ZSTD_outBuffer out_buffer;
|
||||
size_t zstd_ret;
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_DECODE);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_DECODE);
|
||||
|
||||
in_buffer.src = tif->tif_rawcp;
|
||||
in_buffer.size = (size_t) tif->tif_rawcc;
|
||||
in_buffer.pos = 0;
|
||||
in_buffer.src = tif->tif_rawcp;
|
||||
in_buffer.size = (size_t)tif->tif_rawcc;
|
||||
in_buffer.pos = 0;
|
||||
|
||||
out_buffer.dst = op;
|
||||
out_buffer.size = (size_t) occ;
|
||||
out_buffer.pos = 0;
|
||||
out_buffer.dst = op;
|
||||
out_buffer.size = (size_t)occ;
|
||||
out_buffer.pos = 0;
|
||||
|
||||
do {
|
||||
zstd_ret = ZSTD_decompressStream(sp->dstream, &out_buffer,
|
||||
&in_buffer);
|
||||
if( ZSTD_isError(zstd_ret) ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in ZSTD_decompressStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
} while( zstd_ret != 0 &&
|
||||
in_buffer.pos < in_buffer.size &&
|
||||
out_buffer.pos < out_buffer.size );
|
||||
|
||||
if (out_buffer.pos < (size_t)occ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data at scanline %lu (short %lu bytes)",
|
||||
(unsigned long) tif->tif_row,
|
||||
(unsigned long) ((size_t)occ - out_buffer.pos));
|
||||
return 0;
|
||||
}
|
||||
|
||||
tif->tif_rawcp += in_buffer.pos;
|
||||
tif->tif_rawcc -= in_buffer.pos;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
ZSTDSetupEncode(TIFF* tif)
|
||||
{
|
||||
ZSTDState* sp = EncoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
if (sp->state & LSTATE_INIT_DECODE) {
|
||||
ZSTD_freeDStream(sp->dstream);
|
||||
sp->dstream = NULL;
|
||||
sp->state = 0;
|
||||
}
|
||||
|
||||
sp->state |= LSTATE_INIT_ENCODE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset encoding state at the start of a strip.
|
||||
*/
|
||||
static int
|
||||
ZSTDPreEncode(TIFF* tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ZSTDPreEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
size_t zstd_ret;
|
||||
|
||||
(void) s;
|
||||
assert(sp != NULL);
|
||||
if( sp->state != LSTATE_INIT_ENCODE )
|
||||
tif->tif_setupencode(tif);
|
||||
|
||||
if (sp->cstream == NULL) {
|
||||
sp->cstream = ZSTD_createCStream();
|
||||
if( sp->cstream == NULL ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Cannot allocate compression stream");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
zstd_ret = ZSTD_initCStream(sp->cstream, sp->compression_level);
|
||||
if( ZSTD_isError(zstd_ret) ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in ZSTD_initCStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
do
|
||||
{
|
||||
zstd_ret = ZSTD_decompressStream(sp->dstream, &out_buffer, &in_buffer);
|
||||
if (ZSTD_isError(zstd_ret))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in ZSTD_decompressStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
} while (zstd_ret != 0 && in_buffer.pos < in_buffer.size &&
|
||||
out_buffer.pos < out_buffer.size);
|
||||
|
||||
sp->out_buffer.dst = tif->tif_rawdata;
|
||||
sp->out_buffer.size = (size_t)tif->tif_rawdatasize;
|
||||
sp->out_buffer.pos = 0;
|
||||
if (out_buffer.pos < (size_t)occ)
|
||||
{
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Not enough data at scanline %lu (short %lu bytes)",
|
||||
(unsigned long)tif->tif_row,
|
||||
(unsigned long)((size_t)occ - out_buffer.pos));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
tif->tif_rawcp += in_buffer.pos;
|
||||
tif->tif_rawcc -= in_buffer.pos;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ZSTDSetupEncode(TIFF *tif)
|
||||
{
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
|
||||
assert(sp != NULL);
|
||||
if (sp->state & LSTATE_INIT_DECODE)
|
||||
{
|
||||
ZSTD_freeDStream(sp->dstream);
|
||||
sp->dstream = NULL;
|
||||
sp->state = 0;
|
||||
}
|
||||
|
||||
sp->state |= LSTATE_INIT_ENCODE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encode a chunk of pixels.
|
||||
*/
|
||||
static int
|
||||
ZSTDEncode(TIFF* tif, uint8_t* bp, tmsize_t cc, uint16_t s)
|
||||
* Reset encoding state at the start of a strip.
|
||||
*/
|
||||
static int ZSTDPreEncode(TIFF *tif, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ZSTDEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
ZSTD_inBuffer in_buffer;
|
||||
size_t zstd_ret;
|
||||
static const char module[] = "ZSTDPreEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
size_t zstd_ret;
|
||||
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_ENCODE);
|
||||
(void)s;
|
||||
assert(sp != NULL);
|
||||
if (sp->state != LSTATE_INIT_ENCODE)
|
||||
tif->tif_setupencode(tif);
|
||||
|
||||
(void) s;
|
||||
if (sp->cstream == NULL)
|
||||
{
|
||||
sp->cstream = ZSTD_createCStream();
|
||||
if (sp->cstream == NULL)
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Cannot allocate compression stream");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
in_buffer.src = bp;
|
||||
in_buffer.size = (size_t)cc;
|
||||
in_buffer.pos = 0;
|
||||
zstd_ret = ZSTD_initCStream(sp->cstream, sp->compression_level);
|
||||
if (ZSTD_isError(zstd_ret))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in ZSTD_initCStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
|
||||
do {
|
||||
zstd_ret = ZSTD_compressStream(sp->cstream, &sp->out_buffer,
|
||||
&in_buffer);
|
||||
if( ZSTD_isError(zstd_ret) ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in ZSTD_compressStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
if( sp->out_buffer.pos == sp->out_buffer.size ) {
|
||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->out_buffer.dst = tif->tif_rawcp;
|
||||
sp->out_buffer.pos = 0;
|
||||
}
|
||||
} while( in_buffer.pos < in_buffer.size );
|
||||
sp->out_buffer.dst = tif->tif_rawdata;
|
||||
sp->out_buffer.size = (size_t)tif->tif_rawdatasize;
|
||||
sp->out_buffer.pos = 0;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Finish off an encoded strip by flushing it.
|
||||
*/
|
||||
static int
|
||||
ZSTDPostEncode(TIFF* tif)
|
||||
* Encode a chunk of pixels.
|
||||
*/
|
||||
static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||
{
|
||||
static const char module[] = "ZSTDPostEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
size_t zstd_ret;
|
||||
static const char module[] = "ZSTDEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
ZSTD_inBuffer in_buffer;
|
||||
size_t zstd_ret;
|
||||
|
||||
do {
|
||||
zstd_ret = ZSTD_endStream(sp->cstream, &sp->out_buffer);
|
||||
if( ZSTD_isError(zstd_ret) ) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Error in ZSTD_endStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
if( sp->out_buffer.pos > 0 ) {
|
||||
tif->tif_rawcc = sp->out_buffer.pos;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->out_buffer.dst = tif->tif_rawcp;
|
||||
sp->out_buffer.pos = 0;
|
||||
}
|
||||
} while (zstd_ret != 0);
|
||||
return 1;
|
||||
assert(sp != NULL);
|
||||
assert(sp->state == LSTATE_INIT_ENCODE);
|
||||
|
||||
(void)s;
|
||||
|
||||
in_buffer.src = bp;
|
||||
in_buffer.size = (size_t)cc;
|
||||
in_buffer.pos = 0;
|
||||
|
||||
do
|
||||
{
|
||||
zstd_ret =
|
||||
ZSTD_compressStream(sp->cstream, &sp->out_buffer, &in_buffer);
|
||||
if (ZSTD_isError(zstd_ret))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in ZSTD_compressStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
if (sp->out_buffer.pos == sp->out_buffer.size)
|
||||
{
|
||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->out_buffer.dst = tif->tif_rawcp;
|
||||
sp->out_buffer.pos = 0;
|
||||
}
|
||||
} while (in_buffer.pos < in_buffer.size);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
ZSTDCleanup(TIFF* tif)
|
||||
/*
|
||||
* Finish off an encoded strip by flushing it.
|
||||
*/
|
||||
static int ZSTDPostEncode(TIFF *tif)
|
||||
{
|
||||
ZSTDState* sp = LState(tif);
|
||||
static const char module[] = "ZSTDPostEncode";
|
||||
ZSTDState *sp = EncoderState(tif);
|
||||
size_t zstd_ret;
|
||||
|
||||
assert(sp != 0);
|
||||
|
||||
(void)TIFFPredictorCleanup(tif);
|
||||
|
||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||
|
||||
if (sp->dstream) {
|
||||
ZSTD_freeDStream(sp->dstream);
|
||||
sp->dstream = NULL;
|
||||
do
|
||||
{
|
||||
zstd_ret = ZSTD_endStream(sp->cstream, &sp->out_buffer);
|
||||
if (ZSTD_isError(zstd_ret))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Error in ZSTD_endStream(): %s",
|
||||
ZSTD_getErrorName(zstd_ret));
|
||||
return 0;
|
||||
}
|
||||
if (sp->cstream) {
|
||||
ZSTD_freeCStream(sp->cstream);
|
||||
sp->cstream = NULL;
|
||||
if (sp->out_buffer.pos > 0)
|
||||
{
|
||||
tif->tif_rawcc = sp->out_buffer.pos;
|
||||
if (!TIFFFlushData1(tif))
|
||||
return 0;
|
||||
sp->out_buffer.dst = tif->tif_rawcp;
|
||||
sp->out_buffer.pos = 0;
|
||||
}
|
||||
_TIFFfreeExt(tif, sp);
|
||||
tif->tif_data = NULL;
|
||||
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
} while (zstd_ret != 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
ZSTDVSetField(TIFF* tif, uint32_t tag, va_list ap)
|
||||
static void ZSTDCleanup(TIFF *tif)
|
||||
{
|
||||
static const char module[] = "ZSTDVSetField";
|
||||
ZSTDState* sp = LState(tif);
|
||||
ZSTDState *sp = LState(tif);
|
||||
|
||||
switch (tag) {
|
||||
assert(sp != 0);
|
||||
|
||||
(void)TIFFPredictorCleanup(tif);
|
||||
|
||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||
|
||||
if (sp->dstream)
|
||||
{
|
||||
ZSTD_freeDStream(sp->dstream);
|
||||
sp->dstream = NULL;
|
||||
}
|
||||
if (sp->cstream)
|
||||
{
|
||||
ZSTD_freeCStream(sp->cstream);
|
||||
sp->cstream = NULL;
|
||||
}
|
||||
_TIFFfreeExt(tif, sp);
|
||||
tif->tif_data = NULL;
|
||||
|
||||
_TIFFSetDefaultCompressionState(tif);
|
||||
}
|
||||
|
||||
static int ZSTDVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||
{
|
||||
static const char module[] = "ZSTDVSetField";
|
||||
ZSTDState *sp = LState(tif);
|
||||
|
||||
switch (tag)
|
||||
{
|
||||
case TIFFTAG_ZSTD_LEVEL:
|
||||
sp->compression_level = (int) va_arg(ap, int);
|
||||
if( sp->compression_level <= 0 ||
|
||||
sp->compression_level > ZSTD_maxCLevel() )
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"ZSTD_LEVEL should be between 1 and %d",
|
||||
ZSTD_maxCLevel());
|
||||
}
|
||||
return 1;
|
||||
sp->compression_level = (int)va_arg(ap, int);
|
||||
if (sp->compression_level <= 0 ||
|
||||
sp->compression_level > ZSTD_maxCLevel())
|
||||
{
|
||||
TIFFWarningExtR(tif, module,
|
||||
"ZSTD_LEVEL should be between 1 and %d",
|
||||
ZSTD_maxCLevel());
|
||||
}
|
||||
return 1;
|
||||
default:
|
||||
return (*sp->vsetparent)(tif, tag, ap);
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
return (*sp->vsetparent)(tif, tag, ap);
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
static int
|
||||
ZSTDVGetField(TIFF* tif, uint32_t tag, va_list ap)
|
||||
static int ZSTDVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||
{
|
||||
ZSTDState* sp = LState(tif);
|
||||
ZSTDState *sp = LState(tif);
|
||||
|
||||
switch (tag) {
|
||||
switch (tag)
|
||||
{
|
||||
case TIFFTAG_ZSTD_LEVEL:
|
||||
*va_arg(ap, int*) = sp->compression_level;
|
||||
break;
|
||||
*va_arg(ap, int *) = sp->compression_level;
|
||||
break;
|
||||
default:
|
||||
return (*sp->vgetparent)(tif, tag, ap);
|
||||
}
|
||||
return 1;
|
||||
return (*sp->vgetparent)(tif, tag, ap);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const TIFFField ZSTDFields[] = {
|
||||
{ TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||
TIFF_SETGET_UNDEFINED,
|
||||
FIELD_PSEUDO, TRUE, FALSE, "ZSTD compression_level", NULL },
|
||||
{TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "ZSTD compression_level",
|
||||
NULL},
|
||||
};
|
||||
|
||||
int
|
||||
TIFFInitZSTD(TIFF* tif, int scheme)
|
||||
int TIFFInitZSTD(TIFF *tif, int scheme)
|
||||
{
|
||||
static const char module[] = "TIFFInitZSTD";
|
||||
ZSTDState* sp;
|
||||
static const char module[] = "TIFFInitZSTD";
|
||||
ZSTDState *sp;
|
||||
|
||||
(void) scheme;
|
||||
assert( scheme == COMPRESSION_ZSTD );
|
||||
(void)scheme;
|
||||
assert(scheme == COMPRESSION_ZSTD);
|
||||
|
||||
/*
|
||||
* Merge codec-specific tag information.
|
||||
*/
|
||||
if (!_TIFFMergeFields(tif, ZSTDFields, TIFFArrayCount(ZSTDFields))) {
|
||||
TIFFErrorExtR(tif, module,
|
||||
"Merging ZSTD codec-specific tags failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate state block so tag methods have storage to record values.
|
||||
*/
|
||||
tif->tif_data = (uint8_t*) _TIFFmallocExt(tif, sizeof(ZSTDState));
|
||||
if (tif->tif_data == NULL)
|
||||
goto bad;
|
||||
sp = LState(tif);
|
||||
|
||||
/*
|
||||
* Override parent get/set field methods.
|
||||
*/
|
||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
||||
tif->tif_tagmethods.vgetfield = ZSTDVGetField; /* hook for codec tags */
|
||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
||||
tif->tif_tagmethods.vsetfield = ZSTDVSetField; /* hook for codec tags */
|
||||
|
||||
/* Default values for codec-specific fields */
|
||||
sp->compression_level = 9; /* default comp. level */
|
||||
sp->state = 0;
|
||||
sp->dstream = 0;
|
||||
sp->cstream = 0;
|
||||
sp->out_buffer.dst = NULL;
|
||||
sp->out_buffer.size = 0;
|
||||
sp->out_buffer.pos = 0;
|
||||
|
||||
/*
|
||||
* Install codec methods.
|
||||
*/
|
||||
tif->tif_fixuptags = ZSTDFixupTags;
|
||||
tif->tif_setupdecode = ZSTDSetupDecode;
|
||||
tif->tif_predecode = ZSTDPreDecode;
|
||||
tif->tif_decoderow = ZSTDDecode;
|
||||
tif->tif_decodestrip = ZSTDDecode;
|
||||
tif->tif_decodetile = ZSTDDecode;
|
||||
tif->tif_setupencode = ZSTDSetupEncode;
|
||||
tif->tif_preencode = ZSTDPreEncode;
|
||||
tif->tif_postencode = ZSTDPostEncode;
|
||||
tif->tif_encoderow = ZSTDEncode;
|
||||
tif->tif_encodestrip = ZSTDEncode;
|
||||
tif->tif_encodetile = ZSTDEncode;
|
||||
tif->tif_cleanup = ZSTDCleanup;
|
||||
/*
|
||||
* Setup predictor setup.
|
||||
*/
|
||||
(void) TIFFPredictorInit(tif);
|
||||
return 1;
|
||||
bad:
|
||||
TIFFErrorExtR(tif, module,
|
||||
"No space for ZSTD state block");
|
||||
/*
|
||||
* Merge codec-specific tag information.
|
||||
*/
|
||||
if (!_TIFFMergeFields(tif, ZSTDFields, TIFFArrayCount(ZSTDFields)))
|
||||
{
|
||||
TIFFErrorExtR(tif, module, "Merging ZSTD codec-specific tags failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate state block so tag methods have storage to record values.
|
||||
*/
|
||||
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(ZSTDState));
|
||||
if (tif->tif_data == NULL)
|
||||
goto bad;
|
||||
sp = LState(tif);
|
||||
|
||||
/*
|
||||
* Override parent get/set field methods.
|
||||
*/
|
||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
||||
tif->tif_tagmethods.vgetfield = ZSTDVGetField; /* hook for codec tags */
|
||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
||||
tif->tif_tagmethods.vsetfield = ZSTDVSetField; /* hook for codec tags */
|
||||
|
||||
/* Default values for codec-specific fields */
|
||||
sp->compression_level = 9; /* default comp. level */
|
||||
sp->state = 0;
|
||||
sp->dstream = 0;
|
||||
sp->cstream = 0;
|
||||
sp->out_buffer.dst = NULL;
|
||||
sp->out_buffer.size = 0;
|
||||
sp->out_buffer.pos = 0;
|
||||
|
||||
/*
|
||||
* Install codec methods.
|
||||
*/
|
||||
tif->tif_fixuptags = ZSTDFixupTags;
|
||||
tif->tif_setupdecode = ZSTDSetupDecode;
|
||||
tif->tif_predecode = ZSTDPreDecode;
|
||||
tif->tif_decoderow = ZSTDDecode;
|
||||
tif->tif_decodestrip = ZSTDDecode;
|
||||
tif->tif_decodetile = ZSTDDecode;
|
||||
tif->tif_setupencode = ZSTDSetupEncode;
|
||||
tif->tif_preencode = ZSTDPreEncode;
|
||||
tif->tif_postencode = ZSTDPostEncode;
|
||||
tif->tif_encoderow = ZSTDEncode;
|
||||
tif->tif_encodestrip = ZSTDEncode;
|
||||
tif->tif_encodetile = ZSTDEncode;
|
||||
tif->tif_cleanup = ZSTDCleanup;
|
||||
/*
|
||||
* Setup predictor setup.
|
||||
*/
|
||||
(void)TIFFPredictorInit(tif);
|
||||
return 1;
|
||||
bad:
|
||||
TIFFErrorExtR(tif, module, "No space for ZSTD state block");
|
||||
return 0;
|
||||
}
|
||||
#endif /* ZSTD_SUPPORT */
|
||||
|
||||
1413
libtiff/tiff.h
1413
libtiff/tiff.h
File diff suppressed because it is too large
Load Diff
831
libtiff/tiffio.h
831
libtiff/tiffio.h
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#ifndef _TIFFIO_
|
||||
#define _TIFFIO_
|
||||
#define _TIFFIO_
|
||||
|
||||
/*
|
||||
* TIFF I/O Library Definitions.
|
||||
@@ -65,17 +65,17 @@ typedef struct tiff TIFF;
|
||||
typedef TIFF_SSIZE_T tmsize_t;
|
||||
#define TIFF_TMSIZE_T_MAX (tmsize_t)(SIZE_MAX >> 1)
|
||||
|
||||
typedef uint64_t toff_t; /* file offset */
|
||||
typedef uint64_t toff_t; /* file offset */
|
||||
/* the following are deprecated and should be replaced by their defining
|
||||
counterparts */
|
||||
typedef uint32_t ttag_t; /* directory tag */
|
||||
typedef uint16_t tdir_t; /* directory index */
|
||||
typedef uint16_t tsample_t; /* sample number */
|
||||
typedef uint32_t tstrile_t; /* strip or tile number */
|
||||
typedef tstrile_t tstrip_t; /* strip number */
|
||||
typedef tstrile_t ttile_t; /* tile number */
|
||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
||||
typedef void* tdata_t; /* image data ref */
|
||||
typedef uint32_t ttag_t; /* directory tag */
|
||||
typedef uint16_t tdir_t; /* directory index */
|
||||
typedef uint16_t tsample_t; /* sample number */
|
||||
typedef uint32_t tstrile_t; /* strip or tile number */
|
||||
typedef tstrile_t tstrip_t; /* strip number */
|
||||
typedef tstrile_t ttile_t; /* tile number */
|
||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
||||
typedef void *tdata_t; /* image data ref */
|
||||
|
||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
||||
#define __WIN32__
|
||||
@@ -89,21 +89,22 @@ typedef void* tdata_t; /* image data ref */
|
||||
*/
|
||||
|
||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
||||
# define AVOID_WIN32_FILEIO
|
||||
# endif
|
||||
#if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && \
|
||||
!defined(USE_WIN32_FILEIO)
|
||||
#define AVOID_WIN32_FILEIO
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(USE_WIN32_FILEIO)
|
||||
# define VC_EXTRALEAN
|
||||
# include <windows.h>
|
||||
# ifdef __WIN32__
|
||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
||||
# else
|
||||
typedef HFILE thandle_t; /* client data handle */
|
||||
# endif /* __WIN32__ */
|
||||
#define VC_EXTRALEAN
|
||||
#include <windows.h>
|
||||
#ifdef __WIN32__
|
||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
||||
#else
|
||||
typedef void* thandle_t; /* client data handle */
|
||||
typedef HFILE thandle_t; /* client data handle */
|
||||
#endif /* __WIN32__ */
|
||||
#else
|
||||
typedef void *thandle_t; /* client data handle */
|
||||
#endif /* USE_WIN32_FILEIO */
|
||||
|
||||
/*
|
||||
@@ -112,15 +113,15 @@ typedef void* thandle_t; /* client data handle */
|
||||
* very large. Bit-or these flags to enable printing
|
||||
* multiple items.
|
||||
*/
|
||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
||||
|
||||
/*
|
||||
/*
|
||||
* Colour conversion stuff
|
||||
*/
|
||||
|
||||
@@ -135,42 +136,45 @@ typedef void* thandle_t; /* client data handle */
|
||||
|
||||
/* Structure for holding information about a display device. */
|
||||
|
||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
||||
|
||||
typedef struct {
|
||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
||||
float d_YCR; /* Light o/p for reference white */
|
||||
float d_YCG;
|
||||
float d_YCB;
|
||||
uint32_t d_Vrwr; /* Pixel values for ref. white */
|
||||
uint32_t d_Vrwg;
|
||||
uint32_t d_Vrwb;
|
||||
float d_Y0R; /* Residual light for black pixel */
|
||||
float d_Y0G;
|
||||
float d_Y0B;
|
||||
float d_gammaR; /* Gamma values for the three guns */
|
||||
float d_gammaG;
|
||||
float d_gammaB;
|
||||
typedef struct
|
||||
{
|
||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
||||
float d_YCR; /* Light o/p for reference white */
|
||||
float d_YCG;
|
||||
float d_YCB;
|
||||
uint32_t d_Vrwr; /* Pixel values for ref. white */
|
||||
uint32_t d_Vrwg;
|
||||
uint32_t d_Vrwb;
|
||||
float d_Y0R; /* Residual light for black pixel */
|
||||
float d_Y0G;
|
||||
float d_Y0B;
|
||||
float d_gammaR; /* Gamma values for the three guns */
|
||||
float d_gammaG;
|
||||
float d_gammaB;
|
||||
} TIFFDisplay;
|
||||
|
||||
typedef struct { /* YCbCr->RGB support */
|
||||
TIFFRGBValue* clamptab; /* range clamping table */
|
||||
int* Cr_r_tab;
|
||||
int* Cb_b_tab;
|
||||
int32_t* Cr_g_tab;
|
||||
int32_t* Cb_g_tab;
|
||||
int32_t* Y_tab;
|
||||
typedef struct
|
||||
{ /* YCbCr->RGB support */
|
||||
TIFFRGBValue *clamptab; /* range clamping table */
|
||||
int *Cr_r_tab;
|
||||
int *Cb_b_tab;
|
||||
int32_t *Cr_g_tab;
|
||||
int32_t *Cb_g_tab;
|
||||
int32_t *Y_tab;
|
||||
} TIFFYCbCrToRGB;
|
||||
|
||||
typedef struct { /* CIE Lab 1976->RGB support */
|
||||
int range; /* Size of conversion table */
|
||||
typedef struct
|
||||
{ /* CIE Lab 1976->RGB support */
|
||||
int range; /* Size of conversion table */
|
||||
#define CIELABTORGB_TABLE_RANGE 1500
|
||||
float rstep, gstep, bstep;
|
||||
float X0, Y0, Z0; /* Reference white point */
|
||||
TIFFDisplay display;
|
||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
||||
float rstep, gstep, bstep;
|
||||
float X0, Y0, Z0; /* Reference white point */
|
||||
TIFFDisplay display;
|
||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
||||
} TIFFCIELabToRGB;
|
||||
|
||||
/*
|
||||
@@ -180,63 +184,66 @@ typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
||||
/*
|
||||
* The image reading and conversion routines invoke
|
||||
* ``put routines'' to copy/image/whatever tiles of
|
||||
* raw image data. A default set of routines are
|
||||
* raw image data. A default set of routines are
|
||||
* provided to convert/copy raw image data to 8-bit
|
||||
* packed ABGR format rasters. Applications can supply
|
||||
* alternate routines that unpack the data into a
|
||||
* different format or, for example, unpack the data
|
||||
* and draw the unpacked raster on the display.
|
||||
*/
|
||||
typedef void (*tileContigRoutine)
|
||||
(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t, uint32_t, uint32_t, int32_t, int32_t,
|
||||
unsigned char*);
|
||||
typedef void (*tileSeparateRoutine)
|
||||
(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t, uint32_t, uint32_t, int32_t, int32_t,
|
||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
||||
typedef void (*tileContigRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||
uint32_t, uint32_t, uint32_t, int32_t,
|
||||
int32_t, unsigned char *);
|
||||
typedef void (*tileSeparateRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||
uint32_t, uint32_t, uint32_t, int32_t,
|
||||
int32_t, unsigned char *, unsigned char *,
|
||||
unsigned char *, unsigned char *);
|
||||
/*
|
||||
* RGBA-reader state.
|
||||
*/
|
||||
struct _TIFFRGBAImage {
|
||||
TIFF* tif; /* image handle */
|
||||
int stoponerr; /* stop on read error */
|
||||
int isContig; /* data is packed/separate */
|
||||
int alpha; /* type of alpha data present */
|
||||
uint32_t width; /* image width */
|
||||
uint32_t height; /* image height */
|
||||
uint16_t bitspersample; /* image bits/sample */
|
||||
uint16_t samplesperpixel; /* image samples/pixel */
|
||||
uint16_t orientation; /* image orientation */
|
||||
uint16_t req_orientation; /* requested orientation */
|
||||
uint16_t photometric; /* image photometric interp */
|
||||
uint16_t* redcmap; /* colormap palette */
|
||||
uint16_t* greencmap;
|
||||
uint16_t* bluecmap;
|
||||
/* get image data routine */
|
||||
int (*get)(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t);
|
||||
/* put decoded strip/tile */
|
||||
union {
|
||||
void (*any)(TIFFRGBAImage*);
|
||||
tileContigRoutine contig;
|
||||
tileSeparateRoutine separate;
|
||||
} put;
|
||||
TIFFRGBValue* Map; /* sample mapping array */
|
||||
uint32_t** BWmap; /* black&white map */
|
||||
uint32_t** PALmap; /* palette image map */
|
||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
||||
struct _TIFFRGBAImage
|
||||
{
|
||||
TIFF *tif; /* image handle */
|
||||
int stoponerr; /* stop on read error */
|
||||
int isContig; /* data is packed/separate */
|
||||
int alpha; /* type of alpha data present */
|
||||
uint32_t width; /* image width */
|
||||
uint32_t height; /* image height */
|
||||
uint16_t bitspersample; /* image bits/sample */
|
||||
uint16_t samplesperpixel; /* image samples/pixel */
|
||||
uint16_t orientation; /* image orientation */
|
||||
uint16_t req_orientation; /* requested orientation */
|
||||
uint16_t photometric; /* image photometric interp */
|
||||
uint16_t *redcmap; /* colormap palette */
|
||||
uint16_t *greencmap;
|
||||
uint16_t *bluecmap;
|
||||
/* get image data routine */
|
||||
int (*get)(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
|
||||
/* put decoded strip/tile */
|
||||
union
|
||||
{
|
||||
void (*any)(TIFFRGBAImage *);
|
||||
tileContigRoutine contig;
|
||||
tileSeparateRoutine separate;
|
||||
} put;
|
||||
TIFFRGBValue *Map; /* sample mapping array */
|
||||
uint32_t **BWmap; /* black&white map */
|
||||
uint32_t **PALmap; /* palette image map */
|
||||
TIFFYCbCrToRGB *ycbcr; /* YCbCr conversion state */
|
||||
TIFFCIELabToRGB *cielab; /* CIE L*a*b conversion state */
|
||||
|
||||
uint8_t* UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
|
||||
uint8_t* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
||||
uint8_t *UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
|
||||
uint8_t *Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
||||
|
||||
int row_offset;
|
||||
int col_offset;
|
||||
int row_offset;
|
||||
int col_offset;
|
||||
};
|
||||
|
||||
/*
|
||||
* Macros for extracting components from the
|
||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
||||
*/
|
||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
||||
#define TIFFGetR(abgr) ((abgr)&0xff)
|
||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
||||
@@ -248,15 +255,16 @@ struct _TIFFRGBAImage {
|
||||
* More codecs may be registered through calls to the library
|
||||
* and/or the builtin implementations may be overridden.
|
||||
*/
|
||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
||||
typedef struct {
|
||||
char* name;
|
||||
uint16_t scheme;
|
||||
TIFFInitMethod init;
|
||||
typedef int (*TIFFInitMethod)(TIFF *, int);
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
uint16_t scheme;
|
||||
TIFFInitMethod init;
|
||||
} TIFFCodec;
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* share internal LogLuv conversion routines? */
|
||||
#ifndef LOGLUV_PUBLIC
|
||||
@@ -264,327 +272,374 @@ typedef struct {
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) || defined(__attribute__)
|
||||
# define TIFF_ATTRIBUTE(x) __attribute__(x)
|
||||
#define TIFF_ATTRIBUTE(x) __attribute__(x)
|
||||
#else
|
||||
# define TIFF_ATTRIBUTE(x) /*nothing*/
|
||||
#define TIFF_ATTRIBUTE(x) /*nothing*/
|
||||
#endif
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
||||
typedef int (*TIFFErrorHandlerExtR)(TIFF*, void* user_data, const char*, const char*, va_list);
|
||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
|
||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
||||
typedef int (*TIFFCloseProc)(thandle_t);
|
||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
||||
typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
|
||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
|
||||
typedef void (*TIFFExtendProc)(TIFF*);
|
||||
typedef void (*TIFFErrorHandler)(const char *, const char *, va_list);
|
||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char *, const char *,
|
||||
va_list);
|
||||
typedef int (*TIFFErrorHandlerExtR)(TIFF *, void *user_data, const char *,
|
||||
const char *, va_list);
|
||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void *, tmsize_t);
|
||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
||||
typedef int (*TIFFCloseProc)(thandle_t);
|
||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
||||
typedef int (*TIFFMapFileProc)(thandle_t, void **base, toff_t *size);
|
||||
typedef void (*TIFFUnmapFileProc)(thandle_t, void *base, toff_t size);
|
||||
typedef void (*TIFFExtendProc)(TIFF *);
|
||||
|
||||
extern const char* TIFFGetVersion(void);
|
||||
extern const char *TIFFGetVersion(void);
|
||||
|
||||
extern const TIFFCodec* TIFFFindCODEC(uint16_t);
|
||||
extern TIFFCodec* TIFFRegisterCODEC(uint16_t, const char*, TIFFInitMethod);
|
||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
||||
extern int TIFFIsCODECConfigured(uint16_t);
|
||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
||||
extern const TIFFCodec *TIFFFindCODEC(uint16_t);
|
||||
extern TIFFCodec *TIFFRegisterCODEC(uint16_t, const char *, TIFFInitMethod);
|
||||
extern void TIFFUnRegisterCODEC(TIFFCodec *);
|
||||
extern int TIFFIsCODECConfigured(uint16_t);
|
||||
extern TIFFCodec *TIFFGetConfiguredCODECs(void);
|
||||
|
||||
/*
|
||||
* Auxiliary functions.
|
||||
*/
|
||||
/*
|
||||
* Auxiliary functions.
|
||||
*/
|
||||
|
||||
extern void* _TIFFmalloc(tmsize_t s);
|
||||
extern void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz);
|
||||
extern void* _TIFFrealloc(void* p, tmsize_t s);
|
||||
extern void _TIFFmemset(void* p, int v, tmsize_t c);
|
||||
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
|
||||
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
|
||||
extern void _TIFFfree(void* p);
|
||||
extern void *_TIFFmalloc(tmsize_t s);
|
||||
extern void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz);
|
||||
extern void *_TIFFrealloc(void *p, tmsize_t s);
|
||||
extern void _TIFFmemset(void *p, int v, tmsize_t c);
|
||||
extern void _TIFFmemcpy(void *d, const void *s, tmsize_t c);
|
||||
extern int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c);
|
||||
extern void _TIFFfree(void *p);
|
||||
|
||||
/*
|
||||
** Stuff, related to tag handling and creating custom tags.
|
||||
*/
|
||||
extern int TIFFGetTagListCount( TIFF * );
|
||||
extern uint32_t TIFFGetTagListEntry(TIFF *, int tag_index );
|
||||
|
||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
||||
#define TIFF_VARIABLE2 -3 /* marker for uint32_t var-length tags */
|
||||
/*
|
||||
** Stuff, related to tag handling and creating custom tags.
|
||||
*/
|
||||
extern int TIFFGetTagListCount(TIFF *);
|
||||
extern uint32_t TIFFGetTagListEntry(TIFF *, int tag_index);
|
||||
|
||||
#define FIELD_CUSTOM 65
|
||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
||||
#define TIFF_VARIABLE2 -3 /* marker for uint32_t var-length tags */
|
||||
|
||||
typedef struct _TIFFField TIFFField;
|
||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
||||
#define FIELD_CUSTOM 65
|
||||
|
||||
extern const TIFFField* TIFFFindField(TIFF *, uint32_t, TIFFDataType);
|
||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32_t);
|
||||
extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
|
||||
typedef struct _TIFFField TIFFField;
|
||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
||||
|
||||
extern uint32_t TIFFFieldTag(const TIFFField*);
|
||||
extern const char* TIFFFieldName(const TIFFField*);
|
||||
extern TIFFDataType TIFFFieldDataType(const TIFFField*);
|
||||
extern int TIFFFieldPassCount(const TIFFField*);
|
||||
extern int TIFFFieldReadCount(const TIFFField*);
|
||||
extern int TIFFFieldWriteCount(const TIFFField*);
|
||||
extern int TIFFFieldSetGetSize(const TIFFField*); /* returns internal storage size of TIFFSetGetFieldType in bytes. */
|
||||
extern int TIFFFieldSetGetCountSize(const TIFFField*); /* returns size of count parameter 0=none, 2=uint16_t, 4=uint32_t */
|
||||
extern int TIFFFieldIsAnonymous(const TIFFField *);
|
||||
extern const TIFFField *TIFFFindField(TIFF *, uint32_t, TIFFDataType);
|
||||
extern const TIFFField *TIFFFieldWithTag(TIFF *, uint32_t);
|
||||
extern const TIFFField *TIFFFieldWithName(TIFF *, const char *);
|
||||
|
||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32_t, va_list);
|
||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32_t, va_list);
|
||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
||||
extern uint32_t TIFFFieldTag(const TIFFField *);
|
||||
extern const char *TIFFFieldName(const TIFFField *);
|
||||
extern TIFFDataType TIFFFieldDataType(const TIFFField *);
|
||||
extern int TIFFFieldPassCount(const TIFFField *);
|
||||
extern int TIFFFieldReadCount(const TIFFField *);
|
||||
extern int TIFFFieldWriteCount(const TIFFField *);
|
||||
extern int
|
||||
TIFFFieldSetGetSize(const TIFFField *); /* returns internal storage size of
|
||||
TIFFSetGetFieldType in bytes. */
|
||||
extern int TIFFFieldSetGetCountSize(
|
||||
const TIFFField *); /* returns size of count parameter 0=none,
|
||||
2=uint16_t, 4=uint32_t */
|
||||
extern int TIFFFieldIsAnonymous(const TIFFField *);
|
||||
|
||||
typedef struct {
|
||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
||||
TIFFPrintMethod printdir; /* directory print routine */
|
||||
} TIFFTagMethods;
|
||||
typedef int (*TIFFVSetMethod)(TIFF *, uint32_t, va_list);
|
||||
typedef int (*TIFFVGetMethod)(TIFF *, uint32_t, va_list);
|
||||
typedef void (*TIFFPrintMethod)(TIFF *, FILE *, long);
|
||||
|
||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
||||
typedef struct
|
||||
{
|
||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
||||
TIFFPrintMethod printdir; /* directory print routine */
|
||||
} TIFFTagMethods;
|
||||
|
||||
extern void TIFFCleanup(TIFF* tif);
|
||||
extern void TIFFClose(TIFF* tif);
|
||||
extern int TIFFFlush(TIFF* tif);
|
||||
extern int TIFFFlushData(TIFF* tif);
|
||||
extern int TIFFGetField(TIFF* tif, uint32_t tag, ...);
|
||||
extern int TIFFVGetField(TIFF* tif, uint32_t tag, va_list ap);
|
||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32_t tag, ...);
|
||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32_t tag, va_list ap);
|
||||
extern int TIFFReadDirectory(TIFF* tif);
|
||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
||||
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
|
||||
extern int TIFFReadGPSDirectory(TIFF* tif, toff_t diroff);
|
||||
extern uint64_t TIFFScanlineSize64(TIFF* tif);
|
||||
extern tmsize_t TIFFScanlineSize(TIFF* tif);
|
||||
extern uint64_t TIFFRasterScanlineSize64(TIFF* tif);
|
||||
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
|
||||
extern uint64_t TIFFStripSize64(TIFF* tif);
|
||||
extern tmsize_t TIFFStripSize(TIFF* tif);
|
||||
extern uint64_t TIFFRawStripSize64(TIFF* tif, uint32_t strip);
|
||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32_t strip);
|
||||
extern uint64_t TIFFVStripSize64(TIFF* tif, uint32_t nrows);
|
||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32_t nrows);
|
||||
extern uint64_t TIFFTileRowSize64(TIFF* tif);
|
||||
extern tmsize_t TIFFTileRowSize(TIFF* tif);
|
||||
extern uint64_t TIFFTileSize64(TIFF* tif);
|
||||
extern tmsize_t TIFFTileSize(TIFF* tif);
|
||||
extern uint64_t TIFFVTileSize64(TIFF* tif, uint32_t nrows);
|
||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32_t nrows);
|
||||
extern uint32_t TIFFDefaultStripSize(TIFF* tif, uint32_t request);
|
||||
extern void TIFFDefaultTileSize(TIFF*, uint32_t*, uint32_t*);
|
||||
extern int TIFFFileno(TIFF*);
|
||||
extern int TIFFSetFileno(TIFF*, int);
|
||||
extern thandle_t TIFFClientdata(TIFF*);
|
||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
||||
extern int TIFFGetMode(TIFF*);
|
||||
extern int TIFFSetMode(TIFF*, int);
|
||||
extern int TIFFIsTiled(TIFF*);
|
||||
extern int TIFFIsByteSwapped(TIFF*);
|
||||
extern int TIFFIsUpSampled(TIFF*);
|
||||
extern int TIFFIsMSB2LSB(TIFF*);
|
||||
extern int TIFFIsBigEndian(TIFF*);
|
||||
extern int TIFFIsBigTIFF(TIFF*);
|
||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
||||
extern uint32_t TIFFCurrentRow(TIFF*);
|
||||
extern uint16_t TIFFCurrentDirectory(TIFF*);
|
||||
extern uint16_t TIFFNumberOfDirectories(TIFF*);
|
||||
extern uint64_t TIFFCurrentDirOffset(TIFF*);
|
||||
extern uint32_t TIFFCurrentStrip(TIFF*);
|
||||
extern uint32_t TIFFCurrentTile(TIFF* tif);
|
||||
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
||||
extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
|
||||
extern int TIFFSetupStrips(TIFF *);
|
||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
||||
extern void TIFFFreeDirectory(TIFF*);
|
||||
extern int TIFFCreateDirectory(TIFF*);
|
||||
extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
||||
extern int TIFFCreateEXIFDirectory(TIFF*);
|
||||
extern int TIFFCreateGPSDirectory(TIFF*);
|
||||
extern int TIFFLastDirectory(TIFF*);
|
||||
extern int TIFFSetDirectory(TIFF*, uint16_t);
|
||||
extern int TIFFSetSubDirectory(TIFF*, uint64_t);
|
||||
extern int TIFFUnlinkDirectory(TIFF*, uint16_t);
|
||||
extern int TIFFSetField(TIFF*, uint32_t, ...);
|
||||
extern int TIFFVSetField(TIFF*, uint32_t, va_list);
|
||||
extern int TIFFUnsetField(TIFF*, uint32_t);
|
||||
extern int TIFFWriteDirectory(TIFF *);
|
||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64_t *);
|
||||
extern int TIFFCheckpointDirectory(TIFF *);
|
||||
extern int TIFFRewriteDirectory(TIFF *);
|
||||
extern int TIFFDeferStrileArrayWriting(TIFF *);
|
||||
extern int TIFFForceStrileArrayWriting(TIFF* );
|
||||
extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
|
||||
extern void *TIFFGetClientInfo(TIFF *, const char *);
|
||||
extern void TIFFSetClientInfo(TIFF *, void *, const char *);
|
||||
|
||||
extern void TIFFCleanup(TIFF *tif);
|
||||
extern void TIFFClose(TIFF *tif);
|
||||
extern int TIFFFlush(TIFF *tif);
|
||||
extern int TIFFFlushData(TIFF *tif);
|
||||
extern int TIFFGetField(TIFF *tif, uint32_t tag, ...);
|
||||
extern int TIFFVGetField(TIFF *tif, uint32_t tag, va_list ap);
|
||||
extern int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...);
|
||||
extern int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap);
|
||||
extern int TIFFReadDirectory(TIFF *tif);
|
||||
extern int TIFFReadCustomDirectory(TIFF *tif, toff_t diroff,
|
||||
const TIFFFieldArray *infoarray);
|
||||
extern int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff);
|
||||
extern int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff);
|
||||
extern uint64_t TIFFScanlineSize64(TIFF *tif);
|
||||
extern tmsize_t TIFFScanlineSize(TIFF *tif);
|
||||
extern uint64_t TIFFRasterScanlineSize64(TIFF *tif);
|
||||
extern tmsize_t TIFFRasterScanlineSize(TIFF *tif);
|
||||
extern uint64_t TIFFStripSize64(TIFF *tif);
|
||||
extern tmsize_t TIFFStripSize(TIFF *tif);
|
||||
extern uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip);
|
||||
extern tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip);
|
||||
extern uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows);
|
||||
extern tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows);
|
||||
extern uint64_t TIFFTileRowSize64(TIFF *tif);
|
||||
extern tmsize_t TIFFTileRowSize(TIFF *tif);
|
||||
extern uint64_t TIFFTileSize64(TIFF *tif);
|
||||
extern tmsize_t TIFFTileSize(TIFF *tif);
|
||||
extern uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows);
|
||||
extern tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows);
|
||||
extern uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request);
|
||||
extern void TIFFDefaultTileSize(TIFF *, uint32_t *, uint32_t *);
|
||||
extern int TIFFFileno(TIFF *);
|
||||
extern int TIFFSetFileno(TIFF *, int);
|
||||
extern thandle_t TIFFClientdata(TIFF *);
|
||||
extern thandle_t TIFFSetClientdata(TIFF *, thandle_t);
|
||||
extern int TIFFGetMode(TIFF *);
|
||||
extern int TIFFSetMode(TIFF *, int);
|
||||
extern int TIFFIsTiled(TIFF *);
|
||||
extern int TIFFIsByteSwapped(TIFF *);
|
||||
extern int TIFFIsUpSampled(TIFF *);
|
||||
extern int TIFFIsMSB2LSB(TIFF *);
|
||||
extern int TIFFIsBigEndian(TIFF *);
|
||||
extern int TIFFIsBigTIFF(TIFF *);
|
||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF *);
|
||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF *);
|
||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF *);
|
||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF *);
|
||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF *);
|
||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF *);
|
||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *);
|
||||
extern uint32_t TIFFCurrentRow(TIFF *);
|
||||
extern uint16_t TIFFCurrentDirectory(TIFF *);
|
||||
extern uint16_t TIFFNumberOfDirectories(TIFF *);
|
||||
extern uint64_t TIFFCurrentDirOffset(TIFF *);
|
||||
extern uint32_t TIFFCurrentStrip(TIFF *);
|
||||
extern uint32_t TIFFCurrentTile(TIFF *tif);
|
||||
extern int TIFFReadBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
||||
extern int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
||||
extern int TIFFSetupStrips(TIFF *);
|
||||
extern int TIFFWriteCheck(TIFF *, int, const char *);
|
||||
extern void TIFFFreeDirectory(TIFF *);
|
||||
extern int TIFFCreateDirectory(TIFF *);
|
||||
extern int TIFFCreateCustomDirectory(TIFF *, const TIFFFieldArray *);
|
||||
extern int TIFFCreateEXIFDirectory(TIFF *);
|
||||
extern int TIFFCreateGPSDirectory(TIFF *);
|
||||
extern int TIFFLastDirectory(TIFF *);
|
||||
extern int TIFFSetDirectory(TIFF *, uint16_t);
|
||||
extern int TIFFSetSubDirectory(TIFF *, uint64_t);
|
||||
extern int TIFFUnlinkDirectory(TIFF *, uint16_t);
|
||||
extern int TIFFSetField(TIFF *, uint32_t, ...);
|
||||
extern int TIFFVSetField(TIFF *, uint32_t, va_list);
|
||||
extern int TIFFUnsetField(TIFF *, uint32_t);
|
||||
extern int TIFFWriteDirectory(TIFF *);
|
||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64_t *);
|
||||
extern int TIFFCheckpointDirectory(TIFF *);
|
||||
extern int TIFFRewriteDirectory(TIFF *);
|
||||
extern int TIFFDeferStrileArrayWriting(TIFF *);
|
||||
extern int TIFFForceStrileArrayWriting(TIFF *);
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32_t row, uint16_t sample = 0);
|
||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32_t row, uint16_t sample = 0);
|
||||
extern int TIFFReadRGBAImage(TIFF*, uint32_t, uint32_t, uint32_t*, int = 0);
|
||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32_t, uint32_t, uint32_t*,
|
||||
int = ORIENTATION_BOTLEFT, int = 0);
|
||||
extern void TIFFPrintDirectory(TIFF *, FILE *, long = 0);
|
||||
extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
|
||||
uint16_t sample = 0);
|
||||
extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
|
||||
uint16_t sample = 0);
|
||||
extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||
int = 0);
|
||||
extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||
int = ORIENTATION_BOTLEFT, int = 0);
|
||||
#else
|
||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32_t row, uint16_t sample);
|
||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32_t row, uint16_t sample);
|
||||
extern int TIFFReadRGBAImage(TIFF*, uint32_t, uint32_t, uint32_t*, int);
|
||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32_t, uint32_t, uint32_t*, int, int);
|
||||
extern void TIFFPrintDirectory(TIFF *, FILE *, long);
|
||||
extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
|
||||
uint16_t sample);
|
||||
extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
|
||||
uint16_t sample);
|
||||
extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *, int);
|
||||
extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||
int, int);
|
||||
#endif
|
||||
|
||||
extern int TIFFReadRGBAStrip(TIFF*, uint32_t, uint32_t * );
|
||||
extern int TIFFReadRGBATile(TIFF*, uint32_t, uint32_t, uint32_t * );
|
||||
extern int TIFFReadRGBAStripExt(TIFF*, uint32_t, uint32_t *, int stop_on_error );
|
||||
extern int TIFFReadRGBATileExt(TIFF*, uint32_t, uint32_t, uint32_t *, int stop_on_error );
|
||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t);
|
||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
||||
extern int TIFFReadRGBAStrip(TIFF *, uint32_t, uint32_t *);
|
||||
extern int TIFFReadRGBATile(TIFF *, uint32_t, uint32_t, uint32_t *);
|
||||
extern int TIFFReadRGBAStripExt(TIFF *, uint32_t, uint32_t *,
|
||||
int stop_on_error);
|
||||
extern int TIFFReadRGBATileExt(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||
int stop_on_error);
|
||||
extern int TIFFRGBAImageOK(TIFF *, char[1024]);
|
||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage *, TIFF *, int, char[1024]);
|
||||
extern int TIFFRGBAImageGet(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||
uint32_t);
|
||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage *);
|
||||
|
||||
extern const char* TIFFFileName(TIFF*);
|
||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
||||
extern void TIFFError(const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,2,3)));
|
||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
||||
extern void TIFFWarning(const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,2,3)));
|
||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
||||
extern const char *TIFFFileName(TIFF *);
|
||||
extern const char *TIFFSetFileName(TIFF *, const char *);
|
||||
extern void TIFFError(const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
|
||||
extern void TIFFErrorExt(thandle_t, const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||
extern void TIFFWarning(const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
|
||||
extern void TIFFWarningExt(thandle_t, const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
||||
|
||||
extern void TIFFWarningExtR(TIFF*, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
||||
extern void TIFFErrorExtR(TIFF*, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
||||
extern void TIFFWarningExtR(TIFF *, const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||
extern void TIFFErrorExtR(TIFF *, const char *, const char *, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||
|
||||
typedef struct TIFFOpenOptions TIFFOpenOptions;
|
||||
extern TIFFOpenOptions* TIFFOpenOptionsAlloc(void);
|
||||
extern void TIFFOpenOptionsFree(TIFFOpenOptions*);
|
||||
extern void TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions* opts, tmsize_t max_single_mem_alloc);
|
||||
extern void TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions* opts, TIFFErrorHandlerExtR handler, void* errorhandler_user_data);
|
||||
extern void TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions* opts, TIFFErrorHandlerExtR handler, void* warnhandler_user_data);
|
||||
typedef struct TIFFOpenOptions TIFFOpenOptions;
|
||||
extern TIFFOpenOptions *TIFFOpenOptionsAlloc(void);
|
||||
extern void TIFFOpenOptionsFree(TIFFOpenOptions *);
|
||||
extern void
|
||||
TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts,
|
||||
tmsize_t max_single_mem_alloc);
|
||||
extern void
|
||||
TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts,
|
||||
TIFFErrorHandlerExtR handler,
|
||||
void *errorhandler_user_data);
|
||||
extern void
|
||||
TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts,
|
||||
TIFFErrorHandlerExtR handler,
|
||||
void *warnhandler_user_data);
|
||||
|
||||
extern TIFF* TIFFOpen(const char*, const char*);
|
||||
extern TIFF* TIFFOpenExt(const char*, const char*, TIFFOpenOptions* opts);
|
||||
# ifdef __WIN32__
|
||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
||||
extern TIFF* TIFFOpenWExt(const wchar_t*, const char*, TIFFOpenOptions* opts);
|
||||
# endif /* __WIN32__ */
|
||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
||||
extern TIFF* TIFFFdOpenExt(int, const char*, const char*, TIFFOpenOptions* opts);
|
||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
||||
thandle_t,
|
||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||
TIFFSeekProc, TIFFCloseProc,
|
||||
TIFFSizeProc,
|
||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
||||
extern TIFF* TIFFClientOpenExt(const char*, const char*,
|
||||
thandle_t,
|
||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||
TIFFSeekProc, TIFFCloseProc,
|
||||
TIFFSizeProc,
|
||||
TIFFMapFileProc, TIFFUnmapFileProc,
|
||||
TIFFOpenOptions* opts);
|
||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
||||
extern uint32_t TIFFComputeTile(TIFF* tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s);
|
||||
extern int TIFFCheckTile(TIFF* tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s);
|
||||
extern uint32_t TIFFNumberOfTiles(TIFF*);
|
||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32_t x, uint32_t y, uint32_t z, uint16_t s);
|
||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32_t x, uint32_t y, uint32_t z, uint16_t s);
|
||||
extern uint32_t TIFFComputeStrip(TIFF*, uint32_t, uint16_t);
|
||||
extern uint32_t TIFFNumberOfStrips(TIFF*);
|
||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32_t strip, void* buf, tmsize_t size);
|
||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32_t strip, void* buf, tmsize_t size);
|
||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32_t tile, void* buf, tmsize_t size);
|
||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32_t tile, void* buf, tmsize_t size);
|
||||
extern int TIFFReadFromUserBuffer(TIFF* tif, uint32_t strile,
|
||||
void* inbuf, tmsize_t insize,
|
||||
void* outbuf, tmsize_t outsize);
|
||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32_t strip, void* data, tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32_t strip, void* data, tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32_t tile, void* data, tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32_t tile, void* data, tmsize_t cc);
|
||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths within TIFF file. */
|
||||
extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
|
||||
extern void TIFFSwabShort(uint16_t*);
|
||||
extern void TIFFSwabLong(uint32_t*);
|
||||
extern void TIFFSwabLong8(uint64_t*);
|
||||
extern void TIFFSwabFloat(float*);
|
||||
extern void TIFFSwabDouble(double*);
|
||||
extern void TIFFSwabArrayOfShort(uint16_t* wp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfTriples(uint8_t* tp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfLong(uint32_t* lp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfLong8(uint64_t* lp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
|
||||
extern void TIFFReverseBits(uint8_t* cp, tmsize_t n);
|
||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
||||
extern TIFF *TIFFOpen(const char *, const char *);
|
||||
extern TIFF *TIFFOpenExt(const char *, const char *, TIFFOpenOptions *opts);
|
||||
#ifdef __WIN32__
|
||||
extern TIFF *TIFFOpenW(const wchar_t *, const char *);
|
||||
extern TIFF *TIFFOpenWExt(const wchar_t *, const char *,
|
||||
TIFFOpenOptions *opts);
|
||||
#endif /* __WIN32__ */
|
||||
extern TIFF *TIFFFdOpen(int, const char *, const char *);
|
||||
extern TIFF *TIFFFdOpenExt(int, const char *, const char *,
|
||||
TIFFOpenOptions *opts);
|
||||
extern TIFF *TIFFClientOpen(const char *, const char *, thandle_t,
|
||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||
TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
|
||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
||||
extern TIFF *TIFFClientOpenExt(const char *, const char *, thandle_t,
|
||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||
TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
|
||||
TIFFMapFileProc, TIFFUnmapFileProc,
|
||||
TIFFOpenOptions *opts);
|
||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
||||
extern uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y,
|
||||
uint32_t z, uint16_t s);
|
||||
extern int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
|
||||
uint16_t s);
|
||||
extern uint32_t TIFFNumberOfTiles(TIFF *);
|
||||
extern tmsize_t TIFFReadTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
|
||||
uint32_t z, uint16_t s);
|
||||
extern tmsize_t TIFFWriteTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
|
||||
uint32_t z, uint16_t s);
|
||||
extern uint32_t TIFFComputeStrip(TIFF *, uint32_t, uint16_t);
|
||||
extern uint32_t TIFFNumberOfStrips(TIFF *);
|
||||
extern tmsize_t TIFFReadEncodedStrip(TIFF *tif, uint32_t strip, void *buf,
|
||||
tmsize_t size);
|
||||
extern tmsize_t TIFFReadRawStrip(TIFF *tif, uint32_t strip, void *buf,
|
||||
tmsize_t size);
|
||||
extern tmsize_t TIFFReadEncodedTile(TIFF *tif, uint32_t tile, void *buf,
|
||||
tmsize_t size);
|
||||
extern tmsize_t TIFFReadRawTile(TIFF *tif, uint32_t tile, void *buf,
|
||||
tmsize_t size);
|
||||
extern int TIFFReadFromUserBuffer(TIFF *tif, uint32_t strile, void *inbuf,
|
||||
tmsize_t insize, void *outbuf,
|
||||
tmsize_t outsize);
|
||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF *tif, uint32_t strip, void *data,
|
||||
tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteRawStrip(TIFF *tif, uint32_t strip, void *data,
|
||||
tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteEncodedTile(TIFF *tif, uint32_t tile, void *data,
|
||||
tmsize_t cc);
|
||||
extern tmsize_t TIFFWriteRawTile(TIFF *tif, uint32_t tile, void *data,
|
||||
tmsize_t cc);
|
||||
extern int TIFFDataWidth(
|
||||
TIFFDataType); /* table of tag datatype widths within TIFF file. */
|
||||
extern void TIFFSetWriteOffset(TIFF *tif, toff_t off);
|
||||
extern void TIFFSwabShort(uint16_t *);
|
||||
extern void TIFFSwabLong(uint32_t *);
|
||||
extern void TIFFSwabLong8(uint64_t *);
|
||||
extern void TIFFSwabFloat(float *);
|
||||
extern void TIFFSwabDouble(double *);
|
||||
extern void TIFFSwabArrayOfShort(uint16_t *wp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfTriples(uint8_t *tp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfLong(uint32_t *lp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfLong8(uint64_t *lp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfFloat(float *fp, tmsize_t n);
|
||||
extern void TIFFSwabArrayOfDouble(double *dp, tmsize_t n);
|
||||
extern void TIFFReverseBits(uint8_t *cp, tmsize_t n);
|
||||
extern const unsigned char *TIFFGetBitRevTable(int);
|
||||
|
||||
extern uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile);
|
||||
extern uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile);
|
||||
extern uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile, int *pbErr);
|
||||
extern uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile, int *pbErr);
|
||||
extern uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile);
|
||||
extern uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile);
|
||||
extern uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile,
|
||||
int *pbErr);
|
||||
extern uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile,
|
||||
int *pbErr);
|
||||
|
||||
#ifdef LOGLUV_PUBLIC
|
||||
#define U_NEU 0.210526316
|
||||
#define V_NEU 0.473684211
|
||||
#define UVSCALE 410.
|
||||
extern double LogL16toY(int);
|
||||
extern double LogL10toY(int);
|
||||
extern void XYZtoRGB24(float*, uint8_t*);
|
||||
extern int uv_decode(double*, double*, int);
|
||||
extern void LogLuv24toXYZ(uint32_t, float*);
|
||||
extern void LogLuv32toXYZ(uint32_t, float*);
|
||||
#define U_NEU 0.210526316
|
||||
#define V_NEU 0.473684211
|
||||
#define UVSCALE 410.
|
||||
extern double LogL16toY(int);
|
||||
extern double LogL10toY(int);
|
||||
extern void XYZtoRGB24(float *, uint8_t *);
|
||||
extern int uv_decode(double *, double *, int);
|
||||
extern void LogLuv24toXYZ(uint32_t, float *);
|
||||
extern void LogLuv32toXYZ(uint32_t, float *);
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
||||
extern uint32_t LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
||||
extern uint32_t LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
||||
extern uint32_t LogLuv24fromXYZ(float *, int = SGILOGENCODE_NODITHER);
|
||||
extern uint32_t LogLuv32fromXYZ(float *, int = SGILOGENCODE_NODITHER);
|
||||
#else
|
||||
extern int LogL16fromY(double, int);
|
||||
extern int LogL10fromY(double, int);
|
||||
extern int uv_encode(double, double, int);
|
||||
extern uint32_t LogLuv24fromXYZ(float*, int);
|
||||
extern uint32_t LogLuv32fromXYZ(float*, int);
|
||||
extern int LogL16fromY(double, int);
|
||||
extern int LogL10fromY(double, int);
|
||||
extern int uv_encode(double, double, int);
|
||||
extern uint32_t LogLuv24fromXYZ(float *, int);
|
||||
extern uint32_t LogLuv32fromXYZ(float *, int);
|
||||
#endif
|
||||
#endif /* LOGLUV_PUBLIC */
|
||||
|
||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32_t, int32_t, int32_t,
|
||||
float *, float *, float *);
|
||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
||||
uint32_t *, uint32_t *, uint32_t *);
|
||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB *, const TIFFDisplay *,
|
||||
float *);
|
||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32_t, int32_t, int32_t,
|
||||
float *, float *, float *);
|
||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, uint32_t *,
|
||||
uint32_t *, uint32_t *);
|
||||
|
||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32_t, int32_t, int32_t,
|
||||
uint32_t *, uint32_t *, uint32_t *);
|
||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *, float *, float *);
|
||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32_t, int32_t, int32_t,
|
||||
uint32_t *, uint32_t *, uint32_t *);
|
||||
|
||||
/****************************************************************************
|
||||
* O B S O L E T E D I N T E R F A C E S
|
||||
*
|
||||
* Don't use this stuff in your applications, it may be removed in the future
|
||||
* libtiff versions.
|
||||
****************************************************************************/
|
||||
typedef struct {
|
||||
ttag_t field_tag; /* field's tag */
|
||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||
TIFFDataType field_type; /* type of associated data */
|
||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
||||
unsigned char field_oktochange; /* if true, can change while writing */
|
||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
||||
char *field_name; /* ASCII name */
|
||||
} TIFFFieldInfo;
|
||||
/****************************************************************************
|
||||
* O B S O L E T E D I N T E R F A C E S
|
||||
*
|
||||
* Don't use this stuff in your applications, it may be removed in the
|
||||
*future libtiff versions.
|
||||
****************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
ttag_t field_tag; /* field's tag */
|
||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||
TIFFDataType field_type; /* type of associated data */
|
||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
||||
unsigned char field_oktochange; /* if true, can change while writing */
|
||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
||||
char *field_name; /* ASCII name */
|
||||
} TIFFFieldInfo;
|
||||
|
||||
extern int TIFFMergeFieldInfo(TIFF *, const TIFFFieldInfo[], uint32_t);
|
||||
|
||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32_t);
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2,38 +2,38 @@
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* Permission to use, copy, modify, distribute, and sell this software and
|
||||
* its documentation for any purpose is hereby granted without fee, provided
|
||||
* that (i) the above copyright notices and this permission notice appear in
|
||||
* all copies of the software and related documentation, and (ii) the names of
|
||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||
* publicity relating to the software without the specific, prior written
|
||||
* permission of Sam Leffler and Silicon Graphics.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _TIFFIO_HXX_
|
||||
#define _TIFFIO_HXX_
|
||||
#define _TIFFIO_HXX_
|
||||
|
||||
/*
|
||||
* TIFF I/O library definitions which provide C++ streams API.
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include "tiff.h"
|
||||
#include "tiffio.h"
|
||||
#include <iostream>
|
||||
|
||||
extern TIFF* TIFFStreamOpen(const char*, std::ostream *);
|
||||
extern TIFF* TIFFStreamOpen(const char*, std::istream *);
|
||||
extern TIFF *TIFFStreamOpen(const char *, std::ostream *);
|
||||
extern TIFF *TIFFStreamOpen(const char *, std::istream *);
|
||||
|
||||
#endif /* _TIFFIO_HXX_ */
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#ifndef _TIFFIOP_
|
||||
#define _TIFFIOP_
|
||||
#define _TIFFIOP_
|
||||
/*
|
||||
* ``Library-private'' definitions.
|
||||
*/
|
||||
@@ -31,19 +31,19 @@
|
||||
#include "tif_config.h"
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
# include <fcntl.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_ASSERT_H
|
||||
# include <assert.h>
|
||||
#include <assert.h>
|
||||
#else
|
||||
# define assert(x)
|
||||
#define assert(x)
|
||||
#endif
|
||||
|
||||
#include "tiffio.h"
|
||||
@@ -51,18 +51,19 @@
|
||||
#include "tif_dir.h"
|
||||
|
||||
#ifndef STRIP_SIZE_DEFAULT
|
||||
# define STRIP_SIZE_DEFAULT 8192
|
||||
#define STRIP_SIZE_DEFAULT 8192
|
||||
#endif
|
||||
|
||||
#define streq(a,b) (strcmp(a,b) == 0)
|
||||
#define strneq(a,b,n) (strncmp(a,b,n) == 0)
|
||||
#define streq(a, b) (strcmp(a, b) == 0)
|
||||
#define strneq(a, b, n) (strncmp(a, b, n) == 0)
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
typedef struct client_info {
|
||||
typedef struct client_info
|
||||
{
|
||||
struct client_info *next;
|
||||
void *data;
|
||||
char *name;
|
||||
@@ -72,205 +73,226 @@ typedef struct client_info {
|
||||
* Typedefs for ``method pointers'' used internally.
|
||||
* these are deprecated and provided only for backwards compatibility.
|
||||
*/
|
||||
typedef unsigned char tidataval_t; /* internal image data value type */
|
||||
typedef tidataval_t* tidata_t; /* reference to internal image data */
|
||||
typedef unsigned char tidataval_t; /* internal image data value type */
|
||||
typedef tidataval_t *tidata_t; /* reference to internal image data */
|
||||
|
||||
typedef void (*TIFFVoidMethod)(TIFF*);
|
||||
typedef int (*TIFFBoolMethod)(TIFF*);
|
||||
typedef int (*TIFFPreMethod)(TIFF*, uint16_t);
|
||||
typedef int (*TIFFCodeMethod)(TIFF* tif, uint8_t* buf, tmsize_t size, uint16_t sample);
|
||||
typedef int (*TIFFSeekMethod)(TIFF*, uint32_t);
|
||||
typedef void (*TIFFPostMethod)(TIFF* tif, uint8_t* buf, tmsize_t size);
|
||||
typedef uint32_t (*TIFFStripMethod)(TIFF*, uint32_t);
|
||||
typedef void (*TIFFTileMethod)(TIFF*, uint32_t*, uint32_t*);
|
||||
typedef void (*TIFFVoidMethod)(TIFF *);
|
||||
typedef int (*TIFFBoolMethod)(TIFF *);
|
||||
typedef int (*TIFFPreMethod)(TIFF *, uint16_t);
|
||||
typedef int (*TIFFCodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size,
|
||||
uint16_t sample);
|
||||
typedef int (*TIFFSeekMethod)(TIFF *, uint32_t);
|
||||
typedef void (*TIFFPostMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
|
||||
typedef uint32_t (*TIFFStripMethod)(TIFF *, uint32_t);
|
||||
typedef void (*TIFFTileMethod)(TIFF *, uint32_t *, uint32_t *);
|
||||
|
||||
struct tiff {
|
||||
char* tif_name; /* name of open file */
|
||||
int tif_fd; /* open file descriptor */
|
||||
int tif_mode; /* open mode (O_*) */
|
||||
uint32_t tif_flags;
|
||||
#define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
|
||||
#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
|
||||
#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
|
||||
#define TIFF_BUFFERSETUP 0x00010U /* data buffers setup */
|
||||
#define TIFF_CODERSETUP 0x00020U /* encoder/decoder setup done */
|
||||
#define TIFF_BEENWRITING 0x00040U /* written 1+ scanlines to file */
|
||||
#define TIFF_SWAB 0x00080U /* byte swap file information */
|
||||
#define TIFF_NOBITREV 0x00100U /* inhibit bit reversal logic */
|
||||
#define TIFF_MYBUFFER 0x00200U /* my raw data buffer; free on close */
|
||||
#define TIFF_ISTILED 0x00400U /* file is tile, not strip- based */
|
||||
#define TIFF_MAPPED 0x00800U /* file is mapped into memory */
|
||||
#define TIFF_POSTENCODE 0x01000U /* need call to postencode routine */
|
||||
#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
|
||||
#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
|
||||
#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
|
||||
#define TIFF_HEADERONLY 0x10000U /* read header only, do not process the first directory */
|
||||
#define TIFF_NOREADRAW 0x20000U /* skip reading of raw uncompressed image data */
|
||||
#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
|
||||
#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
|
||||
#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
|
||||
#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
|
||||
#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
|
||||
#define TIFF_BUFFERMMAP 0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
|
||||
#define TIFF_DEFERSTRILELOAD 0x1000000U /* defer strip/tile offset/bytecount array loading. */
|
||||
#define TIFF_LAZYSTRILELOAD 0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. Only used if TIFF_DEFERSTRILELOAD is set and in read-only mode */
|
||||
#define TIFF_CHOPPEDUPARRAYS 0x4000000U /* set when allocChoppedUpStripArrays() has modified strip array */
|
||||
uint64_t tif_diroff; /* file offset of current directory */
|
||||
uint64_t tif_nextdiroff; /* file offset of following directory */
|
||||
uint64_t tif_lastdiroff; /* file offset of last directory written so far */
|
||||
uint64_t* tif_dirlistoff; /* list of offsets to already seen directories to prevent IFD looping */
|
||||
uint16_t* tif_dirlistdirn; /* list of directory numbers to already seen directories to prevent IFD looping */
|
||||
uint16_t tif_dirlistsize; /* number of entries in offset list */
|
||||
uint16_t tif_dirnumber; /* number of already seen directories */
|
||||
TIFFDirectory tif_dir; /* internal rep of current directory */
|
||||
TIFFDirectory tif_customdir; /* custom IFDs are separated from the main ones */
|
||||
union {
|
||||
TIFFHeaderCommon common;
|
||||
TIFFHeaderClassic classic;
|
||||
TIFFHeaderBig big;
|
||||
} tif_header;
|
||||
uint16_t tif_header_size; /* file's header block and its length */
|
||||
uint32_t tif_row; /* current scanline */
|
||||
uint16_t tif_curdir; /* current directory (index) */
|
||||
uint32_t tif_curstrip; /* current strip for read/write */
|
||||
uint64_t tif_curoff; /* current offset for read/write */
|
||||
uint64_t tif_lastvalidoff; /* last valid offset allowed for rewrite in place. Used only by TIFFAppendToStrip() */
|
||||
uint64_t tif_dataoff; /* current offset for writing dir */
|
||||
/* SubIFD support */
|
||||
uint16_t tif_nsubifd; /* remaining subifds to write */
|
||||
uint64_t tif_subifdoff; /* offset for patching SubIFD link */
|
||||
/* tiling support */
|
||||
uint32_t tif_col; /* current column (offset by row too) */
|
||||
uint32_t tif_curtile; /* current tile for read/write */
|
||||
tmsize_t tif_tilesize; /* # of bytes in a tile */
|
||||
/* compression scheme hooks */
|
||||
int tif_decodestatus;
|
||||
TIFFBoolMethod tif_fixuptags; /* called in TIFFReadDirectory */
|
||||
TIFFBoolMethod tif_setupdecode; /* called once before predecode */
|
||||
TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
|
||||
TIFFBoolMethod tif_setupencode; /* called once before preencode */
|
||||
int tif_encodestatus;
|
||||
TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
|
||||
TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
|
||||
TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
|
||||
TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
|
||||
TIFFCodeMethod tif_decodestrip; /* strip decoding routine */
|
||||
TIFFCodeMethod tif_encodestrip; /* strip encoding routine */
|
||||
TIFFCodeMethod tif_decodetile; /* tile decoding routine */
|
||||
TIFFCodeMethod tif_encodetile; /* tile encoding routine */
|
||||
TIFFVoidMethod tif_close; /* cleanup-on-close routine */
|
||||
TIFFSeekMethod tif_seek; /* position within a strip routine */
|
||||
TIFFVoidMethod tif_cleanup; /* cleanup state routine */
|
||||
TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
|
||||
TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
|
||||
uint8_t* tif_data; /* compression scheme private data */
|
||||
/* input/output buffering */
|
||||
tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
|
||||
tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
|
||||
uint8_t* tif_rawdata; /* raw data buffer */
|
||||
tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
|
||||
tmsize_t tif_rawdataoff; /* rawdata offset within strip */
|
||||
tmsize_t tif_rawdataloaded;/* amount of data in rawdata */
|
||||
uint8_t* tif_rawcp; /* current spot in raw buffer */
|
||||
tmsize_t tif_rawcc; /* bytes unread from raw buffer */
|
||||
/* memory-mapped file support */
|
||||
uint8_t* tif_base; /* base of mapped file */
|
||||
tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
|
||||
TIFFMapFileProc tif_mapproc; /* map file method */
|
||||
TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
|
||||
/* input/output callback methods */
|
||||
thandle_t tif_clientdata; /* callback parameter */
|
||||
TIFFReadWriteProc tif_readproc; /* read method */
|
||||
TIFFReadWriteProc tif_writeproc; /* write method */
|
||||
TIFFSeekProc tif_seekproc; /* lseek method */
|
||||
TIFFCloseProc tif_closeproc; /* close method */
|
||||
TIFFSizeProc tif_sizeproc; /* filesize method */
|
||||
/* post-decoding support */
|
||||
TIFFPostMethod tif_postdecode; /* post decoding routine */
|
||||
/* tag support */
|
||||
TIFFField** tif_fields; /* sorted table of registered tags */
|
||||
size_t tif_nfields; /* # entries in registered tag table */
|
||||
const TIFFField* tif_foundfield; /* cached pointer to already found tag */
|
||||
TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
|
||||
TIFFClientInfoLink* tif_clientinfo; /* extra client information. */
|
||||
/* Backward compatibility stuff. We need these two fields for
|
||||
* setting up an old tag extension scheme. */
|
||||
TIFFFieldArray* tif_fieldscompat;
|
||||
size_t tif_nfieldscompat;
|
||||
/* Error handler support */
|
||||
TIFFErrorHandlerExtR tif_errorhandler;
|
||||
void* tif_errorhandler_user_data;
|
||||
TIFFErrorHandlerExtR tif_warnhandler;
|
||||
void* tif_warnhandler_user_data;
|
||||
tmsize_t tif_max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||
struct tiff
|
||||
{
|
||||
char *tif_name; /* name of open file */
|
||||
int tif_fd; /* open file descriptor */
|
||||
int tif_mode; /* open mode (O_*) */
|
||||
uint32_t tif_flags;
|
||||
#define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
|
||||
#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
|
||||
#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
|
||||
#define TIFF_BUFFERSETUP 0x00010U /* data buffers setup */
|
||||
#define TIFF_CODERSETUP 0x00020U /* encoder/decoder setup done */
|
||||
#define TIFF_BEENWRITING 0x00040U /* written 1+ scanlines to file */
|
||||
#define TIFF_SWAB 0x00080U /* byte swap file information */
|
||||
#define TIFF_NOBITREV 0x00100U /* inhibit bit reversal logic */
|
||||
#define TIFF_MYBUFFER 0x00200U /* my raw data buffer; free on close */
|
||||
#define TIFF_ISTILED 0x00400U /* file is tile, not strip- based */
|
||||
#define TIFF_MAPPED 0x00800U /* file is mapped into memory */
|
||||
#define TIFF_POSTENCODE 0x01000U /* need call to postencode routine */
|
||||
#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
|
||||
#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
|
||||
#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
|
||||
#define TIFF_HEADERONLY \
|
||||
0x10000U /* read header only, do not process the first directory */
|
||||
#define TIFF_NOREADRAW \
|
||||
0x20000U /* skip reading of raw uncompressed image data */
|
||||
#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
|
||||
#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
|
||||
#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
|
||||
#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
|
||||
#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
|
||||
#define TIFF_BUFFERMMAP \
|
||||
0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
|
||||
#define TIFF_DEFERSTRILELOAD \
|
||||
0x1000000U /* defer strip/tile offset/bytecount array loading. */
|
||||
#define TIFF_LAZYSTRILELOAD \
|
||||
0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. \
|
||||
Only used if TIFF_DEFERSTRILELOAD is set and in read-only \
|
||||
mode */
|
||||
#define TIFF_CHOPPEDUPARRAYS \
|
||||
0x4000000U /* set when allocChoppedUpStripArrays() has modified strip \
|
||||
array */
|
||||
uint64_t tif_diroff; /* file offset of current directory */
|
||||
uint64_t tif_nextdiroff; /* file offset of following directory */
|
||||
uint64_t tif_lastdiroff; /* file offset of last directory written so far */
|
||||
uint64_t *tif_dirlistoff; /* list of offsets to already seen directories to
|
||||
prevent IFD looping */
|
||||
uint16_t *tif_dirlistdirn; /* list of directory numbers to already seen
|
||||
directories to prevent IFD looping */
|
||||
uint16_t tif_dirlistsize; /* number of entries in offset list */
|
||||
uint16_t tif_dirnumber; /* number of already seen directories */
|
||||
TIFFDirectory tif_dir; /* internal rep of current directory */
|
||||
TIFFDirectory
|
||||
tif_customdir; /* custom IFDs are separated from the main ones */
|
||||
union
|
||||
{
|
||||
TIFFHeaderCommon common;
|
||||
TIFFHeaderClassic classic;
|
||||
TIFFHeaderBig big;
|
||||
} tif_header;
|
||||
uint16_t tif_header_size; /* file's header block and its length */
|
||||
uint32_t tif_row; /* current scanline */
|
||||
uint16_t tif_curdir; /* current directory (index) */
|
||||
uint32_t tif_curstrip; /* current strip for read/write */
|
||||
uint64_t tif_curoff; /* current offset for read/write */
|
||||
uint64_t tif_lastvalidoff; /* last valid offset allowed for rewrite in
|
||||
place. Used only by TIFFAppendToStrip() */
|
||||
uint64_t tif_dataoff; /* current offset for writing dir */
|
||||
/* SubIFD support */
|
||||
uint16_t tif_nsubifd; /* remaining subifds to write */
|
||||
uint64_t tif_subifdoff; /* offset for patching SubIFD link */
|
||||
/* tiling support */
|
||||
uint32_t tif_col; /* current column (offset by row too) */
|
||||
uint32_t tif_curtile; /* current tile for read/write */
|
||||
tmsize_t tif_tilesize; /* # of bytes in a tile */
|
||||
/* compression scheme hooks */
|
||||
int tif_decodestatus;
|
||||
TIFFBoolMethod tif_fixuptags; /* called in TIFFReadDirectory */
|
||||
TIFFBoolMethod tif_setupdecode; /* called once before predecode */
|
||||
TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
|
||||
TIFFBoolMethod tif_setupencode; /* called once before preencode */
|
||||
int tif_encodestatus;
|
||||
TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
|
||||
TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
|
||||
TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
|
||||
TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
|
||||
TIFFCodeMethod tif_decodestrip; /* strip decoding routine */
|
||||
TIFFCodeMethod tif_encodestrip; /* strip encoding routine */
|
||||
TIFFCodeMethod tif_decodetile; /* tile decoding routine */
|
||||
TIFFCodeMethod tif_encodetile; /* tile encoding routine */
|
||||
TIFFVoidMethod tif_close; /* cleanup-on-close routine */
|
||||
TIFFSeekMethod tif_seek; /* position within a strip routine */
|
||||
TIFFVoidMethod tif_cleanup; /* cleanup state routine */
|
||||
TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
|
||||
TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
|
||||
uint8_t *tif_data; /* compression scheme private data */
|
||||
/* input/output buffering */
|
||||
tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
|
||||
tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
|
||||
uint8_t *tif_rawdata; /* raw data buffer */
|
||||
tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
|
||||
tmsize_t tif_rawdataoff; /* rawdata offset within strip */
|
||||
tmsize_t tif_rawdataloaded; /* amount of data in rawdata */
|
||||
uint8_t *tif_rawcp; /* current spot in raw buffer */
|
||||
tmsize_t tif_rawcc; /* bytes unread from raw buffer */
|
||||
/* memory-mapped file support */
|
||||
uint8_t *tif_base; /* base of mapped file */
|
||||
tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
|
||||
TIFFMapFileProc tif_mapproc; /* map file method */
|
||||
TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
|
||||
/* input/output callback methods */
|
||||
thandle_t tif_clientdata; /* callback parameter */
|
||||
TIFFReadWriteProc tif_readproc; /* read method */
|
||||
TIFFReadWriteProc tif_writeproc; /* write method */
|
||||
TIFFSeekProc tif_seekproc; /* lseek method */
|
||||
TIFFCloseProc tif_closeproc; /* close method */
|
||||
TIFFSizeProc tif_sizeproc; /* filesize method */
|
||||
/* post-decoding support */
|
||||
TIFFPostMethod tif_postdecode; /* post decoding routine */
|
||||
/* tag support */
|
||||
TIFFField **tif_fields; /* sorted table of registered tags */
|
||||
size_t tif_nfields; /* # entries in registered tag table */
|
||||
const TIFFField *tif_foundfield; /* cached pointer to already found tag */
|
||||
TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
|
||||
TIFFClientInfoLink *tif_clientinfo; /* extra client information. */
|
||||
/* Backward compatibility stuff. We need these two fields for
|
||||
* setting up an old tag extension scheme. */
|
||||
TIFFFieldArray *tif_fieldscompat;
|
||||
size_t tif_nfieldscompat;
|
||||
/* Error handler support */
|
||||
TIFFErrorHandlerExtR tif_errorhandler;
|
||||
void *tif_errorhandler_user_data;
|
||||
TIFFErrorHandlerExtR tif_warnhandler;
|
||||
void *tif_warnhandler_user_data;
|
||||
tmsize_t tif_max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||
};
|
||||
|
||||
struct TIFFOpenOptions
|
||||
{
|
||||
TIFFErrorHandlerExtR errorhandler; /* may be NULL */
|
||||
void* errorhandler_user_data; /* may be NULL */
|
||||
TIFFErrorHandlerExtR warnhandler; /* may be NULL */
|
||||
void* warnhandler_user_data; /* may be NULL */
|
||||
tmsize_t max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||
void *errorhandler_user_data; /* may be NULL */
|
||||
TIFFErrorHandlerExtR warnhandler; /* may be NULL */
|
||||
void *warnhandler_user_data; /* may be NULL */
|
||||
tmsize_t max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||
};
|
||||
|
||||
#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
|
||||
#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
|
||||
|
||||
#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0)
|
||||
#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0)
|
||||
#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0)
|
||||
#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
|
||||
#define TIFFReadFile(tif, buf, size) \
|
||||
((*(tif)->tif_readproc)((tif)->tif_clientdata,(buf),(size)))
|
||||
#define TIFFWriteFile(tif, buf, size) \
|
||||
((*(tif)->tif_writeproc)((tif)->tif_clientdata,(buf),(size)))
|
||||
#define TIFFSeekFile(tif, off, whence) \
|
||||
((*(tif)->tif_seekproc)((tif)->tif_clientdata,(off),(whence)))
|
||||
#define TIFFCloseFile(tif) \
|
||||
((*(tif)->tif_closeproc)((tif)->tif_clientdata))
|
||||
#define TIFFGetFileSize(tif) \
|
||||
((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
|
||||
#define TIFFMapFileContents(tif, paddr, psize) \
|
||||
((*(tif)->tif_mapproc)((tif)->tif_clientdata,(paddr),(psize)))
|
||||
#define TIFFUnmapFileContents(tif, addr, size) \
|
||||
((*(tif)->tif_unmapproc)((tif)->tif_clientdata,(addr),(size)))
|
||||
#define TIFFReadFile(tif, buf, size) \
|
||||
((*(tif)->tif_readproc)((tif)->tif_clientdata, (buf), (size)))
|
||||
#define TIFFWriteFile(tif, buf, size) \
|
||||
((*(tif)->tif_writeproc)((tif)->tif_clientdata, (buf), (size)))
|
||||
#define TIFFSeekFile(tif, off, whence) \
|
||||
((*(tif)->tif_seekproc)((tif)->tif_clientdata, (off), (whence)))
|
||||
#define TIFFCloseFile(tif) ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
|
||||
#define TIFFGetFileSize(tif) ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
|
||||
#define TIFFMapFileContents(tif, paddr, psize) \
|
||||
((*(tif)->tif_mapproc)((tif)->tif_clientdata, (paddr), (psize)))
|
||||
#define TIFFUnmapFileContents(tif, addr, size) \
|
||||
((*(tif)->tif_unmapproc)((tif)->tif_clientdata, (addr), (size)))
|
||||
|
||||
/*
|
||||
* Default Read/Seek/Write definitions.
|
||||
*/
|
||||
#ifndef ReadOK
|
||||
#define ReadOK(tif, buf, size) \
|
||||
(TIFFReadFile((tif),(buf),(size))==(size))
|
||||
#define ReadOK(tif, buf, size) (TIFFReadFile((tif), (buf), (size)) == (size))
|
||||
#endif
|
||||
#ifndef SeekOK
|
||||
#define SeekOK(tif, off) _TIFFSeekOK(tif, off)
|
||||
#endif
|
||||
#ifndef WriteOK
|
||||
#define WriteOK(tif, buf, size) \
|
||||
(TIFFWriteFile((tif),(buf),(size))==(size))
|
||||
#define WriteOK(tif, buf, size) (TIFFWriteFile((tif), (buf), (size)) == (size))
|
||||
#endif
|
||||
|
||||
/* NB: the uint32_t casts are to silence certain ANSI-C compilers */
|
||||
#define TIFFhowmany_32(x, y) (((uint32_t)x < (0xffffffff - (uint32_t)(y-1))) ? \
|
||||
((((uint32_t)(x))+(((uint32_t)(y))-1))/((uint32_t)(y))) : \
|
||||
0U)
|
||||
#define TIFFhowmany_32(x, y) \
|
||||
(((uint32_t)x < (0xffffffff - (uint32_t)(y - 1))) \
|
||||
? ((((uint32_t)(x)) + (((uint32_t)(y)) - 1)) / ((uint32_t)(y))) \
|
||||
: 0U)
|
||||
/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
|
||||
/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
|
||||
#define TIFFhowmany_32_maxuint_compat(x, y) \
|
||||
(((uint32_t)(x) / (uint32_t)(y)) + ((((uint32_t)(x) % (uint32_t)(y)) != 0) ? 1 : 0))
|
||||
#define TIFFhowmany8_32(x) (((x)&0x07)?((uint32_t)(x)>>3)+1:(uint32_t)(x)>>3)
|
||||
#define TIFFroundup_32(x, y) (TIFFhowmany_32(x,y)*(y))
|
||||
#define TIFFhowmany_64(x, y) ((((uint64_t)(x))+(((uint64_t)(y))-1))/((uint64_t)(y)))
|
||||
#define TIFFhowmany8_64(x) (((x)&0x07)?((uint64_t)(x)>>3)+1:(uint64_t)(x)>>3)
|
||||
#define TIFFroundup_64(x, y) (TIFFhowmany_64(x,y)*(y))
|
||||
#define TIFFhowmany_32_maxuint_compat(x, y) \
|
||||
(((uint32_t)(x) / (uint32_t)(y)) + \
|
||||
((((uint32_t)(x) % (uint32_t)(y)) != 0) ? 1 : 0))
|
||||
#define TIFFhowmany8_32(x) \
|
||||
(((x)&0x07) ? ((uint32_t)(x) >> 3) + 1 : (uint32_t)(x) >> 3)
|
||||
#define TIFFroundup_32(x, y) (TIFFhowmany_32(x, y) * (y))
|
||||
#define TIFFhowmany_64(x, y) \
|
||||
((((uint64_t)(x)) + (((uint64_t)(y)) - 1)) / ((uint64_t)(y)))
|
||||
#define TIFFhowmany8_64(x) \
|
||||
(((x)&0x07) ? ((uint64_t)(x) >> 3) + 1 : (uint64_t)(x) >> 3)
|
||||
#define TIFFroundup_64(x, y) (TIFFhowmany_64(x, y) * (y))
|
||||
|
||||
/* Safe multiply which returns zero if there is an *unsigned* integer overflow. This macro is not safe for *signed* integer types */
|
||||
#define TIFFSafeMultiply(t,v,m) ((((t)(m) != (t)0) && (((t)(((v)*(m))/(m))) == (t)(v))) ? (t)((v)*(m)) : (t)0)
|
||||
/* Safe multiply which returns zero if there is an *unsigned* integer overflow.
|
||||
* This macro is not safe for *signed* integer types */
|
||||
#define TIFFSafeMultiply(t, v, m) \
|
||||
((((t)(m) != (t)0) && (((t)(((v) * (m)) / (m))) == (t)(v))) \
|
||||
? (t)((v) * (m)) \
|
||||
: (t)0)
|
||||
|
||||
#define TIFFmax(A,B) ((A)>(B)?(A):(B))
|
||||
#define TIFFmin(A,B) ((A)<(B)?(A):(B))
|
||||
#define TIFFmax(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define TIFFmin(A, B) ((A) < (B) ? (A) : (B))
|
||||
|
||||
#define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0]))
|
||||
#define TIFFArrayCount(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
/*
|
||||
Support for large files.
|
||||
@@ -291,28 +313,31 @@ struct TIFFOpenOptions
|
||||
must be available on the target computer in order for the program to run.
|
||||
*/
|
||||
#if defined(HAVE_FSEEKO)
|
||||
# define fseek(stream,offset,whence) fseeko(stream,offset,whence)
|
||||
# define ftell(stream,offset,whence) ftello(stream,offset,whence)
|
||||
#define fseek(stream, offset, whence) fseeko(stream, offset, whence)
|
||||
#define ftell(stream, offset, whence) ftello(stream, offset, whence)
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__WIN32__) && \
|
||||
!(defined(_MSC_VER) && _MSC_VER < 1400) && \
|
||||
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
|
||||
#if defined(__WIN32__) && !(defined(_MSC_VER) && _MSC_VER < 1400) && \
|
||||
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
|
||||
typedef unsigned int TIFFIOSize_t;
|
||||
#define _TIFF_lseek_f(fildes,offset,whence) _lseeki64(fildes,/* __int64 */ offset,whence)
|
||||
#define _TIFF_lseek_f(fildes, offset, whence) \
|
||||
_lseeki64(fildes, /* __int64 */ offset, whence)
|
||||
/* #define _TIFF_tell_f(fildes) /\* __int64 *\/ _telli64(fildes) */
|
||||
#define _TIFF_fseek_f(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
|
||||
#define _TIFF_fstat_f(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
|
||||
#define _TIFF_fseek_f(stream, offset, whence) \
|
||||
_fseeki64(stream, /* __int64 */ offset, whence)
|
||||
#define _TIFF_fstat_f(fildes, stat_buff) \
|
||||
_fstati64(fildes, /* struct _stati64 */ stat_buff)
|
||||
/* #define _TIFF_ftell_f(stream) /\* __int64 *\/ _ftelli64(stream) */
|
||||
/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/ stat_buff) */
|
||||
/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/
|
||||
* stat_buff) */
|
||||
#define _TIFF_stat_s struct _stati64
|
||||
#define _TIFF_off_t __int64
|
||||
#else
|
||||
typedef size_t TIFFIOSize_t;
|
||||
#define _TIFF_lseek_f(fildes,offset,whence) lseek(fildes,offset,whence)
|
||||
#define _TIFF_lseek_f(fildes, offset, whence) lseek(fildes, offset, whence)
|
||||
/* #define _TIFF_tell_f(fildes) (_TIFF_lseek_f(fildes,0,SEEK_CUR)) */
|
||||
#define _TIFF_fseek_f(stream,offset,whence) fseek(stream,offset,whence)
|
||||
#define _TIFF_fstat_f(fildes,stat_buff) fstat(fildes,stat_buff)
|
||||
#define _TIFF_fseek_f(stream, offset, whence) fseek(stream, offset, whence)
|
||||
#define _TIFF_fstat_f(fildes, stat_buff) fstat(fildes, stat_buff)
|
||||
/* #define _TIFF_ftell_f(stream) ftell(stream) */
|
||||
/* #define _TIFF_stat_f(path,stat_buff) stat(path,stat_buff) */
|
||||
#define _TIFF_stat_s struct stat
|
||||
@@ -321,7 +346,8 @@ typedef size_t TIFFIOSize_t;
|
||||
|
||||
#if defined(__has_attribute) && defined(__clang__)
|
||||
#if __has_attribute(no_sanitize)
|
||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow")))
|
||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW \
|
||||
__attribute__((no_sanitize("unsigned-integer-overflow")))
|
||||
#else
|
||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
||||
#endif
|
||||
@@ -329,136 +355,151 @@ typedef size_t TIFFIOSize_t;
|
||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
extern int _TIFFgetMode(TIFFOpenOptions* opts, thandle_t clientdata, const char* mode, const char* module);
|
||||
extern int _TIFFNoRowEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoStripEncode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoTileEncode(TIFF*, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoRowDecode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoStripDecode(TIFF* tif, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoTileDecode(TIFF*, uint8_t* pp, tmsize_t cc, uint16_t s);
|
||||
extern void _TIFFNoPostDecode(TIFF* tif, uint8_t* buf, tmsize_t cc);
|
||||
extern int _TIFFNoPreCode(TIFF* tif, uint16_t s);
|
||||
extern int _TIFFNoSeek(TIFF* tif, uint32_t off);
|
||||
extern void _TIFFSwab16BitData(TIFF* tif, uint8_t* buf, tmsize_t cc);
|
||||
extern void _TIFFSwab24BitData(TIFF* tif, uint8_t* buf, tmsize_t cc);
|
||||
extern void _TIFFSwab32BitData(TIFF* tif, uint8_t* buf, tmsize_t cc);
|
||||
extern void _TIFFSwab64BitData(TIFF* tif, uint8_t* buf, tmsize_t cc);
|
||||
extern int TIFFFlushData1(TIFF* tif);
|
||||
extern int TIFFDefaultDirectory(TIFF* tif);
|
||||
extern void _TIFFSetDefaultCompressionState(TIFF* tif);
|
||||
extern int _TIFFRewriteField(TIFF *, uint16_t, TIFFDataType, tmsize_t, void *);
|
||||
extern int TIFFSetCompressionScheme(TIFF* tif, int scheme);
|
||||
extern int TIFFSetDefaultCompressionState(TIFF* tif);
|
||||
extern uint32_t _TIFFDefaultStripSize(TIFF* tif, uint32_t s);
|
||||
extern void _TIFFDefaultTileSize(TIFF* tif, uint32_t* tw, uint32_t* th);
|
||||
extern int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||
const char *mode, const char *module);
|
||||
extern int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||
uint16_t s);
|
||||
extern int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||
uint16_t s);
|
||||
extern int _TIFFNoTileEncode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
|
||||
extern int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||
uint16_t s);
|
||||
extern int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||
uint16_t s);
|
||||
extern int _TIFFNoTileDecode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
|
||||
extern void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||
extern int _TIFFNoPreCode(TIFF *tif, uint16_t s);
|
||||
extern int _TIFFNoSeek(TIFF *tif, uint32_t off);
|
||||
extern void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||
extern void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||
extern void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||
extern void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||
extern int TIFFFlushData1(TIFF *tif);
|
||||
extern int TIFFDefaultDirectory(TIFF *tif);
|
||||
extern void _TIFFSetDefaultCompressionState(TIFF *tif);
|
||||
extern int _TIFFRewriteField(TIFF *, uint16_t, TIFFDataType, tmsize_t,
|
||||
void *);
|
||||
extern int TIFFSetCompressionScheme(TIFF *tif, int scheme);
|
||||
extern int TIFFSetDefaultCompressionState(TIFF *tif);
|
||||
extern uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s);
|
||||
extern void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th);
|
||||
|
||||
extern void _TIFFsetByteArray(void**, const void*, uint32_t);
|
||||
extern void _TIFFsetByteArrayExt(TIFF*, void**, const void*, uint32_t);
|
||||
extern void _TIFFsetShortArray(uint16_t**, const uint16_t*, uint32_t);
|
||||
extern void _TIFFsetShortArrayExt(TIFF*, uint16_t**, const uint16_t*, uint32_t);
|
||||
extern void _TIFFsetLongArray(uint32_t**, const uint32_t*, uint32_t);
|
||||
extern void _TIFFsetLongArrayExt(TIFF*, uint32_t**, const uint32_t*, uint32_t);
|
||||
extern void _TIFFsetFloatArray(float**, const float*, uint32_t);
|
||||
extern void _TIFFsetFloatArrayExt(TIFF*, float**, const float*, uint32_t);
|
||||
extern void _TIFFsetDoubleArray(double**, const double*, uint32_t);
|
||||
extern void _TIFFsetDoubleArrayExt(TIFF*, double**, const double*, uint32_t);
|
||||
extern void _TIFFsetByteArray(void **, const void *, uint32_t);
|
||||
extern void _TIFFsetByteArrayExt(TIFF *, void **, const void *, uint32_t);
|
||||
extern void _TIFFsetShortArray(uint16_t **, const uint16_t *, uint32_t);
|
||||
extern void _TIFFsetShortArrayExt(TIFF *, uint16_t **, const uint16_t *,
|
||||
uint32_t);
|
||||
extern void _TIFFsetLongArray(uint32_t **, const uint32_t *, uint32_t);
|
||||
extern void _TIFFsetLongArrayExt(TIFF *, uint32_t **, const uint32_t *,
|
||||
uint32_t);
|
||||
extern void _TIFFsetFloatArray(float **, const float *, uint32_t);
|
||||
extern void _TIFFsetFloatArrayExt(TIFF *, float **, const float *,
|
||||
uint32_t);
|
||||
extern void _TIFFsetDoubleArray(double **, const double *, uint32_t);
|
||||
extern void _TIFFsetDoubleArrayExt(TIFF *, double **, const double *,
|
||||
uint32_t);
|
||||
|
||||
extern void _TIFFprintAscii(FILE*, const char*);
|
||||
extern void _TIFFprintAsciiTag(FILE*, const char*, const char*);
|
||||
extern void _TIFFprintAscii(FILE *, const char *);
|
||||
extern void _TIFFprintAsciiTag(FILE *, const char *, const char *);
|
||||
|
||||
extern TIFFErrorHandler _TIFFwarningHandler;
|
||||
extern TIFFErrorHandler _TIFFerrorHandler;
|
||||
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
|
||||
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
|
||||
void _TIFFErrorEarly(TIFFOpenOptions* opts, thandle_t clientdata, const char* module, const char* fmt, ...) TIFF_ATTRIBUTE((__format__ (__printf__,4,5)));
|
||||
extern TIFFErrorHandler _TIFFwarningHandler;
|
||||
extern TIFFErrorHandler _TIFFerrorHandler;
|
||||
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
|
||||
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
|
||||
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||
const char *module, const char *fmt, ...)
|
||||
TIFF_ATTRIBUTE((__format__(__printf__, 4, 5)));
|
||||
|
||||
extern uint32_t _TIFFMultiply32(TIFF*, uint32_t, uint32_t, const char*);
|
||||
extern uint64_t _TIFFMultiply64(TIFF*, uint64_t, uint64_t, const char*);
|
||||
extern tmsize_t _TIFFMultiplySSize(TIFF*, tmsize_t, tmsize_t, const char*);
|
||||
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF*, uint64_t, const char*);
|
||||
extern void* _TIFFCheckMalloc(TIFF*, tmsize_t, tmsize_t, const char*);
|
||||
extern void* _TIFFCheckRealloc(TIFF*, void*, tmsize_t, tmsize_t, const char*);
|
||||
extern uint32_t _TIFFMultiply32(TIFF *, uint32_t, uint32_t, const char *);
|
||||
extern uint64_t _TIFFMultiply64(TIFF *, uint64_t, uint64_t, const char *);
|
||||
extern tmsize_t _TIFFMultiplySSize(TIFF *, tmsize_t, tmsize_t,
|
||||
const char *);
|
||||
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF *, uint64_t, const char *);
|
||||
extern void *_TIFFCheckMalloc(TIFF *, tmsize_t, tmsize_t, const char *);
|
||||
extern void *_TIFFCheckRealloc(TIFF *, void *, tmsize_t, tmsize_t,
|
||||
const char *);
|
||||
|
||||
extern double _TIFFUInt64ToDouble(uint64_t);
|
||||
extern float _TIFFUInt64ToFloat(uint64_t);
|
||||
extern double _TIFFUInt64ToDouble(uint64_t);
|
||||
extern float _TIFFUInt64ToFloat(uint64_t);
|
||||
|
||||
extern float _TIFFClampDoubleToFloat(double);
|
||||
extern uint32_t _TIFFClampDoubleToUInt32(double);
|
||||
extern float _TIFFClampDoubleToFloat(double);
|
||||
extern uint32_t _TIFFClampDoubleToUInt32(double);
|
||||
|
||||
extern tmsize_t
|
||||
_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32_t strip,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t
|
||||
_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32_t tile,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t
|
||||
_TIFFReadTileAndAllocBuffer(TIFF* tif,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
uint32_t x, uint32_t y, uint32_t z, uint16_t s);
|
||||
extern int _TIFFSeekOK(TIFF* tif, toff_t off);
|
||||
extern tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif,
|
||||
uint32_t strip,
|
||||
void **buf,
|
||||
tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile,
|
||||
void **buf,
|
||||
tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf,
|
||||
tmsize_t bufsizetoalloc,
|
||||
uint32_t x, uint32_t y,
|
||||
uint32_t z, uint16_t s);
|
||||
extern int _TIFFSeekOK(TIFF *tif, toff_t off);
|
||||
|
||||
extern int TIFFInitDumpMode(TIFF*, int);
|
||||
extern int TIFFInitDumpMode(TIFF *, int);
|
||||
#ifdef PACKBITS_SUPPORT
|
||||
extern int TIFFInitPackBits(TIFF*, int);
|
||||
extern int TIFFInitPackBits(TIFF *, int);
|
||||
#endif
|
||||
#ifdef CCITT_SUPPORT
|
||||
extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int);
|
||||
extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int);
|
||||
extern int TIFFInitCCITTRLE(TIFF *, int), TIFFInitCCITTRLEW(TIFF *, int);
|
||||
extern int TIFFInitCCITTFax3(TIFF *, int), TIFFInitCCITTFax4(TIFF *, int);
|
||||
#endif
|
||||
#ifdef THUNDER_SUPPORT
|
||||
extern int TIFFInitThunderScan(TIFF*, int);
|
||||
extern int TIFFInitThunderScan(TIFF *, int);
|
||||
#endif
|
||||
#ifdef NEXT_SUPPORT
|
||||
extern int TIFFInitNeXT(TIFF*, int);
|
||||
extern int TIFFInitNeXT(TIFF *, int);
|
||||
#endif
|
||||
#ifdef LZW_SUPPORT
|
||||
extern int TIFFInitLZW(TIFF*, int);
|
||||
extern int TIFFInitLZW(TIFF *, int);
|
||||
#endif
|
||||
#ifdef OJPEG_SUPPORT
|
||||
extern int TIFFInitOJPEG(TIFF*, int);
|
||||
extern int TIFFInitOJPEG(TIFF *, int);
|
||||
#endif
|
||||
#ifdef JPEG_SUPPORT
|
||||
extern int TIFFInitJPEG(TIFF*, int);
|
||||
extern int TIFFJPEGIsFullStripRequired(TIFF*);
|
||||
extern int TIFFInitJPEG(TIFF *, int);
|
||||
extern int TIFFJPEGIsFullStripRequired(TIFF *);
|
||||
#endif
|
||||
#ifdef JBIG_SUPPORT
|
||||
extern int TIFFInitJBIG(TIFF*, int);
|
||||
extern int TIFFInitJBIG(TIFF *, int);
|
||||
#endif
|
||||
#ifdef ZIP_SUPPORT
|
||||
extern int TIFFInitZIP(TIFF*, int);
|
||||
extern int TIFFInitZIP(TIFF *, int);
|
||||
#endif
|
||||
#ifdef PIXARLOG_SUPPORT
|
||||
extern int TIFFInitPixarLog(TIFF*, int);
|
||||
extern int TIFFInitPixarLog(TIFF *, int);
|
||||
#endif
|
||||
#ifdef LOGLUV_SUPPORT
|
||||
extern int TIFFInitSGILog(TIFF*, int);
|
||||
extern int TIFFInitSGILog(TIFF *, int);
|
||||
#endif
|
||||
#ifdef LERC_SUPPORT
|
||||
extern int TIFFInitLERC(TIFF* tif, int);
|
||||
extern int TIFFInitLERC(TIFF *tif, int);
|
||||
#endif
|
||||
#ifdef LZMA_SUPPORT
|
||||
extern int TIFFInitLZMA(TIFF*, int);
|
||||
extern int TIFFInitLZMA(TIFF *, int);
|
||||
#endif
|
||||
#ifdef ZSTD_SUPPORT
|
||||
extern int TIFFInitZSTD(TIFF*, int);
|
||||
extern int TIFFInitZSTD(TIFF *, int);
|
||||
#endif
|
||||
#ifdef WEBP_SUPPORT
|
||||
extern int TIFFInitWebP(TIFF*, int);
|
||||
extern int TIFFInitWebP(TIFF *, int);
|
||||
#endif
|
||||
extern const TIFFCodec _TIFFBuiltinCODECS[];
|
||||
extern void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *, uint32_t l, int32_t a, int32_t b,
|
||||
float *, float *, float *);
|
||||
extern const TIFFCodec _TIFFBuiltinCODECS[];
|
||||
extern void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *, uint32_t l, int32_t a,
|
||||
int32_t b, float *, float *, float *);
|
||||
|
||||
extern void* _TIFFmallocExt(TIFF* tif, tmsize_t s);
|
||||
extern void* _TIFFcallocExt(TIFF* tif, tmsize_t nmemb, tmsize_t siz);
|
||||
extern void* _TIFFreallocExt(TIFF* tif, void* p, tmsize_t s);
|
||||
extern void _TIFFfreeExt(TIFF* tif, void* p);
|
||||
extern void *_TIFFmallocExt(TIFF *tif, tmsize_t s);
|
||||
extern void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz);
|
||||
extern void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s);
|
||||
extern void _TIFFfreeExt(TIFF *tif, void *p);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.4.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
||||
#define TIFFLIB_VERSION_STR \
|
||||
"LIBTIFF, Version 4.4.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright " \
|
||||
"(c) 1991-1996 Silicon Graphics, Inc."
|
||||
/*
|
||||
* This define can be used in code that requires
|
||||
* compilation-related definitions specific to a
|
||||
|
||||
262
libtiff/uvcode.h
262
libtiff/uvcode.h
@@ -1,173 +1,93 @@
|
||||
/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */
|
||||
#define UV_SQSIZ (float)0.003500
|
||||
#define UV_NDIVS 16289
|
||||
#define UV_VSTART (float)0.016940
|
||||
#define UV_NVS 163
|
||||
static const struct {
|
||||
float ustart;
|
||||
short nus, ncum;
|
||||
} uv_row[UV_NVS] = {
|
||||
{ (float)0.247663, 4, 0 },
|
||||
{ (float)0.243779, 6, 4 },
|
||||
{ (float)0.241684, 7, 10 },
|
||||
{ (float)0.237874, 9, 17 },
|
||||
{ (float)0.235906, 10, 26 },
|
||||
{ (float)0.232153, 12, 36 },
|
||||
{ (float)0.228352, 14, 48 },
|
||||
{ (float)0.226259, 15, 62 },
|
||||
{ (float)0.222371, 17, 77 },
|
||||
{ (float)0.220410, 18, 94 },
|
||||
{ (float)0.214710, 21, 112 },
|
||||
{ (float)0.212714, 22, 133 },
|
||||
{ (float)0.210721, 23, 155 },
|
||||
{ (float)0.204976, 26, 178 },
|
||||
{ (float)0.202986, 27, 204 },
|
||||
{ (float)0.199245, 29, 231 },
|
||||
{ (float)0.195525, 31, 260 },
|
||||
{ (float)0.193560, 32, 291 },
|
||||
{ (float)0.189878, 34, 323 },
|
||||
{ (float)0.186216, 36, 357 },
|
||||
{ (float)0.186216, 36, 393 },
|
||||
{ (float)0.182592, 38, 429 },
|
||||
{ (float)0.179003, 40, 467 },
|
||||
{ (float)0.175466, 42, 507 },
|
||||
{ (float)0.172001, 44, 549 },
|
||||
{ (float)0.172001, 44, 593 },
|
||||
{ (float)0.168612, 46, 637 },
|
||||
{ (float)0.168612, 46, 683 },
|
||||
{ (float)0.163575, 49, 729 },
|
||||
{ (float)0.158642, 52, 778 },
|
||||
{ (float)0.158642, 52, 830 },
|
||||
{ (float)0.158642, 52, 882 },
|
||||
{ (float)0.153815, 55, 934 },
|
||||
{ (float)0.153815, 55, 989 },
|
||||
{ (float)0.149097, 58, 1044 },
|
||||
{ (float)0.149097, 58, 1102 },
|
||||
{ (float)0.142746, 62, 1160 },
|
||||
{ (float)0.142746, 62, 1222 },
|
||||
{ (float)0.142746, 62, 1284 },
|
||||
{ (float)0.138270, 65, 1346 },
|
||||
{ (float)0.138270, 65, 1411 },
|
||||
{ (float)0.138270, 65, 1476 },
|
||||
{ (float)0.132166, 69, 1541 },
|
||||
{ (float)0.132166, 69, 1610 },
|
||||
{ (float)0.126204, 73, 1679 },
|
||||
{ (float)0.126204, 73, 1752 },
|
||||
{ (float)0.126204, 73, 1825 },
|
||||
{ (float)0.120381, 77, 1898 },
|
||||
{ (float)0.120381, 77, 1975 },
|
||||
{ (float)0.120381, 77, 2052 },
|
||||
{ (float)0.120381, 77, 2129 },
|
||||
{ (float)0.112962, 82, 2206 },
|
||||
{ (float)0.112962, 82, 2288 },
|
||||
{ (float)0.112962, 82, 2370 },
|
||||
{ (float)0.107450, 86, 2452 },
|
||||
{ (float)0.107450, 86, 2538 },
|
||||
{ (float)0.107450, 86, 2624 },
|
||||
{ (float)0.107450, 86, 2710 },
|
||||
{ (float)0.100343, 91, 2796 },
|
||||
{ (float)0.100343, 91, 2887 },
|
||||
{ (float)0.100343, 91, 2978 },
|
||||
{ (float)0.095126, 95, 3069 },
|
||||
{ (float)0.095126, 95, 3164 },
|
||||
{ (float)0.095126, 95, 3259 },
|
||||
{ (float)0.095126, 95, 3354 },
|
||||
{ (float)0.088276, 100, 3449 },
|
||||
{ (float)0.088276, 100, 3549 },
|
||||
{ (float)0.088276, 100, 3649 },
|
||||
{ (float)0.088276, 100, 3749 },
|
||||
{ (float)0.081523, 105, 3849 },
|
||||
{ (float)0.081523, 105, 3954 },
|
||||
{ (float)0.081523, 105, 4059 },
|
||||
{ (float)0.081523, 105, 4164 },
|
||||
{ (float)0.074861, 110, 4269 },
|
||||
{ (float)0.074861, 110, 4379 },
|
||||
{ (float)0.074861, 110, 4489 },
|
||||
{ (float)0.074861, 110, 4599 },
|
||||
{ (float)0.068290, 115, 4709 },
|
||||
{ (float)0.068290, 115, 4824 },
|
||||
{ (float)0.068290, 115, 4939 },
|
||||
{ (float)0.068290, 115, 5054 },
|
||||
{ (float)0.063573, 119, 5169 },
|
||||
{ (float)0.063573, 119, 5288 },
|
||||
{ (float)0.063573, 119, 5407 },
|
||||
{ (float)0.063573, 119, 5526 },
|
||||
{ (float)0.057219, 124, 5645 },
|
||||
{ (float)0.057219, 124, 5769 },
|
||||
{ (float)0.057219, 124, 5893 },
|
||||
{ (float)0.057219, 124, 6017 },
|
||||
{ (float)0.050985, 129, 6141 },
|
||||
{ (float)0.050985, 129, 6270 },
|
||||
{ (float)0.050985, 129, 6399 },
|
||||
{ (float)0.050985, 129, 6528 },
|
||||
{ (float)0.050985, 129, 6657 },
|
||||
{ (float)0.044859, 134, 6786 },
|
||||
{ (float)0.044859, 134, 6920 },
|
||||
{ (float)0.044859, 134, 7054 },
|
||||
{ (float)0.044859, 134, 7188 },
|
||||
{ (float)0.040571, 138, 7322 },
|
||||
{ (float)0.040571, 138, 7460 },
|
||||
{ (float)0.040571, 138, 7598 },
|
||||
{ (float)0.040571, 138, 7736 },
|
||||
{ (float)0.036339, 142, 7874 },
|
||||
{ (float)0.036339, 142, 8016 },
|
||||
{ (float)0.036339, 142, 8158 },
|
||||
{ (float)0.036339, 142, 8300 },
|
||||
{ (float)0.032139, 146, 8442 },
|
||||
{ (float)0.032139, 146, 8588 },
|
||||
{ (float)0.032139, 146, 8734 },
|
||||
{ (float)0.032139, 146, 8880 },
|
||||
{ (float)0.027947, 150, 9026 },
|
||||
{ (float)0.027947, 150, 9176 },
|
||||
{ (float)0.027947, 150, 9326 },
|
||||
{ (float)0.023739, 154, 9476 },
|
||||
{ (float)0.023739, 154, 9630 },
|
||||
{ (float)0.023739, 154, 9784 },
|
||||
{ (float)0.023739, 154, 9938 },
|
||||
{ (float)0.019504, 158, 10092 },
|
||||
{ (float)0.019504, 158, 10250 },
|
||||
{ (float)0.019504, 158, 10408 },
|
||||
{ (float)0.016976, 161, 10566 },
|
||||
{ (float)0.016976, 161, 10727 },
|
||||
{ (float)0.016976, 161, 10888 },
|
||||
{ (float)0.016976, 161, 11049 },
|
||||
{ (float)0.012639, 165, 11210 },
|
||||
{ (float)0.012639, 165, 11375 },
|
||||
{ (float)0.012639, 165, 11540 },
|
||||
{ (float)0.009991, 168, 11705 },
|
||||
{ (float)0.009991, 168, 11873 },
|
||||
{ (float)0.009991, 168, 12041 },
|
||||
{ (float)0.009016, 170, 12209 },
|
||||
{ (float)0.009016, 170, 12379 },
|
||||
{ (float)0.009016, 170, 12549 },
|
||||
{ (float)0.006217, 173, 12719 },
|
||||
{ (float)0.006217, 173, 12892 },
|
||||
{ (float)0.005097, 175, 13065 },
|
||||
{ (float)0.005097, 175, 13240 },
|
||||
{ (float)0.005097, 175, 13415 },
|
||||
{ (float)0.003909, 177, 13590 },
|
||||
{ (float)0.003909, 177, 13767 },
|
||||
{ (float)0.002340, 177, 13944 },
|
||||
{ (float)0.002389, 170, 14121 },
|
||||
{ (float)0.001068, 164, 14291 },
|
||||
{ (float)0.001653, 157, 14455 },
|
||||
{ (float)0.000717, 150, 14612 },
|
||||
{ (float)0.001614, 143, 14762 },
|
||||
{ (float)0.000270, 136, 14905 },
|
||||
{ (float)0.000484, 129, 15041 },
|
||||
{ (float)0.001103, 123, 15170 },
|
||||
{ (float)0.001242, 115, 15293 },
|
||||
{ (float)0.001188, 109, 15408 },
|
||||
{ (float)0.001011, 103, 15517 },
|
||||
{ (float)0.000709, 97, 15620 },
|
||||
{ (float)0.000301, 89, 15717 },
|
||||
{ (float)0.002416, 82, 15806 },
|
||||
{ (float)0.003251, 76, 15888 },
|
||||
{ (float)0.003246, 69, 15964 },
|
||||
{ (float)0.004141, 62, 16033 },
|
||||
{ (float)0.005963, 55, 16095 },
|
||||
{ (float)0.008839, 47, 16150 },
|
||||
{ (float)0.010490, 40, 16197 },
|
||||
{ (float)0.016994, 31, 16237 },
|
||||
{ (float)0.023659, 21, 16268 },
|
||||
#define UV_SQSIZ (float)0.003500
|
||||
#define UV_NDIVS 16289
|
||||
#define UV_VSTART (float)0.016940
|
||||
#define UV_NVS 163
|
||||
static const struct
|
||||
{
|
||||
float ustart;
|
||||
short nus, ncum;
|
||||
} uv_row[UV_NVS] = {
|
||||
{(float)0.247663, 4, 0}, {(float)0.243779, 6, 4},
|
||||
{(float)0.241684, 7, 10}, {(float)0.237874, 9, 17},
|
||||
{(float)0.235906, 10, 26}, {(float)0.232153, 12, 36},
|
||||
{(float)0.228352, 14, 48}, {(float)0.226259, 15, 62},
|
||||
{(float)0.222371, 17, 77}, {(float)0.220410, 18, 94},
|
||||
{(float)0.214710, 21, 112}, {(float)0.212714, 22, 133},
|
||||
{(float)0.210721, 23, 155}, {(float)0.204976, 26, 178},
|
||||
{(float)0.202986, 27, 204}, {(float)0.199245, 29, 231},
|
||||
{(float)0.195525, 31, 260}, {(float)0.193560, 32, 291},
|
||||
{(float)0.189878, 34, 323}, {(float)0.186216, 36, 357},
|
||||
{(float)0.186216, 36, 393}, {(float)0.182592, 38, 429},
|
||||
{(float)0.179003, 40, 467}, {(float)0.175466, 42, 507},
|
||||
{(float)0.172001, 44, 549}, {(float)0.172001, 44, 593},
|
||||
{(float)0.168612, 46, 637}, {(float)0.168612, 46, 683},
|
||||
{(float)0.163575, 49, 729}, {(float)0.158642, 52, 778},
|
||||
{(float)0.158642, 52, 830}, {(float)0.158642, 52, 882},
|
||||
{(float)0.153815, 55, 934}, {(float)0.153815, 55, 989},
|
||||
{(float)0.149097, 58, 1044}, {(float)0.149097, 58, 1102},
|
||||
{(float)0.142746, 62, 1160}, {(float)0.142746, 62, 1222},
|
||||
{(float)0.142746, 62, 1284}, {(float)0.138270, 65, 1346},
|
||||
{(float)0.138270, 65, 1411}, {(float)0.138270, 65, 1476},
|
||||
{(float)0.132166, 69, 1541}, {(float)0.132166, 69, 1610},
|
||||
{(float)0.126204, 73, 1679}, {(float)0.126204, 73, 1752},
|
||||
{(float)0.126204, 73, 1825}, {(float)0.120381, 77, 1898},
|
||||
{(float)0.120381, 77, 1975}, {(float)0.120381, 77, 2052},
|
||||
{(float)0.120381, 77, 2129}, {(float)0.112962, 82, 2206},
|
||||
{(float)0.112962, 82, 2288}, {(float)0.112962, 82, 2370},
|
||||
{(float)0.107450, 86, 2452}, {(float)0.107450, 86, 2538},
|
||||
{(float)0.107450, 86, 2624}, {(float)0.107450, 86, 2710},
|
||||
{(float)0.100343, 91, 2796}, {(float)0.100343, 91, 2887},
|
||||
{(float)0.100343, 91, 2978}, {(float)0.095126, 95, 3069},
|
||||
{(float)0.095126, 95, 3164}, {(float)0.095126, 95, 3259},
|
||||
{(float)0.095126, 95, 3354}, {(float)0.088276, 100, 3449},
|
||||
{(float)0.088276, 100, 3549}, {(float)0.088276, 100, 3649},
|
||||
{(float)0.088276, 100, 3749}, {(float)0.081523, 105, 3849},
|
||||
{(float)0.081523, 105, 3954}, {(float)0.081523, 105, 4059},
|
||||
{(float)0.081523, 105, 4164}, {(float)0.074861, 110, 4269},
|
||||
{(float)0.074861, 110, 4379}, {(float)0.074861, 110, 4489},
|
||||
{(float)0.074861, 110, 4599}, {(float)0.068290, 115, 4709},
|
||||
{(float)0.068290, 115, 4824}, {(float)0.068290, 115, 4939},
|
||||
{(float)0.068290, 115, 5054}, {(float)0.063573, 119, 5169},
|
||||
{(float)0.063573, 119, 5288}, {(float)0.063573, 119, 5407},
|
||||
{(float)0.063573, 119, 5526}, {(float)0.057219, 124, 5645},
|
||||
{(float)0.057219, 124, 5769}, {(float)0.057219, 124, 5893},
|
||||
{(float)0.057219, 124, 6017}, {(float)0.050985, 129, 6141},
|
||||
{(float)0.050985, 129, 6270}, {(float)0.050985, 129, 6399},
|
||||
{(float)0.050985, 129, 6528}, {(float)0.050985, 129, 6657},
|
||||
{(float)0.044859, 134, 6786}, {(float)0.044859, 134, 6920},
|
||||
{(float)0.044859, 134, 7054}, {(float)0.044859, 134, 7188},
|
||||
{(float)0.040571, 138, 7322}, {(float)0.040571, 138, 7460},
|
||||
{(float)0.040571, 138, 7598}, {(float)0.040571, 138, 7736},
|
||||
{(float)0.036339, 142, 7874}, {(float)0.036339, 142, 8016},
|
||||
{(float)0.036339, 142, 8158}, {(float)0.036339, 142, 8300},
|
||||
{(float)0.032139, 146, 8442}, {(float)0.032139, 146, 8588},
|
||||
{(float)0.032139, 146, 8734}, {(float)0.032139, 146, 8880},
|
||||
{(float)0.027947, 150, 9026}, {(float)0.027947, 150, 9176},
|
||||
{(float)0.027947, 150, 9326}, {(float)0.023739, 154, 9476},
|
||||
{(float)0.023739, 154, 9630}, {(float)0.023739, 154, 9784},
|
||||
{(float)0.023739, 154, 9938}, {(float)0.019504, 158, 10092},
|
||||
{(float)0.019504, 158, 10250}, {(float)0.019504, 158, 10408},
|
||||
{(float)0.016976, 161, 10566}, {(float)0.016976, 161, 10727},
|
||||
{(float)0.016976, 161, 10888}, {(float)0.016976, 161, 11049},
|
||||
{(float)0.012639, 165, 11210}, {(float)0.012639, 165, 11375},
|
||||
{(float)0.012639, 165, 11540}, {(float)0.009991, 168, 11705},
|
||||
{(float)0.009991, 168, 11873}, {(float)0.009991, 168, 12041},
|
||||
{(float)0.009016, 170, 12209}, {(float)0.009016, 170, 12379},
|
||||
{(float)0.009016, 170, 12549}, {(float)0.006217, 173, 12719},
|
||||
{(float)0.006217, 173, 12892}, {(float)0.005097, 175, 13065},
|
||||
{(float)0.005097, 175, 13240}, {(float)0.005097, 175, 13415},
|
||||
{(float)0.003909, 177, 13590}, {(float)0.003909, 177, 13767},
|
||||
{(float)0.002340, 177, 13944}, {(float)0.002389, 170, 14121},
|
||||
{(float)0.001068, 164, 14291}, {(float)0.001653, 157, 14455},
|
||||
{(float)0.000717, 150, 14612}, {(float)0.001614, 143, 14762},
|
||||
{(float)0.000270, 136, 14905}, {(float)0.000484, 129, 15041},
|
||||
{(float)0.001103, 123, 15170}, {(float)0.001242, 115, 15293},
|
||||
{(float)0.001188, 109, 15408}, {(float)0.001011, 103, 15517},
|
||||
{(float)0.000709, 97, 15620}, {(float)0.000301, 89, 15717},
|
||||
{(float)0.002416, 82, 15806}, {(float)0.003251, 76, 15888},
|
||||
{(float)0.003246, 69, 15964}, {(float)0.004141, 62, 16033},
|
||||
{(float)0.005963, 55, 16095}, {(float)0.008839, 47, 16150},
|
||||
{(float)0.010490, 40, 16197}, {(float)0.016994, 31, 16237},
|
||||
{(float)0.023659, 21, 16268},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user