Index: third_party/libtiff/tif_predict.c |
diff --git a/third_party/tiff_v403/tif_predict.c b/third_party/libtiff/tif_predict.c |
similarity index 82% |
rename from third_party/tiff_v403/tif_predict.c |
rename to third_party/libtiff/tif_predict.c |
index a34faf0a7009ef61700747ed223e1cc041cf1e9f..1388dde59c7945288fb2836dc521ea71041e08e6 100644 |
--- a/third_party/tiff_v403/tif_predict.c |
+++ b/third_party/libtiff/tif_predict.c |
@@ -1,4 +1,4 @@ |
-/* $Id: tif_predict.c,v 1.32 2010-03-10 18:56:49 bfriesen Exp $ */ |
+/* $Id: tif_predict.c,v 1.35 2015-08-31 15:05:57 erouault Exp $ */ |
/* |
* Copyright (c) 1988-1997 Sam Leffler |
@@ -42,6 +42,8 @@ static void swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc); |
static void horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc); |
static void horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc); |
static void horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc); |
+static void swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc); |
+static void swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc); |
static void fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc); |
static void fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc); |
static int PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); |
@@ -207,7 +209,24 @@ PredictorSetupEncode(TIFF* tif) |
sp->encodetile = tif->tif_encodetile; |
tif->tif_encodetile = PredictorEncodeTile; |
} |
- } |
+ |
+ /* |
+ * If the data is horizontally differenced 16-bit data that |
+ * requires byte-swapping, then it must be byte swapped after |
+ * the differenciation step. We do this with a special-purpose |
+ * routine and override the normal post decoding logic that |
+ * the library setup when the directory was read. |
+ */ |
+ if (tif->tif_flags & TIFF_SWAB) { |
+ if (sp->encodepfunc == horDiff16) { |
+ sp->encodepfunc = swabHorDiff16; |
+ tif->tif_postdecode = _TIFFNoPostDecode; |
+ } else if (sp->encodepfunc == horDiff32) { |
+ sp->encodepfunc = swabHorDiff32; |
+ tif->tif_postdecode = _TIFFNoPostDecode; |
+ } |
+ } |
+ } |
else if (sp->predictor == 3) { |
sp->encodepfunc = fpDiff; |
@@ -239,18 +258,18 @@ PredictorSetupEncode(TIFF* tif) |
case 0: ; \ |
} |
+/* Remarks related to C standard compliance in all below functions : */ |
+/* - to avoid any undefined behaviour, we only operate on unsigned types */ |
+/* since the behaviour of "overflows" is defined (wrap over) */ |
+/* - when storing into the byte stream, we explicitly mask with 0xff so */ |
+/* as to make icc -check=conversions happy (not necessary by the standard) */ |
+ |
static void |
horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
- /* |
- * compare v4.0.3 with v3.9.5, |
- * we find that horAcc8 uses while loop in the v4.0.3 and uses do while loop in the v3.9.5. |
- * times of do while loop are less than while loop, so we use v3.9.5 instead of v4.0.3. |
- */ |
-#if 0 |
tmsize_t stride = PredictorState(tif)->stride; |
- char* cp = (char*) cp0; |
+ unsigned char* cp = (unsigned char*) cp0; |
assert((cc%stride)==0); |
if (cc > stride) { |
/* |
@@ -263,9 +282,9 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) |
cc -= 3; |
cp += 3; |
while (cc>0) { |
- cp[0] = (char) (cr += cp[0]); |
- cp[1] = (char) (cg += cp[1]); |
- cp[2] = (char) (cb += cp[2]); |
+ cp[0] = (unsigned char) ((cr += cp[0]) & 0xff); |
+ cp[1] = (unsigned char) ((cg += cp[1]) & 0xff); |
+ cp[2] = (unsigned char) ((cb += cp[2]) & 0xff); |
cc -= 3; |
cp += 3; |
} |
@@ -277,10 +296,10 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) |
cc -= 4; |
cp += 4; |
while (cc>0) { |
- cp[0] = (char) (cr += cp[0]); |
- cp[1] = (char) (cg += cp[1]); |
- cp[2] = (char) (cb += cp[2]); |
- cp[3] = (char) (ca += cp[3]); |
+ cp[0] = (unsigned char) ((cr += cp[0]) & 0xff); |
+ cp[1] = (unsigned char) ((cg += cp[1]) & 0xff); |
+ cp[2] = (unsigned char) ((cb += cp[2]) & 0xff); |
+ cp[3] = (unsigned char) ((ca += cp[3]) & 0xff); |
cc -= 4; |
cp += 4; |
} |
@@ -288,70 +307,21 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) |
cc -= stride; |
do { |
REPEAT4(stride, cp[stride] = |
- (char) (cp[stride] + *cp); cp++) |
+ (unsigned char) ((cp[stride] + *cp) & 0xff); cp++) |
cc -= stride; |
} while (cc>0); |
} |
} |
-#else |
- tsize_t stride = PredictorState(tif)->stride; |
- |
- char* cp = (char*) cp0; |
- if (cc > stride) { |
- cc -= stride; |
- /* |
- * Pipeline the most common cases. |
- */ |
- if (stride == 3) { |
- unsigned int cr = cp[0]; |
- unsigned int cg = cp[1]; |
- unsigned int cb = cp[2]; |
- do { |
- cc -= 3, cp += 3; |
- cp[0] = (char) (cr += cp[0]); |
- cp[1] = (char) (cg += cp[1]); |
- cp[2] = (char) (cb += cp[2]); |
- } while ((int32) cc > 0); |
- } else if (stride == 4) { |
- unsigned int cr = cp[0]; |
- unsigned int cg = cp[1]; |
- unsigned int cb = cp[2]; |
- unsigned int ca = cp[3]; |
- do { |
- cc -= 4, cp += 4; |
- cp[0] = (char) (cr += cp[0]); |
- cp[1] = (char) (cg += cp[1]); |
- cp[2] = (char) (cb += cp[2]); |
- cp[3] = (char) (ca += cp[3]); |
- } while ((int32) cc > 0); |
- } else { |
- do { |
- REPEAT4(stride, cp[stride] = |
- (char) (cp[stride] + *cp); cp++) |
- cc -= stride; |
- } while ((int32) cc > 0); |
- } |
- } |
-#endif |
} |
static void |
swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
- tmsize_t stride = PredictorState(tif)->stride; |
uint16* wp = (uint16*) cp0; |
tmsize_t wc = cc / 2; |
- assert((cc%(2*stride))==0); |
- |
- if (wc > stride) { |
- TIFFSwabArrayOfShort(wp, wc); |
- wc -= stride; |
- do { |
- REPEAT4(stride, wp[stride] += wp[0]; wp++) |
- wc -= stride; |
- } while (wc > 0); |
- } |
+ TIFFSwabArrayOfShort(wp, wc); |
+ horAcc16(tif, cp0, cc); |
} |
static void |
@@ -366,7 +336,7 @@ horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) |
if (wc > stride) { |
wc -= stride; |
do { |
- REPEAT4(stride, wp[stride] += wp[0]; wp++) |
+ REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] + (unsigned int)wp[0]) & 0xffff); wp++) |
wc -= stride; |
} while (wc > 0); |
} |
@@ -375,20 +345,11 @@ horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) |
static void |
swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
- tmsize_t stride = PredictorState(tif)->stride; |
uint32* wp = (uint32*) cp0; |
tmsize_t wc = cc / 4; |
- assert((cc%(4*stride))==0); |
- |
- if (wc > stride) { |
- TIFFSwabArrayOfLong(wp, wc); |
- wc -= stride; |
- do { |
- REPEAT4(stride, wp[stride] += wp[0]; wp++) |
- wc -= stride; |
- } while (wc > 0); |
- } |
+ TIFFSwabArrayOfLong(wp, wc); |
+ horAcc32(tif, cp0, cc); |
} |
static void |
@@ -428,7 +389,8 @@ fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc) |
return; |
while (count > stride) { |
- REPEAT4(stride, cp[stride] += cp[0]; cp++) |
+ REPEAT4(stride, cp[stride] = |
+ (unsigned char) ((cp[stride] + cp[0]) & 0xff); cp++) |
count -= stride; |
} |
@@ -502,7 +464,7 @@ horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
TIFFPredictorState* sp = PredictorState(tif); |
tmsize_t stride = sp->stride; |
- char* cp = (char*) cp0; |
+ unsigned char* cp = (unsigned char*) cp0; |
assert((cc%stride)==0); |
@@ -512,33 +474,33 @@ horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc) |
* Pipeline the most common cases. |
*/ |
if (stride == 3) { |
- int r1, g1, b1; |
- int r2 = cp[0]; |
- int g2 = cp[1]; |
- int b2 = cp[2]; |
+ unsigned int r1, g1, b1; |
+ unsigned int r2 = cp[0]; |
+ unsigned int g2 = cp[1]; |
+ unsigned int b2 = cp[2]; |
do { |
- r1 = cp[3]; cp[3] = r1-r2; r2 = r1; |
- g1 = cp[4]; cp[4] = g1-g2; g2 = g1; |
- b1 = cp[5]; cp[5] = b1-b2; b2 = b1; |
+ r1 = cp[3]; cp[3] = (unsigned char)((r1-r2)&0xff); r2 = r1; |
+ g1 = cp[4]; cp[4] = (unsigned char)((g1-g2)&0xff); g2 = g1; |
+ b1 = cp[5]; cp[5] = (unsigned char)((b1-b2)&0xff); b2 = b1; |
cp += 3; |
} while ((cc -= 3) > 0); |
} else if (stride == 4) { |
- int r1, g1, b1, a1; |
- int r2 = cp[0]; |
- int g2 = cp[1]; |
- int b2 = cp[2]; |
- int a2 = cp[3]; |
+ unsigned int r1, g1, b1, a1; |
+ unsigned int r2 = cp[0]; |
+ unsigned int g2 = cp[1]; |
+ unsigned int b2 = cp[2]; |
+ unsigned int a2 = cp[3]; |
do { |
- r1 = cp[4]; cp[4] = r1-r2; r2 = r1; |
- g1 = cp[5]; cp[5] = g1-g2; g2 = g1; |
- b1 = cp[6]; cp[6] = b1-b2; b2 = b1; |
- a1 = cp[7]; cp[7] = a1-a2; a2 = a1; |
+ r1 = cp[4]; cp[4] = (unsigned char)((r1-r2)&0xff); r2 = r1; |
+ g1 = cp[5]; cp[5] = (unsigned char)((g1-g2)&0xff); g2 = g1; |
+ b1 = cp[6]; cp[6] = (unsigned char)((b1-b2)&0xff); b2 = b1; |
+ a1 = cp[7]; cp[7] = (unsigned char)((a1-a2)&0xff); a2 = a1; |
cp += 4; |
} while ((cc -= 4) > 0); |
} else { |
cp += cc - 1; |
do { |
- REPEAT4(stride, cp[stride] -= cp[0]; cp--) |
+ REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--) |
} while ((cc -= stride) > 0); |
} |
} |
@@ -549,7 +511,7 @@ horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
TIFFPredictorState* sp = PredictorState(tif); |
tmsize_t stride = sp->stride; |
- int16 *wp = (int16*) cp0; |
+ uint16 *wp = (uint16*) cp0; |
tmsize_t wc = cc/2; |
assert((cc%(2*stride))==0); |
@@ -558,18 +520,29 @@ horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) |
wc -= stride; |
wp += wc - 1; |
do { |
- REPEAT4(stride, wp[stride] -= wp[0]; wp--) |
+ REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] - (unsigned int)wp[0]) & 0xffff); wp--) |
wc -= stride; |
} while (wc > 0); |
} |
} |
static void |
+swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) |
+{ |
+ uint16* wp = (uint16*) cp0; |
+ tmsize_t wc = cc / 2; |
+ |
+ horDiff16(tif, cp0, cc); |
+ |
+ TIFFSwabArrayOfShort(wp, wc); |
+} |
+ |
+static void |
horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) |
{ |
TIFFPredictorState* sp = PredictorState(tif); |
tmsize_t stride = sp->stride; |
- int32 *wp = (int32*) cp0; |
+ uint32 *wp = (uint32*) cp0; |
tmsize_t wc = cc/4; |
assert((cc%(4*stride))==0); |
@@ -584,6 +557,17 @@ horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) |
} |
} |
+static void |
+swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) |
+{ |
+ uint32* wp = (uint32*) cp0; |
+ tmsize_t wc = cc / 4; |
+ |
+ horDiff32(tif, cp0, cc); |
+ |
+ TIFFSwabArrayOfLong(wp, wc); |
+} |
+ |
/* |
* Floating point predictor differencing routine. |
*/ |
@@ -619,7 +603,7 @@ fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc) |
cp = (uint8 *) cp0; |
cp += cc - stride - 1; |
for (count = cc; count > stride; count -= stride) |
- REPEAT4(stride, cp[stride] -= cp[0]; cp--) |
+ REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--) |
} |
static int |
@@ -808,4 +792,3 @@ TIFFPredictorCleanup(TIFF* tif) |
* fill-column: 78 |
* End: |
*/ |
- |