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