158 lines
4.4 KiB
C++
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)));
|
|
}
|