#include "ImgPF.h" #define EMBOSS_FILTER 0 #define EDGE_DETECTION_FILTER 1 #define SPLOTCH_FILTER 2 #define EMBOSS_SPLOTCH_FILTER 3 static L_BOOL Emboss_OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam); static L_BOOL Emboss_OnCommand(HWND hDlg, L_INT id, HWND hwndCtl, UINT codeNotify); static L_BOOL Emboss_OnHScroll(HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_VOID L_ApplyFilter(HWND hWnd); L_BOOL CALLBACK EmbossWndProc (HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_INITDIALOG, Emboss_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND, Emboss_OnCommand); HANDLE_MSG (hWnd, WM_HSCROLL, Emboss_OnHScroll); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter (hWnd); break; } return FALSE; } static L_BOOL Emboss_OnInitDialog(HWND hWnd, HWND hwndFocus, LPARAM lParam) { HWND hWndParent; pCHILDDATA pData; LPEMBOSSDATA pEmbossData; L_INT nRangeMin[] = {1, 3}; L_INT nRangeMax[] = {1000,50}; L_INT nPosInit[] = {50, 3}; L_INT nSlider; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); pEmbossData = (LPEMBOSSDATA)lParam; MoveDialogToMiddle(hWnd); SetWindowLong(hWnd,GWL_USERDATA,(LONG)pEmbossData); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pEmbossData->hBitmap); pEmbossData->uAmount = 1; pEmbossData->uDepth = 3; pEmbossData->nDegree = 315; pEmbossData->uType = EMBOSS_FILTER; pEmbossData->nSlideNum = 2; pEmbossData->nEdtBaseID = IDC_EMBOSS_EDT; pEmbossData->nSldBaseID = IDC_EMBOSS_SLD; Progress_SetRange(StatusProc.ProgWnd, 0, 100); Progress_SetPos(StatusProc.ProgWnd, 0); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_EMBOSS_PRGRS); for (nSlider = 0; nSlider < pEmbossData->nSlideNum; nSlider++) { Trackbar_SetRange (GetDlgItem(hWnd, pEmbossData->nSldBaseID + nSlider), TRUE, nRangeMin[nSlider], nRangeMax[nSlider]); SetNumericEditBox(GetDlgItem(hWnd, pEmbossData->nEdtBaseID + nSlider), nRangeMin[nSlider], nRangeMax[nSlider], 1, 0, FALSE); SetDlgItemInt (hWnd, pEmbossData->nEdtBaseID + nSlider, nPosInit[nSlider], FALSE); } CreateAngleControl(GetDlgItem(hWnd, IDC_EMBOSS_DEGREE_TXT), IDC_EMBOSS_DEGREE, FROM_0_TO_360, 1, APPLY_ON_MOVE); SetNumericEditBox(GetDlgItem(hWnd, IDC_EMBOSS_DEGREE), 0, 360, 1, 0, FALSE); SetDlgItemInt (hWnd, IDC_EMBOSS_DEGREE, 315, FALSE); ComboBox_AddString(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB), TEXT("Emboss Filter")); ComboBox_AddString(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB), TEXT("Edge Detection Filter")); ComboBox_AddString(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB), TEXT("Splotch Filter")); ComboBox_AddString(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB), TEXT("Emboss-Splotch Filter")); ComboBox_SetCurSel(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB), 0); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); L_ApplyFilter(hWnd); return TRUE; } static L_BOOL Emboss_OnCommand(HWND hWnd, L_INT nID, HWND hwndCtl, UINT uCodeNotify) { L_INT nValue, nIndex; HWND hCtl; LPEMBOSSDATA pEmbossData; pEmbossData = (LPEMBOSSDATA) GetWindowLong (hWnd, GWL_USERDATA); switch (nID) { case IDOK: ShowStatusWindow(FALSE); StatusProc.bStillWork = TRUE; StatusProc.bInvalidate = TRUE; StatusProc.bEnd = TRUE; EndDialog(hWnd, TRUE); break; case IDCANCEL: StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE; StatusProc.ProgressValue = 100; EndDialog(hWnd, FALSE); break; case IDC_EMBOSS_TYPE_CMB: if (uCodeNotify == CBN_SELCHANGE) { nIndex = (ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_EMBOSS_TYPE_CMB))); if ((L_UINT)nIndex == pEmbossData->uType) return TRUE; pEmbossData->uType = nIndex; L_ApplyFilter (hWnd); } break; case IDC_EMBOSS_DEGREE: if (uCodeNotify == EN_CHANGE) { nValue = GetDlgItemInt(hWnd, nID, NULL, TRUE); DrawAngleControl(GetDlgItem(hWnd, IDC_EMBOSS_DEGREE_TXT), nValue); if (pEmbossData->nDegree == nValue) return TRUE; pEmbossData->nDegree = nValue; L_ApplyFilter (hWnd); } break; } if (nID >= pEmbossData->nEdtBaseID && nID < pEmbossData->nEdtBaseID + pEmbossData->nSlideNum) { nIndex = nID - pEmbossData->nEdtBaseID; nValue = GetDlgItemInt(hWnd, nID, NULL, TRUE); hCtl = GetDlgItem(hWnd, nID + pEmbossData->nSlideNum); Trackbar_SetPos(hCtl, TRUE, nValue); switch(nIndex) { case 0: if (pEmbossData->uAmount == (L_UINT) nValue) return TRUE; pEmbossData->uAmount = nValue; L_ApplyFilter (hWnd); break; case 1: if (pEmbossData->uDepth == (L_UINT) nValue) return TRUE; pEmbossData->uDepth = nValue; L_ApplyFilter (hWnd); break; } } return TRUE; } static L_BOOL Emboss_OnHScroll(HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPEMBOSSDATA pEmbossData = (LPEMBOSSDATA) GetWindowLong(hWnd, GWL_USERDATA); return SetDlgItemInt(hWnd, GetDlgCtrlID(hWndCtl) - pEmbossData->nSlideNum , Trackbar_GetPos(hWndCtl), TRUE); } static L_VOID L_ApplyFilter (HWND hWnd) { L_INT nRet; HWND hWndParent; pCHILDDATA pData; LPEMBOSSDATA pEmbossData; pEmbossData = (LPEMBOSSDATA) GetWindowLong(hWnd,GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE; return; } FreeMemorizedBitmap (hWndParent); //MEMDISK// L_CopyBitmap(&pData->LeadBitmap, &pEmbossData->hBitmap, sizeof(BITMAPHANDLE)); nRet = L_MaskConvolutionBitmap(&pData->LeadBitmap, pEmbossData->nDegree * 100, pEmbossData->uAmount, pEmbossData->uDepth, pEmbossData->uType); if(nRet == SUCCESS) { InvalidateRect(hWndParent, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE; } } }