/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 14 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2004 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ #include "ImgPF.h" static L_BOOL CombineDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_VOID CombineDlg_OnCommand (HWND hWnd, L_INT ID, HWND hWndCtl, UINT CodeNotify); static L_VOID CombineDlg_OnScroll (HWND hWnd, HWND hWndCtl, L_UINT uCode, L_INT nPos); static L_VOID CombineDlg_OnPaint (HWND hWnd); static L_VOID L_ApplyFilter (HWND hWnd); static L_VOID CombineDlg_OnTimer (HWND hWnd, L_INT id); static L_BOOL CALLBACK CombineEnum (HWND hWnd, LPARAM lParam); static L_VOID GetCombineImages (HWND hWnd); #ifdef UNICODE extern HFONT ghDlgFont; #endif// UNICODE L_BOOL CALLBACK CombineWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { HANDLE_MSG(hWnd, WM_INITDIALOG, CombineDlg_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, CombineDlg_OnCommand); HANDLE_MSG(hWnd, WM_HSCROLL, CombineDlg_OnScroll); HANDLE_MSG(hWnd, WM_VSCROLL, CombineDlg_OnScroll); HANDLE_MSG(hWnd, WM_TIMER, CombineDlg_OnTimer); HANDLE_MSG(hWnd, WM_PAINT, CombineDlg_OnPaint); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter (hWnd); break; } return FALSE; } static L_BOOL CombineDlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPCOMBDLGDATA pCombDlgData; pCHILDDATA pData; HWND hWndParent; L_INT nSlider; L_INT nRangeMax[] = {0, 0, 0, 0, 0, 0, 255}; L_INT nRangeMin[] = {0, 0, 0, 0, 0, 0, 0}; L_INT nPosInit [] = {0, 0, 0, 0, 0, 0, 0}; L_TCHAR L_FAR* szBinOper[] = {TEXT("AND"), TEXT("OR"), TEXT("XOR"), TEXT("ADD"), TEXT("SUBSRC"), TEXT("SUBDST"), TEXT("MUL"), TEXT("DIVSRC"), TEXT("DIVDST"), TEXT("AVG"), TEXT("MIN"), TEXT("MAX")}; L_TCHAR L_FAR* szChannel[] = {TEXT("All Channel"), TEXT("RED"), TEXT("GREEN"), TEXT("BLUE")}; L_TCHAR L_FAR* szBitwise[] = {TEXT("NOP"), TEXT("NOT"), TEXT("ZERO"), TEXT("ONE")}; RECT rcRgn; L_INT nCombo; L_INT nIndex = 1; L_INT nItem; L_INT nCounter = 0; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA(hWndParent); pCombDlgData = (LPCOMBDLGDATA)lParam; MoveDialogToMiddle(hWnd); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_COMB_PROG); Progress_SetRange(StatusProc.ProgWnd, 0, 100); Progress_SetPos(StatusProc.ProgWnd, 0); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pCombDlgData->DstBitmap); GetCombineImages(hWnd); pCombDlgData->nSldBaseID = IDC_COMB_XSRC_SLD; pCombDlgData->nEdtBaseID = IDC_COMB_XSRC_EDT; pCombDlgData->nComBaseID = IDC_COMB_SRCOP_COM; pCombDlgData->nComboNum = pCombDlgData->nSlideNum = 7; pCombDlgData->nDstIndex = pCombDlgData->nSrcIndex = pCombDlgData->nSrcX = pCombDlgData->nDstX = pCombDlgData->nSrcY = pCombDlgData->nDstY = 0; pCombDlgData->uFlag = 0x00000000; pCombDlgData->uOldFlag = 0x01110000; for (nCombo = 0; nCombo < 3; nCombo++, (nIndex = 1 << nCombo)) for (nItem = 0; nItem < 4; nItem++) { ComboBox_AddString(GetDlgItem(hWnd, pCombDlgData->nComBaseID + nIndex - 1), szBitwise[nItem]); ComboBox_AddString(GetDlgItem(hWnd, IDC_COMB_SRCCH_COM + nCombo), szChannel[nItem]); ComboBox_Enable (GetDlgItem(hWnd, IDC_COMB_SRCCH_COM + nCombo), FALSE); ComboBox_AddString(GetDlgItem(hWnd, IDC_COMB_BINOP_COM), szBinOper[nCounter]); nCounter++; } for (nCombo = 0; nCombo < pCombDlgData->nComboNum; nCombo++) ComboBox_SetCurSel(GetDlgItem(hWnd, pCombDlgData->nComBaseID + nCombo), 0); Button_SetCheck(GetDlgItem(hWnd, IDC_COMB_CHANL_CHK), TRUE); L_GetBitmapRgnBounds(&pData->LeadBitmap, NULL, &rcRgn); nRangeMax[0] = nRangeMax[2] = BITMAPWIDTH(&pData->LeadBitmap); nRangeMax[1] = nRangeMax[3] = BITMAPHEIGHT(&pData->LeadBitmap); nRangeMin[0] = nRangeMin[2] = - nRangeMax[0]; nRangeMin[1] = nRangeMin[3] = - nRangeMax[1]; nRangeMax[4] = nPosInit [4] = pCombDlgData->nWidth = BITMAPWIDTH(&pData->LeadBitmap); nRangeMax[5] = nPosInit [5] = pCombDlgData->nHeight = BITMAPHEIGHT(&pData->LeadBitmap); SetWindowLong(hWnd, GWL_USERDATA, (long)pCombDlgData); for (nSlider = 0; nSlider < pCombDlgData->nSlideNum; nSlider++) { Trackbar_SetRange(GetDlgItem(hWnd, pCombDlgData->nSldBaseID + nSlider), TRUE, nRangeMin[nSlider], nRangeMax[nSlider]); SetDlgItemInt(hWnd, pCombDlgData->nEdtBaseID + nSlider, nPosInit[nSlider], TRUE); SetNumericEditBox(GetDlgItem(hWnd, pCombDlgData->nEdtBaseID + nSlider), nRangeMin[nSlider], nRangeMax[nSlider], 1, 0, 0); } #ifdef UNICODE SetControlFont ( hWnd, ghDlgFont ) ; #endif// UNICODE pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); return TRUE; } static L_VOID CombineDlg_OnTimer (HWND hWnd, L_INT id) { Dialog_Timer(id); } static L_VOID CombineDlg_OnPaint (HWND hWnd) { pCHILDDATA pSrcData, pDstData; RECT rcRect; HDC hDC; PAINTSTRUCT ps; HPALETTE hPalette, hSavedPalette; RECT rcImage; pSrcData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_SRC_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_SRC_COM))); pDstData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_DST_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_DST_COM))); hDC = BeginPaint(GetDlgItem(hWnd, IDC_COMB_SRC_TXT), &ps); GetClientRect(GetDlgItem(hWnd, IDC_COMB_SRC_TXT), &rcImage); hPalette = L_CreatePaintPalette(hDC, &pSrcData->LeadBitmap); hSavedPalette = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); FillRect(hDC, &rcImage, (HBRUSH) COLOR_WINDOW); FitImageToWindow(rcImage,&pSrcData->LeadBitmap, &rcRect); L_PaintDC(hDC, &pSrcData->LeadBitmap, NULL, NULL, &rcRect, NULL, SRCCOPY); hPalette = SelectPalette(hDC, hSavedPalette, TRUE); DeletePalette(hPalette); EndPaint(GetDlgItem(hWnd, IDC_COMB_SRC_TXT), &ps); hDC = BeginPaint(GetDlgItem(hWnd, IDC_COMB_DST_TXT), &ps); GetClientRect(GetDlgItem(hWnd, IDC_COMB_DST_TXT), &rcImage); hPalette = L_CreatePaintPalette(hDC, &pDstData->LeadBitmap); hSavedPalette = SelectPalette(hDC, hPalette, TRUE); RealizePalette(hDC); FillRect(hDC, &rcImage, (HBRUSH) COLOR_WINDOW); FitImageToWindow(rcImage,&pDstData->LeadBitmap, &rcRect); L_PaintDC(hDC, &pDstData->LeadBitmap, NULL, NULL, &rcRect, NULL, SRCCOPY); hPalette = SelectPalette(hDC, hSavedPalette, TRUE); DeletePalette(hPalette); EndPaint(GetDlgItem(hWnd, IDC_COMB_DST_TXT), &ps); } L_VOID GetCombineImages(HWND hWnd) { EnumChildWindows (hWndClient, CombineEnum, (LONG)hWnd); ComboBox_SetCurSel(GetDlgItem(hWnd, IDC_COMB_SRC_COM), 0); ComboBox_SetCurSel(GetDlgItem(hWnd, IDC_COMB_DST_COM), 0); } L_VOID ResetChannelCombo(HWND hWnd) { LPCOMBDLGDATA pCombDlgData; L_INT nCounter; L_BOOL bChecked; L_UINT Flag; bChecked = Button_GetCheck(GetDlgItem(hWnd, IDC_COMB_CHANL_CHK)); pCombDlgData = (LPCOMBDLGDATA)GetWindowLong(hWnd, GWL_USERDATA); Flag = pCombDlgData->uOldFlag >> 16; for (nCounter = 0; nCounter < 3; nCounter++) { ComboBox_Enable(GetDlgItem(hWnd, IDC_COMB_SRCCH_COM + nCounter), !bChecked); ComboBox_SetCurSel(GetDlgItem(hWnd, IDC_COMB_SRCCH_COM + nCounter), bChecked ? 0 : ((Flag >> (nCounter * 4)) & 0x0000000f)); } pCombDlgData->uFlag = ((bChecked) ? (pCombDlgData->uFlag & 0xf000ffff) : (pCombDlgData->uFlag | pCombDlgData->uOldFlag)); } L_BOOL CALLBACK CombineEnum(HWND hWnd, LPARAM lParam) { pCHILDDATA pData; HWND hDlg; L_TCHAR StripName[255]; L_INT nCount; hDlg = (HWND)lParam; pData = (pCHILDDATA) GetWindowLong(hWnd, GWL_USERDATA); if (!pData) return FALSE; memset(StripName, 0, sizeof(StripName)); Strip(StripName, pData->pszTitle); nCount = ComboBox_GetCount(GetDlgItem(hDlg, IDC_COMB_DST_COM)); ComboBox_AddString(GetDlgItem(hDlg, IDC_COMB_DST_COM), StripName); ComboBox_AddString(GetDlgItem(hDlg, IDC_COMB_SRC_COM), StripName); ComboBox_SetItemData(GetDlgItem(hDlg, IDC_COMB_DST_COM), nCount, (LONG)pData); ComboBox_SetItemData(GetDlgItem(hDlg, IDC_COMB_SRC_COM), nCount, (LONG)pData); return TRUE; } static L_VOID CombineDlg_OnCommand(HWND hWnd, L_INT ID, HWND hWndCtl, L_UINT uCodeNotify) { L_INT nValue; pCHILDDATA pSrcData, pDstData; L_INT nRangeMax[] = {0, 0, 0, 0, 0, 0}; L_INT nRangeMin[] = {0, 0, 0, 0, 0, 0}; L_INT nPosInit [] = {0, 0, 0, 0, 0, 0}; L_INT nIndex; RECT rcRgn; LPCOMBDLGDATA pCombDlgData; pCombDlgData = (LPCOMBDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); pSrcData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_SRC_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_SRC_COM))); pDstData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_DST_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_DST_COM))); nRangeMax[0] = pSrcData->LeadBitmap.Width; nRangeMax[1] = pSrcData->LeadBitmap.Height; nRangeMin[0] = - nRangeMax[0]; nRangeMin[1] = - nRangeMax[1]; L_GetBitmapRgnBounds(&pDstData->LeadBitmap, NULL, &rcRgn); nRangeMax[2] = pDstData->LeadBitmap.Width ; nRangeMax[3] = pDstData->LeadBitmap.Height; nRangeMin[2] = - nRangeMax[2]; nRangeMin[3] = - nRangeMax[3]; nRangeMax[4] = pDstData->LeadBitmap.Width; nRangeMax[5] = pDstData->LeadBitmap.Height; switch (ID) { case IDCANCEL: StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE; StatusProc.ProgressValue = 100; EndDialog(hWnd, FALSE); break; case IDOK: ShowStatusWindow(FALSE); StatusProc.bStillWork = TRUE; StatusProc.bInvalidate = TRUE; StatusProc.bEnd = TRUE; EndDialog(hWnd, TRUE); break; case IDC_COMB_CHANL_CHK: ResetChannelCombo(hWnd); L_ApplyFilter (hWnd); break; case IDC_COMB_DST_COM: case IDC_COMB_SRC_COM: if (uCodeNotify == CBN_SELCHANGE) { pSrcData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_SRC_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_SRC_COM))); pDstData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_DST_COM), ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMB_DST_COM))); if (ID == IDC_COMB_DST_COM) { if (pCombDlgData->nDstIndex == ComboBox_GetCurSel(GetDlgItem(hWnd, ID))) return; SendMessage(hWndClient, WM_MDIACTIVATE, (WPARAM)pDstData->hBitmapWnd, (LPARAM)0); pDstData = (pCHILDDATA)ComboBox_GetItemData(hWndCtl, pCombDlgData->nDstIndex); L_FreeBitmap(&pDstData->LeadBitmap); L_CopyBitmap(&pDstData->LeadBitmap, &pCombDlgData->DstBitmap, sizeof(BITMAPHANDLE)); InvalidateRect(pDstData->hBitmapWnd, NULL, FALSE); pCombDlgData->nDstIndex = ComboBox_GetCurSel(hWndCtl); pDstData = (pCHILDDATA)ComboBox_GetItemData(hWndCtl, pCombDlgData->nDstIndex); L_FreeBitmap(&pCombDlgData->DstBitmap); L_CopyBitmap(&pCombDlgData->DstBitmap, &pDstData->LeadBitmap, sizeof(BITMAPHANDLE)); } else { if (pCombDlgData->nSrcIndex == ComboBox_GetCurSel(hWndCtl)) return; pCombDlgData->nSrcIndex = ComboBox_GetCurSel(hWndCtl); } pCombDlgData->nSrcX = pCombDlgData->nSrcY = 0; pCombDlgData->nDstX = pCombDlgData->nDstY = 0; L_GetBitmapRgnBounds(&pSrcData->LeadBitmap, NULL, &rcRgn); nRangeMax[0] = pSrcData->LeadBitmap.Width ; nRangeMax[1] = pSrcData->LeadBitmap.Height; nRangeMin[0] = - nRangeMax[0]; nRangeMin[1] = - nRangeMax[1]; L_GetBitmapRgnBounds(&pDstData->LeadBitmap, NULL, &rcRgn); nRangeMax[2] = pDstData->LeadBitmap.Width ; nRangeMax[3] = pDstData->LeadBitmap.Height; nRangeMin[2] = - nRangeMax[2]; nRangeMin[3] = - nRangeMax[3]; nRangeMax[4] = nPosInit[4] = pCombDlgData->nWidth = pDstData->LeadBitmap.Width; nRangeMax[5] = nPosInit[5] = pCombDlgData->nHeight = pDstData->LeadBitmap.Height; for (nIndex = 0; nIndex < pCombDlgData->nSlideNum - 1; nIndex++) { Trackbar_SetRange(GetDlgItem(hWnd, pCombDlgData->nSldBaseID + nIndex), TRUE, nRangeMin[nIndex], nRangeMax[nIndex]); SetDlgItemInt(hWnd, pCombDlgData->nEdtBaseID + nIndex, nPosInit[nIndex], TRUE); } InvalidateRect(hWnd, NULL, FALSE); InvalidateRect(hWndCtl, NULL, FALSE); L_ApplyFilter (hWnd); } break; } if (ID >= pCombDlgData->nComBaseID && ID < pCombDlgData->nComBaseID + pCombDlgData->nComboNum) { if (uCodeNotify == CBN_SELCHANGE) { nIndex = ID - pCombDlgData->nComBaseID; pCombDlgData->uFlag = pCombDlgData->uFlag & (~(0x0000000F << (4 * nIndex))); pCombDlgData->uFlag = pCombDlgData->uFlag | (((ID >= IDC_COMB_SRCCH_COM && ComboBox_GetCurSel(hWndCtl) == 0) ? 1: ComboBox_GetCurSel(hWndCtl)) << (4 * nIndex)); if (ID >= IDC_COMB_SRCCH_COM) { if (ComboBox_GetCurSel(hWndCtl) == 0) ComboBox_SetCurSel(hWndCtl, 1); pCombDlgData->uOldFlag = pCombDlgData->uFlag & 0x0FFF0000; } L_ApplyFilter (hWnd); } } if (ID >= pCombDlgData->nEdtBaseID && ID < pCombDlgData->nEdtBaseID + pCombDlgData->nSlideNum) { if ((uCodeNotify == EN_CHANGE)) { nValue = GetDlgItemInt(hWnd, ID, NULL, TRUE); nIndex = ID - pCombDlgData->nEdtBaseID; Trackbar_SetPos(GetDlgItem(hWnd, pCombDlgData->nSldBaseID + nIndex), TRUE, nValue); if (nValue < nRangeMin[nIndex]) { nValue = nRangeMin[nIndex]; SetDlgItemInt(hWnd, ID, nRangeMin[nIndex], TRUE); } if (nValue > nRangeMax[nIndex]) { nValue = nRangeMax[nIndex]; SetDlgItemInt(hWnd, ID, nRangeMax[nIndex], TRUE); } switch(nIndex) { case 0: if (pCombDlgData->nSrcX == nValue) return; pCombDlgData->nSrcX = nValue; break; case 1: if (pCombDlgData->nSrcY == nValue) return; pCombDlgData->nSrcY = nValue; break; case 2: if (pCombDlgData->nDstX == nValue) return; pCombDlgData->nDstX = nValue; break; case 3: if (pCombDlgData->nDstY == nValue) return; pCombDlgData->nDstY = nValue; break; case 4: if (pCombDlgData->nWidth == nValue) return; pCombDlgData->nWidth = nValue; break; case 5: if (pCombDlgData->nHeight == nValue) return; pCombDlgData->nHeight = nValue; break; } L_ApplyFilter (hWnd); } } } static L_VOID CombineDlg_OnScroll (HWND hWnd, HWND hWndCtl, L_UINT uCode, L_INT nPos) { LPCOMBDLGDATA pCombDlgData = (LPCOMBDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); SetDlgItemInt(hWnd, GetDlgCtrlID(hWndCtl) - pCombDlgData->nSlideNum, Trackbar_GetPos(hWndCtl), TRUE); } static L_VOID L_ApplyFilter (HWND hWnd) { L_INT nRet = 0; LPCOMBDLGDATA pCombDlgData; pCHILDDATA pSrcData, pDstData; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE ; return ; } pCombDlgData = (LPCOMBDLGDATA) GetWindowLong(hWnd,GWL_USERDATA); pSrcData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_SRC_COM), pCombDlgData->nSrcIndex); pDstData = (pCHILDDATA)ComboBox_GetItemData(GetDlgItem(hWnd, IDC_COMB_DST_COM), pCombDlgData->nDstIndex); FreeMemorizedBitmap (FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage)); //MEMDISK// L_CopyBitmap(&pDstData->LeadBitmap, &pCombDlgData->DstBitmap, sizeof(BITMAPHANDLE)); KillTimer(hWnd, 1); nRet = L_CombineBitmapExt(&pDstData->LeadBitmap, pCombDlgData->nDstX, pCombDlgData->nDstY, pCombDlgData->nWidth, pCombDlgData->nHeight, &pSrcData->LeadBitmap, pCombDlgData->nSrcX, pCombDlgData->nSrcY, pCombDlgData->uFlag); if(nRet == SUCCESS) { SetTimer(hWnd, 1, 100, NULL); InvalidateRect(FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage), NULL, FALSE); InvalidateRect(hWnd, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; } } }