#include "trop.h" #include "tpixelgr.h" namespace { template inline void do_invert(TRasterPT 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 inline void do_invert(TRasterPT 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(TRasterPT 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(ras32); else do_invert(ras, invRed, invGreen, invBlue, invMatte); else { TRaster64P ras64 = ras; if (ras64) if (flag) do_invert(ras64); else do_invert(ras64, invRed, invGreen, invBlue, invMatte); else { TRasterGR8P ras8 = ras; if (ras8) do_invert(ras8); else { ras->unlock(); throw TRopException("unsupported pixel type"); } } } ras->unlock(); } //------------------------------------------------------------------------------