Files
Work/mdiwin/AVERAGE.CPP
2024-08-07 09:16:27 -04:00

158 lines
4.4 KiB
C++

#include <stdio.h>
#include <string.h>
#include <mdiwin/average.hpp>
#include <mdiwin/main.hpp>
Average::Average(char *imageName,HPALETTE hPalette,UHUGE *hpImage,WORD width,WORD height,WORD *isThreaded)
: mhPalette(hPalette), mhpImage(hpImage), mWidth(width), mHeight(height),
mIsThreaded(isThreaded), mDivisor(0)
{
::strcpy(mImageName,imageName);
}
Average::~Average()
{
}
void Average::processImage(Block<Integer> &averagingMatrix,Criterion criterion)
{
int size;
size=(int)averagingMatrix.size();
if(size!=MatrixDimension*3)return;
mAvMatrix[0][0]=averagingMatrix[0];
mAvMatrix[0][1]=averagingMatrix[1];
mAvMatrix[0][2]=averagingMatrix[2];
mAvMatrix[1][0]=averagingMatrix[3];
mAvMatrix[1][1]=averagingMatrix[4];
mAvMatrix[1][2]=averagingMatrix[5];
mAvMatrix[2][0]=averagingMatrix[6];
mAvMatrix[2][1]=averagingMatrix[7];
mAvMatrix[2][2]=averagingMatrix[8];
for(int i=0;i<size;i++)mDivisor+=averagingMatrix[i];
if(mDivisor<=0)mDivisor=1;
getPaletteEntries();
if(Normalization==criterion)performAverage();
else performAverageRangeClipping();
}
void Average::performAverage(void)
{
MSG msg;
int currImageRow;
int currImageCol;
char statusMsg[100];
for(currImageRow=1;currImageRow<mHeight-1;currImageRow++)
{
if(!(currImageRow%10)||1==currImageRow)
{
::wsprintf((LPSTR)statusMsg,(LPSTR)"Processing %s, Row %d",mImageName,mHeight-currImageRow);
Main::smlpStatusBar->setText((LPSTR)statusMsg);
}
if(::PeekMessage(&msg,0,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if(!(*mIsThreaded))break;
for(currImageCol=1;currImageCol<mWidth-1;currImageCol++)
{
*(mhpImage+(((long)currImageRow*mWidth)+(long)currImageCol))=
averageImageIndex((((long)currImageRow*mWidth)+(long)currImageCol));
if(::PeekMessage(&msg,0,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if(!(*mIsThreaded))break;
}
}
Main::smlpStatusBar->setText("");
}
BYTE NEAR Average::averageImageIndex(LONG imageIndex)
{
BYTE paletteIndex;
int tempRed,tempGreen,tempBlue;
int col,row;
LONG currentIndex;
tempRed=tempGreen=tempBlue=0;
for(col=-1;col<MatrixDimension-1;col++)
{
for(row=-1;row<MatrixDimension-1;row++)
{
currentIndex=(DWORD)(imageIndex+(long)col+((long)row*mWidth));
paletteIndex=(BYTE)*(mhpImage+currentIndex);
tempRed+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peRed;
tempGreen+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peGreen;
tempBlue+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peBlue;
}
}
return ::GetNearestPaletteIndex(mhPalette,RGB((BYTE)(tempRed/mDivisor),(BYTE)(tempGreen/mDivisor),(BYTE)(tempBlue/mDivisor)));
}
void Average::performAverageRangeClipping(void)
{
MSG msg;
int currImageRow;
int currImageCol;
char statusMsg[100];
for(currImageRow=1;currImageRow<mHeight-1;currImageRow++)
{
if(!(currImageRow%10)||1==currImageRow)
{
::wsprintf((LPSTR)statusMsg,(LPSTR)"Processing %s, Row %d",mImageName,mHeight-currImageRow);
Main::smlpStatusBar->setText((LPSTR)statusMsg);
}
if(::PeekMessage(&msg,0,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if(!(*mIsThreaded))break;
for(currImageCol=1;currImageCol<mWidth-1;currImageCol++)
{
*(mhpImage+(((long)currImageRow*mWidth)+(long)currImageCol))=
averageImageIndexRangeClipping((((long)currImageRow*mWidth)+(long)currImageCol));
if(::PeekMessage(&msg,0,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
if(!(*mIsThreaded))break;
}
}
Main::smlpStatusBar->setText("");
}
BYTE NEAR Average::averageImageIndexRangeClipping(LONG imageIndex)
{
BYTE paletteIndex;
int tempRed,tempGreen,tempBlue;
int col,row;
LONG currentIndex;
tempRed=tempGreen=tempBlue=0;
for(col=-1;col<MatrixDimension-1;col++)
{
for(row=-1;row<MatrixDimension-1;row++)
{
currentIndex=(DWORD)(imageIndex+(long)col+((long)row*mWidth));
paletteIndex=(BYTE)*(mhpImage+currentIndex);
tempRed+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peRed;
tempGreen+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peGreen;
tempBlue+=mAvMatrix[col+1][row+1]*mPaletteData[paletteIndex].peBlue;
}
}
if(tempRed<0)tempRed=0;
else if(tempRed>255)tempRed=255;
if(tempGreen<0)tempGreen=0;
else if(tempGreen>255)tempGreen=255;
if(tempBlue<0)tempBlue=0;
else if(tempBlue>255)tempBlue=255;
return ::GetNearestPaletteIndex(mhPalette,RGB((BYTE)(tempRed/mDivisor),(BYTE)(tempGreen/mDivisor),(BYTE)(tempBlue/mDivisor)));
}