/* ************************************************************************** */ /* * For conditions of distribution and use, * */ /* * see copyright notice in libmng.h * */ /* ************************************************************************** */ /* * * */ /* * project : libmng * */ /* * file : libmng_filter.c copyright (c) 2000-2004 G.Juyn * */ /* * version : 1.0.9 * */ /* * * */ /* * purpose : Filtering routines (implementation) * */ /* * * */ /* * author : G.Juyn * */ /* * * */ /* * comment : implementation of the filtering routines * */ /* * * */ /* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */ /* * - changed strict-ANSI stuff * */ /* * 0.5.1 - 05/12/2000 - G.Juyn * */ /* * - changed trace to macro for callback error-reporting * */ /* * * */ /* * 0.9.2 - 08/05/2000 - G.Juyn * */ /* * - changed file-prefixes * */ /* * * */ /* * 0.9.3 - 09/07/2000 - G.Juyn * */ /* * - added support for new filter_types * */ /* * * */ /* * 1.0.5 - 08/07/2002 - G.Juyn * */ /* * - added test-option for PNG filter method 193 (=no filter) * */ /* * 1.0.5 - 08/19/2002 - G.Juyn * */ /* * - B597134 - libmng pollutes the linker namespace * */ /* * * */ /* * 1.0.6 - 07/07/2003 - G.R-P * */ /* * - reversed some loops to use decrementing counter * */ /* * * */ /* * 1.0.9 - 12/20/2004 - G.Juyn * */ /* * - cleaned up macro-invocations (thanks to D. Airlie) * */ /* * * */ /* ************************************************************************** */ #include "libmng.h" #include "libmng_data.h" #include "libmng_error.h" #include "libmng_trace.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #include "libmng_filter.h" #if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI) #pragma option -A /* force ANSI-C */ #endif /* ************************************************************************** */ #ifdef MNG_INCLUDE_FILTERS /* ************************************************************************** */ MNG_LOCAL mng_retcode filter_sub (mng_datap pData) { mng_uint32 iBpp; mng_uint8p pRawx; mng_uint8p pRawx_prev; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_SUB, MNG_LC_START); #endif iBpp = pData->iFilterbpp; pRawx = pData->pWorkrow + pData->iPixelofs + iBpp; pRawx_prev = pData->pWorkrow + pData->iPixelofs; for (iX = iBpp; iX < pData->iRowsize; iX++) { *pRawx = (mng_uint8)(*pRawx + *pRawx_prev); pRawx++; pRawx_prev++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_SUB, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ MNG_LOCAL mng_retcode filter_up (mng_datap pData) { mng_uint8p pRawx; mng_uint8p pPriorx; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_UP, MNG_LC_START); #endif pRawx = pData->pWorkrow + pData->iPixelofs; pPriorx = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsize - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsize; iX++) #endif { *pRawx = (mng_uint8)(*pRawx + *pPriorx); pRawx++; pPriorx++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_UP, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ MNG_LOCAL mng_retcode filter_average (mng_datap pData) { mng_int32 iBpp; mng_uint8p pRawx; mng_uint8p pRawx_prev; mng_uint8p pPriorx; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_AVERAGE, MNG_LC_START); #endif iBpp = pData->iFilterbpp; pRawx = pData->pWorkrow + pData->iPixelofs; pPriorx = pData->pPrevrow + pData->iPixelofs; pRawx_prev = pData->pWorkrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = iBpp - 1; iX >= 0; iX--) #else for (iX = 0; iX < iBpp; iX++) #endif { *pRawx = (mng_uint8)(*pRawx + ((*pPriorx) >> 1)); pRawx++; pPriorx++; } for (iX = iBpp; iX < pData->iRowsize; iX++) { *pRawx = (mng_uint8)(*pRawx + ((*pRawx_prev + *pPriorx) >> 1)); pRawx++; pPriorx++; pRawx_prev++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_AVERAGE, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ MNG_LOCAL mng_retcode filter_paeth (mng_datap pData) { mng_int32 iBpp; mng_uint8p pRawx; mng_uint8p pRawx_prev; mng_uint8p pPriorx; mng_uint8p pPriorx_prev; mng_int32 iX; mng_uint32 iA, iB, iC; mng_uint32 iP; mng_uint32 iPa, iPb, iPc; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_PAETH, MNG_LC_START); #endif iBpp = pData->iFilterbpp; pRawx = pData->pWorkrow + pData->iPixelofs; pPriorx = pData->pPrevrow + pData->iPixelofs; pRawx_prev = pData->pWorkrow + pData->iPixelofs; pPriorx_prev = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = iBpp - 1; iX >= 0; iX--) #else for (iX = 0; iX < iBpp; iX++) #endif { *pRawx = (mng_uint8)(*pRawx + *pPriorx); pRawx++; pPriorx++; } for (iX = iBpp; iX < pData->iRowsize; iX++) { iA = (mng_uint32)*pRawx_prev; iB = (mng_uint32)*pPriorx; iC = (mng_uint32)*pPriorx_prev; iP = iA + iB - iC; iPa = abs (iP - iA); iPb = abs (iP - iB); iPc = abs (iP - iC); if ((iPa <= iPb) && (iPa <= iPc)) *pRawx = (mng_uint8)(*pRawx + iA); else if (iPb <= iPc) *pRawx = (mng_uint8)(*pRawx + iB); else *pRawx = (mng_uint8)(*pRawx + iC); pRawx++; pPriorx++; pRawx_prev++; pPriorx_prev++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_PAETH, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_filter_a_row (mng_datap pData) { mng_retcode iRetcode; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_A_ROW, MNG_LC_START); #endif switch (*(pData->pWorkrow + pData->iFilterofs)) { case 1 : { iRetcode = filter_sub (pData); break; } case 2 : { iRetcode = filter_up (pData); break; } case 3 : { iRetcode = filter_average (pData); break; } case 4 : { iRetcode = filter_paeth (pData); break; } default : iRetcode = MNG_INVALIDFILTER; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_FILTER_A_ROW, MNG_LC_END); #endif return iRetcode; } /* ************************************************************************** */ /* ************************************************************************** */ #ifdef FILTER192 mng_retcode mng_init_rowdiffering (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ROWDIFFERING, MNG_LC_START); #endif if (pData->iFilter == 0xC0) /* has leveling parameters ? */ { switch (pData->iColortype) /* salvage leveling parameters */ { case 0 : { /* gray */ if (pData->iBitdepth <= 8) pData->iLevel0 = (mng_uint16)*pData->pWorkrow; else pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); break; } case 2 : { /* rgb */ if (pData->iBitdepth <= 8) { pData->iLevel0 = (mng_uint16)*pData->pWorkrow; pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); pData->iLevel2 = (mng_uint16)*(pData->pWorkrow+2); } else { pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); pData->iLevel2 = mng_get_uint16 (pData->pWorkrow+4); } break; } case 3 : { /* indexed */ pData->iLevel0 = (mng_uint16)*pData->pWorkrow; break; } case 4 : { /* gray+alpha */ if (pData->iBitdepth <= 8) { pData->iLevel0 = (mng_uint16)*pData->pWorkrow; pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); } else { pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); } break; } case 6 : { /* rgb+alpha */ if (pData->iBitdepth <= 8) { pData->iLevel0 = (mng_uint16)*pData->pWorkrow; pData->iLevel1 = (mng_uint16)*(pData->pWorkrow+1); pData->iLevel2 = (mng_uint16)*(pData->pWorkrow+2); pData->iLevel3 = (mng_uint16)*(pData->pWorkrow+3); } else { pData->iLevel0 = mng_get_uint16 (pData->pWorkrow); pData->iLevel1 = mng_get_uint16 (pData->pWorkrow+2); pData->iLevel2 = mng_get_uint16 (pData->pWorkrow+4); pData->iLevel3 = mng_get_uint16 (pData->pWorkrow+6); } break; } } } /* shift the entire row back in place */ pRawi = pData->pWorkrow + pData->iFilterofs; pRawo = pData->pWorkrow; for (iX = 0; iX < pData->iRowsize + pData->iPixelofs - pData->iFilterofs; iX++) *pRawo++ = *pRawi++; pData->iFilterofs = 0; /* indicate so ! */ #ifdef FILTER193 if (pData->iFilter == 0xC1) /* no adaptive filtering ? */ pData->iPixelofs = pData->iFilterofs; else #endif pData->iPixelofs = pData->iFilterofs + 1; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ROWDIFFERING, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_g1 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G1, MNG_LC_START); #endif if (pData->iLevel0 & 0x01) /* is it uneven level ? */ { pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; /* just invert every bit */ #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsize - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsize; iX++) #endif *pRawo++ = (mng_uint8)(~(*pRawi++)); } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G1, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_g2 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; mng_int32 iC, iS; mng_uint8 iB, iN, iQ; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G2, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; iC = 0; iB = 0; iN = 0; iS = 0; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { if (!iC) { iC = 4; iB = *pRawi++; iN = 0; iS = 8; } iS -= 2; iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x03); iN = (mng_uint8)((iN << 2) + iQ); iC--; if (!iC) *pRawo++ = iN; } if (iC) *pRawo = (mng_uint8)(iN << iS); #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G2, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_g4 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; mng_int32 iC, iS; mng_uint8 iB, iN, iQ; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G4, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; iC = 0; iB = 0; iN = 0; iS = 0; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { if (!iC) { iC = 2; iB = *pRawi++; iN = 0; iS = 8; } iS -= 4; iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x0F); iN = (mng_uint8)((iN << 4) + iQ); iC--; if (!iC) *pRawo++ = iN; } if (iC) *pRawo = (mng_uint8)(iN << iS); #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G4, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_g8 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G8, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *pRawo++ = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); pRawi++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G8, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_g16 (mng_datap pData) { mng_uint16p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G16, MNG_LC_START); #endif pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *pRawo++ = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0) & 0xFFFF); pRawi++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_G16, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_rgb8 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGB8, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0 + (mng_uint16)*(pRawo+1)) & 0xFF); *(pRawo+2) = (mng_uint8)(((mng_uint16)*(pRawi+2) + pData->iLevel2 + (mng_uint16)*(pRawo+1)) & 0xFF); pRawi += 3; pRawo += 3; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGB8, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_rgb16 (mng_datap pData) { mng_uint16p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGB16, MNG_LC_START); #endif pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0 + (mng_uint32)*(pRawo+1)) & 0xFFFF); *(pRawo+2) = (mng_uint16)(((mng_uint32)*(pRawi+2) + (mng_uint32)pData->iLevel2 + (mng_uint32)*(pRawo+1)) & 0xFFFF); pRawi += 3; pRawo += 3; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGB16, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_idx1 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX1, MNG_LC_START); #endif if (pData->iLevel0 & 0x01) /* is it uneven level ? */ { pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; /* just invert every bit */ #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsize - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsize; iX++) #endif *pRawo++ = (mng_uint8)(~(*pRawi++)); } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX1, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_idx2 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; mng_int32 iC, iS; mng_uint8 iB, iN, iQ; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX2, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; iC = 0; iB = 0; iN = 0; iS = 0; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { if (!iC) { iC = 4; iB = *pRawi++; iN = 0; iS = 8; } iS -= 2; iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x03); iN = (mng_uint8)((iN << 2) + iQ); iC--; if (!iC) *pRawo++ = iN; } if (iC) *pRawo = (mng_uint8)(iN << iS); #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX2, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_idx4 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; mng_int32 iC, iS; mng_uint8 iB, iN, iQ; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX4, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; iC = 0; iB = 0; iN = 0; iS = 0; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { if (!iC) { iC = 2; iB = *pRawi++; iN = 0; iS = 8; } iS -= 4; iQ = (mng_uint8)(((iB >> iS) + pData->iLevel0) & 0x0F); iN = (mng_uint8)((iN << 4) + iQ); iC--; if (!iC) *pRawo++ = iN; } if (iC) *pRawo = (mng_uint8)(iN << iS); #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX4, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_idx8 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX8, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *pRawo++ = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); pRawi++; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_IDX8, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_ga8 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_GA8, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0) & 0xFF); *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); pRawi += 2; pRawo += 2; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_GA8, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_ga16 (mng_datap pData) { mng_uint16p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_GA16, MNG_LC_START); #endif pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0) & 0xFFFF); *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); pRawi += 2; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_GA16, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_rgba8 (mng_datap pData) { mng_uint8p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGBA8, MNG_LC_START); #endif pRawi = pData->pWorkrow + pData->iPixelofs; pRawo = pData->pPrevrow + pData->iPixelofs; #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *(pRawo+1) = (mng_uint8)(((mng_uint16)*(pRawi+1) + pData->iLevel1) & 0xFF); *pRawo = (mng_uint8)(((mng_uint16)*pRawi + pData->iLevel0 + (mng_uint16)*(pRawo+1)) & 0xFF); *(pRawo+2) = (mng_uint8)(((mng_uint16)*(pRawi+2) + pData->iLevel2 + (mng_uint16)*(pRawo+1)) & 0xFF); *(pRawo+3) = (mng_uint8)(((mng_uint16)*(pRawi+3) + pData->iLevel3) & 0xFF); pRawi += 4; pRawo += 4; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGBA8, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ mng_retcode mng_differ_rgba16 (mng_datap pData) { mng_uint16p pRawi, pRawo; mng_int32 iX; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGBA16, MNG_LC_START); #endif pRawi = (mng_uint16p)(pData->pWorkrow + pData->iPixelofs); pRawo = (mng_uint16p)(pData->pPrevrow + pData->iPixelofs); #ifdef MNG_DECREMENT_LOOPS for (iX = pData->iRowsamples - 1; iX >= 0; iX--) #else for (iX = 0; iX < pData->iRowsamples; iX++) #endif { *(pRawo+1) = (mng_uint16)(((mng_uint32)*(pRawi+1) + (mng_uint32)pData->iLevel1) & 0xFFFF); *pRawo = (mng_uint16)(((mng_uint32)*pRawi + (mng_uint32)pData->iLevel0 + (mng_uint32)*(pRawo+1)) & 0xFFFF); *(pRawo+2) = (mng_uint16)(((mng_uint32)*(pRawi+2) + (mng_uint32)pData->iLevel2 + (mng_uint32)*(pRawo+1)) & 0xFFFF); *(pRawo+3) = (mng_uint16)(((mng_uint32)*(pRawi+3) + (mng_uint32)pData->iLevel3) & 0xFFFF); pRawi += 4; pRawo += 4; } #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DIFFER_RGBA16, MNG_LC_END); #endif return MNG_NOERROR; } /* ************************************************************************** */ #endif /* FILTER192 */ /* ************************************************************************** */ #endif /* MNG_INCLUDE_FILTERS */ /* ************************************************************************** */ /* * end of file * */ /* ************************************************************************** */