338 lines
7.1 KiB
C++
338 lines
7.1 KiB
C++
// ImportDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "dibmanager.h"
|
|
#include "MainFrm.h"
|
|
#include "ImportDlg.h"
|
|
|
|
#include "oxbmpfle.h"
|
|
#include "oxjpgfle.h"
|
|
#include "oxjpgcom.h"
|
|
#include "oxjpgdom.h"
|
|
#include "oxjpgexp.h"
|
|
|
|
#include "path.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CImportDlg dialog
|
|
|
|
|
|
CImportDlg::CImportDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CImportDlg::IDD, pParent),
|
|
m_cbFileName(COXHistoryCombo::TBPHorizontalRightCenter,TRUE)
|
|
{
|
|
//{{AFX_DATA_INIT(CImportDlg)
|
|
m_bColors = FALSE;
|
|
m_bGrayscale = FALSE;
|
|
m_bNoSmooth = FALSE;
|
|
m_bOnePass = FALSE;
|
|
m_sFileName = _T("");
|
|
m_nColors = 0;
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CImportDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CImportDlg)
|
|
DDX_Control(pDX, IDC_COLORS, m_ctlEditColors);
|
|
DDX_Control(pDX, IDC_SPIN_COLORS, m_ctlSpinColors);
|
|
DDX_Control(pDX, IDC_FILENAME, m_cbFileName);
|
|
DDX_Check(pDX, IDC_CHECK_COLORS, m_bColors);
|
|
DDX_Check(pDX, IDC_CHECK_GRAYSCALE, m_bGrayscale);
|
|
DDX_Check(pDX, IDC_CHECK_NO_SMOOTH, m_bNoSmooth);
|
|
DDX_Check(pDX, IDC_CHECK_ONE_PASS, m_bOnePass);
|
|
DDX_Text(pDX, IDC_FILENAME, m_sFileName);
|
|
DDX_Text(pDX, IDC_COLORS, m_nColors);
|
|
DDV_MinMaxInt(pDX, m_nColors, 8, 256);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CImportDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CImportDlg)
|
|
ON_BN_CLICKED(IDC_CHECK_ONE_PASS, OnCheckOnePass)
|
|
ON_BN_CLICKED(IDC_CHECK_COLORS, OnCheckColors)
|
|
ON_BN_CLICKED(IDC_CHECK_GRAYSCALE, OnCheckGrayscale)
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CImportDlg message handlers
|
|
|
|
BOOL CImportDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
m_nColors = 256;
|
|
CheckRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE,
|
|
IDC_RADIO_DM_FLOYD_STEIN);
|
|
CheckRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT,
|
|
IDC_RADIO_ONE_TO_ONE);
|
|
CheckRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT,
|
|
IDC_RADIO_ONE_TO_ONE);
|
|
CheckRadioButton(IDC_RADIO_DCT_INT,IDC_RADIO_DCT_FLOAT,
|
|
IDC_RADIO_DCT_INT);
|
|
|
|
// Set the COXSpinCtrl object, which is mapped to a common Spin Control.
|
|
m_ctlSpinColors.SetBuddy(&m_ctlEditColors);
|
|
m_ctlSpinColors.SetRange(8,256);
|
|
m_ctlSpinColors.SetPos(m_nColors);
|
|
|
|
// Set a default COXSpinCtrl method of delta value computation
|
|
// (Delta pixel = Delta value).
|
|
m_ctlSpinColors.SetComputationMethod(OX_SPIN_DELTA_PIXEL_IS_DELTA_VALUE);
|
|
|
|
// Use auto persistence
|
|
m_cbFileName.SetAutoPersistent(_T("History - Import"));
|
|
m_cbFileName.SetFileDialogParams(TRUE,_T("*.jpg"),NULL,
|
|
OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,
|
|
_T("JPEG Images (*.jpg)|*.jpg|All Files (*.*)|*.*||"));
|
|
// set toolbar on the right with a little gap
|
|
COXHistoryCombo::EToolbarPosition eToolbarPosition=m_cbFileName.GetToolbarPosition();
|
|
// unimited number of items in combobox are could be saved
|
|
m_cbFileName.PositionToolbar(eToolbarPosition, TRUE);
|
|
m_cbFileName.SetMaxHistoryCount(-1);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
ShowButtons();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CImportDlg::OnOK()
|
|
{
|
|
// TODO: Add extra validation here
|
|
|
|
if(UpdateData()==0 || !CheckFileName())
|
|
return;
|
|
|
|
// operation of exporting JPEG to DIB
|
|
// could be time-consuming
|
|
BeginWaitCursor();
|
|
|
|
COXBMPFile BMPFile(&m_tmpBMPFile);
|
|
COXJPEGFile jpgFile(m_sFileName);
|
|
COXJPEGDecompressor JDecompr;
|
|
|
|
JDecompr.SetGrayScale(m_bGrayscale);
|
|
JDecompr.SetNoSmooth(m_bNoSmooth);
|
|
JDecompr.SetOnePass(m_bOnePass);
|
|
|
|
EDiscreteCosTransf DCT;
|
|
switch(GetCheckedRadioButton(IDC_RADIO_DCT_INT,
|
|
IDC_RADIO_DCT_FLOAT))
|
|
{
|
|
case IDC_RADIO_DCT_INT:
|
|
{
|
|
DCT=DC_Int;
|
|
break;
|
|
}
|
|
case IDC_RADIO_DCT_FAST:
|
|
{
|
|
DCT=DC_FastInt;
|
|
break;
|
|
}
|
|
case IDC_RADIO_DCT_FLOAT:
|
|
{
|
|
DCT=DC_Float;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DCT=DC_Int;
|
|
break;
|
|
}
|
|
}
|
|
JDecompr.SetDisCosTranf(DCT);
|
|
|
|
EDitherMethod DM;
|
|
switch(GetCheckedRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE))
|
|
{
|
|
case IDC_RADIO_DM_FLOYD_STEIN:
|
|
{
|
|
DM=DM_FloydStein;
|
|
break;
|
|
}
|
|
case IDC_RADIO_DM_ORDERED:
|
|
{
|
|
DM=DM_Ordered;
|
|
break;
|
|
}
|
|
case IDC_RADIO_DM_NONE:
|
|
{
|
|
DM=DM_None;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DM=DM_FloydStein;
|
|
break;
|
|
}
|
|
}
|
|
JDecompr.SetDitherMethod(DM);
|
|
|
|
EDecompScale DS;
|
|
switch(GetCheckedRadioButton(IDC_RADIO_ONE_TO_ONE,IDC_RADIO_ONE_TO_EIGHT))
|
|
{
|
|
case IDC_RADIO_ONE_TO_ONE:
|
|
{
|
|
DS=DS_OneOne;
|
|
break;
|
|
}
|
|
case IDC_RADIO_ONE_TO_TWO:
|
|
{
|
|
DS=DS_OneHalf;
|
|
break;
|
|
}
|
|
case IDC_RADIO_ONE_TO_FOUR:
|
|
{
|
|
DS=DS_OneFourth;
|
|
break;
|
|
}
|
|
case IDC_RADIO_ONE_TO_EIGHT:
|
|
{
|
|
DS=DS_OneEight;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DS=DS_OneOne;
|
|
break;
|
|
}
|
|
}
|
|
JDecompr.SetScale(DS);
|
|
|
|
if(m_bColors)
|
|
{
|
|
JDecompr.SetColors(m_nColors);
|
|
}
|
|
|
|
short nReturn(1);
|
|
TCHAR ErrorBuffer[SIZE_ERROR_BUF];
|
|
TRY
|
|
{
|
|
// the only line of code that we need to decompress JPEG to bitmap file
|
|
nReturn = JDecompr.DoDecompress(&jpgFile, &BMPFile);
|
|
if (nReturn == 2)
|
|
AfxMessageBox(JDecompr.GetWarningMessages());
|
|
}
|
|
CATCH(COXJPEGException, e)
|
|
{
|
|
// if something went wrong then notify about it
|
|
e->GetErrorMessage(ErrorBuffer, SIZE_ERROR_BUF);
|
|
AfxMessageBox(CString("Exception : ") + ErrorBuffer);
|
|
TRACE((LPCTSTR)ErrorBuffer);
|
|
}
|
|
END_CATCH
|
|
|
|
EndWaitCursor();
|
|
|
|
if(nReturn!=0)
|
|
return;
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CImportDlg::OnCheckOnePass()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
ShowButtons();
|
|
}
|
|
|
|
void CImportDlg::OnCheckColors()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
ShowButtons();
|
|
}
|
|
|
|
void CImportDlg::OnCheckGrayscale()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
ShowButtons();
|
|
}
|
|
|
|
LRESULT CImportDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// we use this function to let buttons in HistoryCombo toolbar
|
|
// to get some notification
|
|
UNUSED(wParam);
|
|
UNUSED_ALWAYS(lParam);
|
|
|
|
ASSERT_VALID(this);
|
|
ASSERT(wParam == MSGF_DIALOGBOX);
|
|
BOOL bContinueIdle = TRUE;
|
|
|
|
// Pass on to the history combo
|
|
m_cbFileName.OnIdle();
|
|
|
|
return bContinueIdle;
|
|
}
|
|
|
|
void CImportDlg::ShowButtons()
|
|
{
|
|
// show buttons depending on some conditions
|
|
|
|
UpdateData();
|
|
ctlOnePass().EnableWindow(!m_bGrayscale && m_bColors);
|
|
if(m_bGrayscale)
|
|
{
|
|
ctlOnePass().SetCheck(1);
|
|
m_bOnePass=TRUE;
|
|
}
|
|
else
|
|
{
|
|
if(!m_bColors)
|
|
{
|
|
ctlOnePass().SetCheck(0);
|
|
m_bOnePass=FALSE;
|
|
}
|
|
}
|
|
if(!m_bOnePass)
|
|
{
|
|
CheckRadioButton(IDC_RADIO_DM_FLOYD_STEIN,IDC_RADIO_DM_NONE,
|
|
IDC_RADIO_DM_NONE);
|
|
}
|
|
ctlDitherMethodFS().EnableWindow(m_bOnePass);
|
|
ctlDitherMethodOrdered().EnableWindow(m_bOnePass);
|
|
ctlDitherMethodNone().EnableWindow(m_bOnePass);
|
|
}
|
|
|
|
BOOL CImportDlg::CheckFileName()
|
|
{
|
|
// check if typed file already opened
|
|
CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
|
if(pMainFrame->CheckFileAlreadyOpened(m_sFileName,TRUE))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
// check if typed directory exist
|
|
COXPathSpec path;
|
|
path.SetPath(m_sFileName);
|
|
if(path.IsEmpty() || !path.Exists())
|
|
{
|
|
AfxMessageBox(_T("Entered file doesn't exist!"),MB_OK|MB_ICONEXCLAMATION);
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|