Blame libmng_filter.c

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