From 2ed09338d9db233f9946c54b192e4e2a0f6f73dd Mon Sep 17 00:00:00 2001 From: Andrey Kiselev Date: Fri, 3 Mar 2006 14:10:09 +0000 Subject: [PATCH] Added new function TIFFPredictorCleanup() to restore parent decode/encode/field methods. --- libtiff/tif_predict.c | 32 ++++++++++++++++++++++++++++++-- libtiff/tif_predict.h | 3 ++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/libtiff/tif_predict.c b/libtiff/tif_predict.c index b4b5c363..f843619c 100644 --- a/libtiff/tif_predict.c +++ b/libtiff/tif_predict.c @@ -1,4 +1,4 @@ -/* $Id: tif_predict.c,v 1.10 2005-12-21 12:23:13 joris Exp $ */ +/* $Id: tif_predict.c,v 1.11 2006-03-03 14:10:09 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -339,6 +339,7 @@ PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) assert(sp != NULL); assert(sp->coderow != NULL); assert(sp->pfunc != NULL); + if ((*sp->coderow)(tif, op0, occ0, s)) { (*sp->pfunc)(tif, op0, occ0); return 1; @@ -360,6 +361,7 @@ PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) assert(sp != NULL); assert(sp->codetile != NULL); + if ((*sp->codetile)(tif, op0, occ0, s)) { tsize_t rowsize = sp->rowsize; assert(rowsize > 0); @@ -481,7 +483,8 @@ PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) assert(sp != NULL); assert(sp->pfunc != NULL); assert(sp->coderow != NULL); -/* XXX horizontal differencing alters user's data XXX */ + + /* XXX horizontal differencing alters user's data XXX */ (*sp->pfunc)(tif, bp, cc); return (*sp->coderow)(tif, bp, cc, s); } @@ -496,6 +499,7 @@ PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s) assert(sp != NULL); assert(sp->pfunc != NULL); assert(sp->codetile != NULL); + rowsize = sp->rowsize; assert(rowsize > 0); while ((long)cc > 0) { @@ -519,6 +523,9 @@ PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); + assert(sp != NULL); + assert(sp->vsetparent != NULL); + switch (tag) { case TIFFTAG_PREDICTOR: sp->predictor = (uint16) va_arg(ap, int); @@ -536,6 +543,9 @@ PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); + assert(sp != NULL); + assert(sp->vgetparent != NULL); + switch (tag) { case TIFFTAG_PREDICTOR: *va_arg(ap, uint16*) = sp->predictor; @@ -570,6 +580,8 @@ TIFFPredictorInit(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); + assert(sp != 0); + /* * Merge codec-specific tag information and * override parent get/set field methods. @@ -595,4 +607,20 @@ TIFFPredictorInit(TIFF* tif) return 1; } +int +TIFFPredictorCleanup(TIFF* tif) +{ + TIFFPredictorState* sp = PredictorState(tif); + + assert(sp != 0); + + tif->tif_tagmethods.vgetfield = sp->vgetparent; + tif->tif_tagmethods.vsetfield = sp->vsetparent; + tif->tif_tagmethods.printdir = sp->printdir; + tif->tif_setupdecode = sp->setupdecode; + tif->tif_setupencode = sp->setupencode; + + return 1; +} + /* vim: set ts=8 sts=8 sw=8 noet: */ diff --git a/libtiff/tif_predict.h b/libtiff/tif_predict.h index da8ec00e..310cf444 100644 --- a/libtiff/tif_predict.h +++ b/libtiff/tif_predict.h @@ -1,4 +1,4 @@ -/* $Id: tif_predict.h,v 1.2 2005-04-14 11:57:30 dron Exp $ */ +/* $Id: tif_predict.h,v 1.3 2006-03-03 14:10:09 dron Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler @@ -55,6 +55,7 @@ typedef struct { extern "C" { #endif extern int TIFFPredictorInit(TIFF*); +extern int TIFFPredictorCleanup(TIFF*); #if defined(__cplusplus) } #endif