Blob Blame Raw


#include "trop.h"
#include "tpixelgr.h"

namespace {
template <typename PixType>
inline void do_invert(TRasterPT<PixType> ras) {
  int wrap         = ras->getWrap();
  int lx           = ras->getLx();
  PixType *rowIn   = ras->pixels();
  PixType *lastPix = rowIn + wrap * ras->getLy();
  PixType *pixIn   = 0;
  PixType *endPix  = 0;

  while (pixIn < lastPix) {
    pixIn  = rowIn;
    endPix = pixIn + lx;
    while (pixIn < endPix) {
      pixIn->r = pixIn->m - pixIn->r;
      pixIn->g = pixIn->m - pixIn->g;
      pixIn->b = pixIn->m - pixIn->b; /*pixIn->m = pixIn->m;*/

      ++pixIn;
    }
    rowIn += wrap;
  }
}
//------------------------------------------------------------------------------

template <typename PixType>
inline void do_invert(TRasterPT<PixType> ras, bool invRed, bool invGreen,
                      bool invBlue, bool invMatte) {
  int wrap         = ras->getWrap();
  int lx           = ras->getLx();
  PixType *rowIn   = ras->pixels();
  PixType *lastPix = rowIn + wrap * ras->getLy();
  PixType *pixIn   = 0;
  PixType *endPix  = 0;

  while (pixIn < lastPix) {
    pixIn  = rowIn;
    endPix = pixIn + lx;
    while (pixIn < endPix) {
      if (invRed) pixIn->r   = pixIn->m - pixIn->r;
      if (invGreen) pixIn->g = pixIn->m - pixIn->g;
      if (invBlue) pixIn->b  = pixIn->m - pixIn->b;
      if (invMatte) pixIn->m = ~pixIn->m;
      ++pixIn;
    }
    rowIn += wrap;
  }
}

//------------------------------------------------------------------------------

template <>
inline void do_invert<TPixelGR8>(TRasterPT<TPixelGR8> ras) {
  int wrap           = ras->getWrap();
  int lx             = ras->getLx();
  TPixelGR8 *rowIn   = ras->pixels();
  TPixelGR8 *lastPix = rowIn + wrap * ras->getLy();
  TPixelGR8 *pixIn   = 0;
  TPixelGR8 *endPix  = 0;

  while (pixIn < lastPix) {
    pixIn  = rowIn;
    endPix = pixIn + lx;
    while (pixIn < endPix) {
      pixIn->value = 255 - pixIn->value;

      ++pixIn;
    }
    rowIn += wrap;
  }
}
}

//------------------------------------------------------------------------------

void TRop::invert(TRasterP ras, bool invRed, bool invGreen, bool invBlue,
                  bool invMatte) {
  if (!invRed && !invGreen && !invBlue) return;
  bool flag = invRed && invGreen && invBlue && !invMatte;

  TRaster32P ras32 = ras;
  ras->lock();
  if (ras32)
    if (flag)
      do_invert<TPixel32>(ras32);
    else
      do_invert<TPixel32>(ras, invRed, invGreen, invBlue, invMatte);
  else {
    TRaster64P ras64 = ras;
    if (ras64)
      if (flag)
        do_invert<TPixel64>(ras64);
      else
        do_invert<TPixel64>(ras64, invRed, invGreen, invBlue, invMatte);
    else {
      TRasterGR8P ras8 = ras;
      if (ras8)
        do_invert<TPixelGR8>(ras8);
      else {
        ras->unlock();
        throw TRopException("unsupported pixel type");
      }
    }
  }
  ras->unlock();
}

//------------------------------------------------------------------------------