home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1992 November
/
CICA_MS_Windows_CD-ROM_Walnut_Creek_November_1992.iso
/
win3
/
desktop
/
profft
/
pictwin.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-29
|
7KB
|
228 lines
/****************************************************************************
PICTWIN.CPP Denne filen inneholder (i denne rekkef°lgen):
*****************************************************************************
void TPictureWindow::GetWindowClass(WNDCLASS& wc)
LPSTR TPictureWindow::GetClassName()
void TPictureWindow::PerformFFT()
void TPictureWindow::Invert()
BOOL PowerOf2(long l)
void TPictureWindow::WMMDIActivate(RTMessage Msg)
void TPictureWindow::SetMenuItems(WORD wStatus)
****************************************************************************/
#include <owl.h>
#include <filedial.h>
#include <dir.h>
#include <string.h>
#include <math.h>
#pragma hdrstop
#include "profftid.h" // Symbolske konstanter
#include "profft.h" // Klassedefinisjoner
void TPictureWindow::GetWindowClass(WNDCLASS& wc)
/****************************************************************************
Henter vindusklassen og standardikon for vinduet.
Kodet av: MK 28.04.92
*****************************************************************************/
{
TGenericPicWindow::GetWindowClass(wc);
wc.hIcon = LoadIcon(wc.hInstance, "BMP");
}
LPSTR TPictureWindow::GetClassName()
/****************************************************************************
Returnerer vindusklassen.
Kodet av: MK 28.04.92
*****************************************************************************/
{
return "PROfft:PictureWindow";
}
void TPictureWindow::PerformFFT()
/****************************************************************************
Denne rutinen klargj°r for FFT. Den starter med σ opprette et TComplexWindow
objekt. Dette objektet fσr samme bildekarakteristikk som seg selv.
Hvis det fσr opprettet det nye objektet, gir det objektet beskjed om σ
regne ut fouriertransformen til seg selv.
Kodet av: MK 01.04.92
Modifisert: MK 04.04.92 Div. vedlikehold, nye funksjoner for σ lette
arbeidet med σ kopiere dataene.
*****************************************************************************/
{
WORD wSize;
HANDLE hComplex;
HANDLE hNewBitmap;
BITMAPINFO *bmpNewInfo;
HCURSOR hcrOld;
TComplexWindow *ComplexWindow;
int iY, iMaxY, n;
BOOL bFailed;
bFailed = FALSE;
GlobalCompact(-1); // Rydd opp i minnet f°r vi fors°ker σ opprette
// nye minneblokker til det nye objektet.
// Allokerer minne til det komplekse bildet (som da blir mange ganger
// st°rre enn det orginale bildet pσ grunn av det komplekse flyttallet
// som ligger i hvert enkelt punkt). MS_BUG taes med pσ grunn av
// MicroSoft Windows sin bug nσr man allokerer blokker som gσr
// n°yaktig opp i 64 K.
hComplex = GlobalAlloc(GMEM_PROFFTDATA,
bmpInfo->bmiHeader.biWidth*bmpInfo->bmiHeader.biHeight
*sizeof(prcomplex)+MS_BUG);
if (hComplex!=NULL) // Hvis det var plass i minnet
{
hcrOld = SetCursor(((TMainWindow *)Parent)->hcrWait);
// Opprett en kopi av bildestrukturdataene.
bmpNewInfo = MakeDuplicateBMPInfo(bmpInfo);
if (bmpNewInfo!=NULL)
{
// Alloker minne til et ekstra bitmap bilde
hNewBitmap = GlobalAlloc(GMEM_PROFFTDATA,
bmpNewInfo->bmiHeader.biSizeImage+MS_BUG);
if (hNewBitmap!=NULL)
{
// Kopierer fra den gamle bitmappen til den nye.
// Egentlig un°dvendig siden FFT representasjonen viser seg
// oppσ dette etterpσ, men det kan vµre greit σ se hvilket
// bilde det jobbes med.
CopyBMP(hBitmap, hNewBitmap);
// Opprett det nye TComplexWindow objektet.
((TComplexWindow *)(((TMainWindow *)Parent)->CreateComplexChild(FileName, hComplex,
bmpNewInfo, hNewBitmap)))->PerformFFT();
}
else
{
MessageBox(HWindow, "PerformFFT: Out of memory",
ERROR_CAPTION, MB_ERROR);
bFailed = TRUE;
}
}
else
{
MessageBox(HWindow, "TPictureWindow::PerformFFT bmpNewInfo==NULL",
ERROR_CAPTION, MB_ERROR);
bFailed = TRUE;
}
}
else
{
MessageBox(HWindow, "PerformFFT: Out of memory",
ERROR_CAPTION, MB_ERROR);
bFailed = TRUE;
}
if (bFailed)
GlobalFree(hComplex);
SetCursor(hcrOld);
}
void TPictureWindow::Invert()
/****************************************************************************
Inverterer det aktuelle bildet. Ble brukt ved testing av rutinene for
σ manipulere med verdiene i et bilde. Ble ikke fjernet da det kunne vµre
greit σ ha..
Kodet av: MK
*****************************************************************************/
{
int i, iX, iY, iW, iH, iMaxX, iNumColours, iMaxY;
BYTE bPixel;
if (LockBMP())
{
iW = (int)bmpInfo->bmiHeader.biWidth;
iMaxX = iW - 1;
iH = (int)bmpInfo->bmiHeader.biHeight;
iMaxY = iH - 1;
for (iY=0;iY<=iMaxY;iY++)
{
for (iX=0;iX<=iMaxX;iX++)
{
bPixel = GetBMPPixel(hBitmap, iX, iY, iW, iH);
SetBMPPixel(hBitmap, iX, iY, iW, iH, (BYTE) (255 - bPixel));
}
}
UnlockBMP();
InvalidateRect(HWindow, NULL, FALSE);
}
else
MessageBox(HWindow, "TPictureWindow::Invert LockBMP() returned FALSE",
ERROR_CAPTION, MB_ERROR);
}
BOOL PowerOf2(long l)
/****************************************************************************
Sjekker om et tall er en toerpotens. Denne brukes for σ sjekke om
brukeren har lastet inn et bilde som kan transformeres med FFT algoritmen.
Returnerer: TRUE hvis toerpotens
FALSE ellers.
Kodet av: MK
*****************************************************************************/
{
int i;
long lTemp;
// Gσr gjennom bit for bit. Hvis flere en ett bit er satt er ikke
// tallet en ren toerpotens.
for (i=0;i<=15;i++)
{
lTemp = l & 1;
l = l>>1;
if ((lTemp!=0) && (l>0))
return FALSE;
}
return TRUE;
}
void TPictureWindow::WMMDIActivate(RTMessage Msg)
/****************************************************************************
Denne kalles nσr bildet aktiveres. S°rger for σ sette de menyvalgene
som er aktuelle for dette bildet (dvs. disabler IFFT, filtre o.l.).
RTMessage Msg Sendes videre til superklassen.
Kodet av: MK
*****************************************************************************/
{
TGenericPicWindow::WMMDIActivate(Msg);
if (Msg.WParam)
SetMenuItems(MF_ENABLED); // Hvis bildet aktiveres, muligj°r valg
else
SetMenuItems(MF_GRAYED); // Hvis ikke, umuliggj°r valgene
}
void TPictureWindow::SetMenuItems(WORD wStatus)
/****************************************************************************
Setter de aktuelle valgene for dette objektet.
WORD wStatus Inneholder hva valgene skal settes til (MF_ENABLED/MF_GRAYED)
Kodet av: MK
*****************************************************************************/
{
HMENU hMenu;
int i;
// Hent en handle til menyen i hovedvinduet.
hMenu=GetMenu(((TMainWindow *)Parent)->HWindow);
// Hvis bildet er kvadratisk og en toerpotens, sett FFT valget.
if (PowerOf2(bmpInfo->bmiHeader.biWidth))
if (bmpInfo->bmiHeader.biWidth==bmpInfo->bmiHeader.biHeight)
EnableMenuItem(hMenu, CM_TRANSFFT, wStatus);
EnableMenuItem(hMenu, CM_TRANSINVERT, wStatus);
EnableMenuItem(hMenu, CM_EDITCOPY, wStatus);
EnableMenuItem(hMenu, CM_EDITCUT, wStatus);
EnableMenuItem(hMenu, CM_FILESAVEAS, wStatus);
}