www.pudn.com > Tierazon-v29.zip > Convolut.cpp


// Convolut.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Tierazon.h" 
#include "Convolut.h" 
#include "Tierazondoc.h" 
#include "TierazonView.h" 
#include "external.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CConvolut dialog 
 
 
CConvolut::CConvolut(CWnd* pParent /*=NULL*/) 
	: CDialog(CConvolut::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CConvolut) 
	m_CK0 = 1.5; 
	m_CK1 = 1; 
	m_CK2 = 1; 
	m_CK3 = 1; 
	m_CK4 = 1; 
	m_CK5 = 1; 
	m_CK6 = 1; 
	m_CK7 = 1; 
	m_CK8 = 1; 
	m_Title = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
// Modeless Constructor 
CConvolut::CConvolut(CView* pConvolutView) 
	: CDialog() 
{ 
	m_pConvolutView	= pConvolutView; 
	bConvoluteContinuous = FALSE; 
	m_CK0 = 1.5; 
	m_CK1 = 1; 
	m_CK2 = 1; 
	m_CK3 = 1; 
	m_CK4 = 1; 
	m_CK5 = 1; 
	m_CK6 = 1; 
	m_CK7 = 1; 
	m_CK8 = 1; 
	m_Title = _T(""); 
} 
 
void CConvolut::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CConvolut) 
	DDX_Control(pDX, IDC_STOP, m_Stop); 
	DDX_Control(pDX, IDC_AUTO, m_Auto); 
	DDX_Text(pDX, IDC_CK0, m_CK0); 
	DDX_Text(pDX, IDC_CK1, m_CK1); 
	DDX_Text(pDX, IDC_CK2, m_CK2); 
	DDX_Text(pDX, IDC_CK3, m_CK3); 
	DDX_Text(pDX, IDC_CK4, m_CK4); 
	DDX_Text(pDX, IDC_CK5, m_CK5); 
	DDX_Text(pDX, IDC_CK6, m_CK6); 
	DDX_Text(pDX, IDC_CK7, m_CK7); 
	DDX_Text(pDX, IDC_CK8, m_CK8); 
	DDX_Text(pDX, IDC_TITLE, m_Title); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CConvolut, CDialog) 
	//{{AFX_MSG_MAP(CConvolut) 
	ON_WM_CLOSE() 
	ON_BN_CLICKED(IDC_AUTO, OnAuto) 
	ON_BN_CLICKED(IDC_APPLY, OnApply) 
	ON_BN_CLICKED(IDC_UNDO, OnUndo) 
	ON_BN_CLICKED(IDC_STOP, OnStop) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CConvolut message handlers 
 
void CConvolut::OnApply()  
{ 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILTER_CONVOLUTION_APPLY); 
	//m_pConvolutView->PostMessage(WM_USER_CONVOLUTE, NULL); 
} 
 
void CConvolut::OnUndo()  
{ 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILTER_CONVOLUTION_UNDO); 
	//m_pConvolutView->PostMessage(WM_USER_UNDOCONVOLUTE, NULL); 
} 
 
void CConvolut::OnClose()  
{ 
	CDialog::OnClose(); 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_CONVOLUTION_DIALOG); 
	//m_pConvolutView->PostMessage(WM_USER_ABORTCONVOLUTE, NULL); 
	 
} 
 
BOOL CConvolut::Create() 
{ 
	return CDialog::Create(CConvolut::IDD); 
} 
 
void CConvolut::OnAuto()  
{ 
	m_Auto.SetState(TRUE); 
	m_Stop.SetState(FALSE); 
	bConvoluteContinuous = TRUE; 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILTER_CONVOLUTION_AUTO); 
	//m_pConvolutView->PostMessage(WM_USER_CONVOLUTE, NULL); 
	//m_pConvolutView->PostMessage(WM_USER_CONVOLUTECONTINUOUS, NULL); 
	//UpdateData(TRUE); 
} 
 
void CConvolut::OnStop()  
{ 
	m_Auto.SetState(FALSE); 
	m_Stop.SetState(TRUE); 
	bConvoluteContinuous = FALSE; 
	AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILTER_CONVOLUTION_STOP); 
	//m_pConvolutView->PostMessage(WM_USER_ABORTCONVOLUTE, NULL); 
	UpdateData(); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// Itiera Message handlers 
 
void CTierazonView::OnConvolutionTracecontour()  
{ 
	bEdgeDetect = FALSE; 
	bEmboss     = FALSE; 
	bSharpen    = FALSE; 
	bBlur				= FALSE; 
	bAverage    = FALSE; 
 
	bTraceContour ^= TRUE; 
	OnFilterConvolutionApply(); 
} 
 
void CTierazonView::OnUpdateConvolutionTracecontour(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bTraceContour);	 
} 
 
void CTierazonView::OnFilterConvolutionApply()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	nMatrix = 1; 
 
	if (m_pConvolutView->GetSafeHwnd() != 0) 
		m_pConvolutView->UpdateData(); 
 
	pDoc->m_dib.CK[0] = m_pConvolutView->m_CK0; 
	pDoc->m_dib.CK[1] = m_pConvolutView->m_CK1; 
	pDoc->m_dib.CK[2] = m_pConvolutView->m_CK2; 
	pDoc->m_dib.CK[3] = m_pConvolutView->m_CK3; 
	pDoc->m_dib.CK[4] = m_pConvolutView->m_CK4; 
	pDoc->m_dib.CK[5] = m_pConvolutView->m_CK5; 
	pDoc->m_dib.CK[6] = m_pConvolutView->m_CK6; 
	pDoc->m_dib.CK[7] = m_pConvolutView->m_CK7; 
	pDoc->m_dib.CK[8] = m_pConvolutView->m_CK8; 
 
	if (!pDoc->m_dib.CreateDIB_Temp((DWORD) dim.cx, (DWORD) dim.cy))	// Create a bitmap 
	{ 
		AfxMessageBox("Error Creating DIB_Temp"); 
		return; 
	} 
 
	bDraw = TRUE; 
	bLaunch = FALSE; 
} 
 
void CTierazonView::OnFilterConvolutionUndo()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	// Copy temporary bitmap 
	// AfxMessageBox("Undo"); 
	BeginWaitCursor(); 
	if (!pDoc->m_dib.CopyTemp()) 
	{ 
		AfxMessageBox("Error Copying Temporary Bitmap"); 
	} 
	EndWaitCursor(); 
	m_pConvolutView->bConvoluteContinuous = FALSE; 
	m_pConvolutView->m_Auto.SetState(FALSE); 
	Invalidate(FALSE); 
	//m_pConvolutView->UpdateData(TRUE); 
} 
 
void CTierazonView::OnFilterConvolutionAuto()  
{ 
	m_pConvolutView->bConvoluteContinuous = TRUE; 
	OnFilterConvolutionApply();  
} 
 
void CTierazonView::OnUpdateFilterConvolutionAuto(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_pConvolutView->bConvoluteContinuous); 
} 
 
void CTierazonView::OnFilterConvolutionStop()  
{ 
	m_pConvolutView->bConvoluteContinuous = FALSE; 
} 
 
void CTierazonView::OnUpdateFilterConvolutionStop(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_pConvolutView->bConvoluteContinuous); 
} 
 
void CTierazonView::OnConvolutionDialog()  
{ 
	//if (nMatrix == 0) 
		//nMatrix = 99; 
 
	Convo_Title = "Custom"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateConvolutionDialog(CCmdUI* pCmdUI)  
{ 
	if (nMatrix) 
		pCmdUI->SetCheck(TRUE); 
	else 
		pCmdUI->SetCheck(FALSE); 
} 
 
void CTierazonView::ConvolutionDialog() 
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	if (m_pConvolutView->GetSafeHwnd() == 0) 
	{ 
		// Create the Convolution Dialog 
		m_pConvolutView->Create(); 
			 
		m_pConvolutView->m_CK0 = pDoc->m_dib.CK[0]; 
		m_pConvolutView->m_CK1 = pDoc->m_dib.CK[1]; 
		m_pConvolutView->m_CK2 = pDoc->m_dib.CK[2]; 
		m_pConvolutView->m_CK3 = pDoc->m_dib.CK[3]; 
		m_pConvolutView->m_CK4 = pDoc->m_dib.CK[4]; 
		m_pConvolutView->m_CK5 = pDoc->m_dib.CK[5]; 
		m_pConvolutView->m_CK6 = pDoc->m_dib.CK[6]; 
		m_pConvolutView->m_CK7 = pDoc->m_dib.CK[7]; 
		m_pConvolutView->m_CK8 = pDoc->m_dib.CK[8]; 
 
		m_pConvolutView->m_Title = Convo_Title; 
 
		m_pConvolutView->m_Stop.SetState(FALSE); 
		m_pConvolutView->UpdateData(FALSE); 
		m_pConvolutView->ShowWindow(SW_SHOW); 
 
	} 
	else 
	{ 
		// Destroy the Convolution dlg		 
		//bAbort = TRUE; 
		m_pConvolutView->bConvoluteContinuous = FALSE; 
		m_pConvolutView->DestroyWindow(); 
 
		bEdgeDetect = FALSE; 
		bEmboss     = FALSE; 
		bSharpen    = FALSE; 
		bBlur				= FALSE; 
		bAverage    = FALSE; 
		bTraceContour = FALSE; 
 
		if (!bDraw) 
			nMatrix = 0; 
	} 
} 
 
void CTierazonView::OnImageEdgedetection()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	//nMatrix = 1; 
	bEdgeDetect = TRUE; 
 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Edge Detection Kernel 
 	///////////////////////////// 
	//  0 -1  0 
	// -1	 4 -1 
	//  0	-1	0 
	///////////////////////////// 
	 
	// Initialize Convolution Kernel for Edge Detection 
	pDoc->m_dib.CK[0] = 4; 
	pDoc->m_dib.CK[1] = 0;	 
	pDoc->m_dib.CK[2] = -1;	 
	pDoc->m_dib.CK[3] = 0;	 
	pDoc->m_dib.CK[4] = -1; 
	pDoc->m_dib.CK[5] = -1; 
	pDoc->m_dib.CK[6] = 0; 
	pDoc->m_dib.CK[7] = -1; 
	pDoc->m_dib.CK[8] = 0; 
 
	Convo_Title = "Edge Detection"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateImageEdgedetection(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bEdgeDetect); 
} 
 
void CTierazonView::OnImageSharpen()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	//nMatrix = 2; 
	bSharpen = TRUE; 
 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Sharpen Kernel 
 	///////////////////////////// 
	//  0 -1  0 
	// -1	 5 -1 
	//  0	-1	0 
	///////////////////////////// 
	 
	// Initialize Convolution Kernel for the Sharpen Kernel 
	pDoc->m_dib.CK[0] = 5; 
	pDoc->m_dib.CK[1] = 0;	 
	pDoc->m_dib.CK[2] = -1;	 
	pDoc->m_dib.CK[3] = 0;	 
	pDoc->m_dib.CK[4] = -1; 
	pDoc->m_dib.CK[5] = -1; 
	pDoc->m_dib.CK[6] = 0; 
	pDoc->m_dib.CK[7] = -1; 
	pDoc->m_dib.CK[8] = 0; 
 
	Convo_Title = "Sharpen"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateImageSharpen(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bSharpen); 
} 
 
void CTierazonView::OnImageEmboss()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	//nMatrix = 3; 
	bEmboss = TRUE; 
 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Emboss Kernel 
 	///////////////////////////// 
	// -1  0  0 
	//  0	 0  0 
	//  0	 0	1 
	///////////////////////////// 
	 
	// Initialize Convolution Kernel for the Emboss Kernel 
	pDoc->m_dib.CK[0] = 1; 
	pDoc->m_dib.CK[1] = -1;	 
	pDoc->m_dib.CK[2] = 0;	 
	pDoc->m_dib.CK[3] = 0;	 
	pDoc->m_dib.CK[4] = 0; 
	pDoc->m_dib.CK[5] = 0; 
	pDoc->m_dib.CK[6] = 0; 
	pDoc->m_dib.CK[7] = 0; 
	pDoc->m_dib.CK[8] = 1; 
 
	Convo_Title = "Emboss"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateImageEmboss(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bEmboss); 
} 
 
void CTierazonView::OnImageBlur()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	//nMatrix = 4; 
	bBlur = TRUE; 
	 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Blur Kernal 
 	///////////////////////////// 
	//  0.05  0.15  0.05 
	//  0.15	0.20  0.15 
	//  0.05	0.15	0.05 
	///////////////////////////// 
	 
	// Initialize Convolution for the Blur Kernel 
	pDoc->m_dib.CK[0] = 0.20; 
	pDoc->m_dib.CK[1] = 0.05;	 
	pDoc->m_dib.CK[2] = 0.15;	 
	pDoc->m_dib.CK[3] = 0.05;	 
	pDoc->m_dib.CK[4] = 0.15; 
	pDoc->m_dib.CK[5] = 0.15; 
	pDoc->m_dib.CK[6] = 0.05; 
	pDoc->m_dib.CK[7] = 0.15; 
	pDoc->m_dib.CK[8] = 0.05; 
 
	Convo_Title = "Blur"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateImageBlur(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bBlur); 
} 
 
void CTierazonView::OnImageAverage()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	//nMatrix = 5; 
	bAverage = TRUE; 
	 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Average Kernal 
 	///////////////////////////// 
	//  1  1  1 
	//  1  1  1 
	//  1  1  1 
	///////////////////////////// 
	 
	// Initialize Convolution for the Average Kernel 
	pDoc->m_dib.CK[0] = .111;   // 1.5 
	pDoc->m_dib.CK[1] = .111;	 
	pDoc->m_dib.CK[2] = .111;	 
	pDoc->m_dib.CK[3] = .111;	 
	pDoc->m_dib.CK[4] = .111; 
	pDoc->m_dib.CK[5] = .111; 
	pDoc->m_dib.CK[6] = .111; 
	pDoc->m_dib.CK[7] = .111; 
	pDoc->m_dib.CK[8] = .111; 
 
	Convo_Title = "Average"; 
	ConvolutionDialog(); 
} 
 
void CTierazonView::OnUpdateImageAverage(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bAverage); 
} 
 
void CTierazonView::OnConvolveAntialias()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	// Anti-alias the image by bluring (low-pass filter),  
	// then reducing the image to one-falf its size 
 
	//nMatrix = 4; 
 
	bEdgeDetect = FALSE; 
	bEmboss     = FALSE; 
	bSharpen    = FALSE; 
	bAverage    = FALSE; 
	bTraceContour = FALSE; 
	 
	bBlur = TRUE; 
	 
	///////////////////////////// 
	// 3x3 Pixel numbering scheme 
	// Blur Kernal 
 	///////////////////////////// 
	//  0.05  0.15  0.05 
	//  0.15	0.20  0.15 
	//  0.05	0.15	0.05 
	///////////////////////////// 
	 
	// Initialize Convolution for the Blur Kernel 
	pDoc->m_dib.CK[0] = 0.20; 
	pDoc->m_dib.CK[1] = 0.05;	 
	pDoc->m_dib.CK[2] = 0.15;	 
	pDoc->m_dib.CK[3] = 0.05;	 
	pDoc->m_dib.CK[4] = 0.15; 
	pDoc->m_dib.CK[5] = 0.15; 
	pDoc->m_dib.CK[6] = 0.05; 
	pDoc->m_dib.CK[7] = 0.15; 
	pDoc->m_dib.CK[8] = 0.05; 
 
	if (!pDoc->m_dib.CreateDIB_Temp((DWORD) dim.cx, (DWORD) dim.cy))	// Create a bitmap 
	{ 
		AfxMessageBox("Error Creating DIB_Temp"); 
		return; 
	} 
 
	nMatrix = 1; 
	 
	bDraw = TRUE; 
	bLaunch = FALSE; 
 
	bGlobalDraw = TRUE; 
	 
	bReduceSize = TRUE; 
} 
 
void CTierazonView::OnConvolveReduce()  
{ 
	CTierazonDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	// First lets create a temp buffer that is one half the size 
	if (!pDoc->m_dib.CreateDIB_Temp((DWORD) dim.cx, (DWORD) dim.cy))	// Create a bitmap 
	{ 
		AfxMessageBox("Error Creating DIB_Temp"); 
		return; 
	} 
 
	// Second lets transfer every other pixel to the temp buffer 
	if (!pDoc->m_dib.ReduceDIBSize()) 
	{ 
		AfxMessageBox("Error reducing DIB size"); 
		return; 
	} 
 
	// New lets create a new bitmap that is one-half the size 
	if (!pDoc->m_dib.CreateDIB((DWORD) dim.cx/2, (DWORD) dim.cy/2))	// Create a bitmap 
	{ 
		AfxMessageBox("Error Creating DIB_Temp"); 
		return; 
	} 
 
	// Copy temporary bitmap 
	BeginWaitCursor(); 
	if (!pDoc->m_dib.CopyTemp()) 
	{ 
		AfxMessageBox("Error Copying Temporary Bitmap"); 
	} 
	EndWaitCursor(); 
 
	dim.cx = dim.cx/2; 
	dim.cy = dim.cy/2; 
 
	global_width = dim.cx; 
	global_height = dim.cy; 
 
	pDoc->m_sizeDoc	= dim; 
 
	bReduceSize = FALSE; 
  //OnWindowSizedesktop(); 
} 
 
void CTierazonView::OnConvolveAutoAntialias()  
{ 
	bAutoAntialias ^= 1; 
	if (bAutoAntialias) 
		nUsingBuffers = 0; 
	else 
		nUsingBuffers = 1; 
} 
 
void CTierazonView::OnUpdateConvolveAutoAntialias(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(bAutoAntialias);	 
}