/*[]=====================================================================[]*/ /*[] LEADTOOLS for Windows - Version 11 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2000 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ #define STRICT #include #include #include #include #include #include #include #include #include #include #include "TCHAR.H" #include "../../../include/l_bitmap.h" #include "../../../include/l_error.h" #include "../../../include/ltfpx.h" #include "fpxdemo.h" static LOADINFOCALLBACK pfnOldLoadInfo; static LOADINFOCALLBACK pfnLoadInfo; static L_BOOL fGetImageParm = FALSE; static IMAGEPARM ImageParm = { 0, 2560, 3500, 300, 300, 0, TRUE, TRUE }; typedef struct _CHILDLIST { L_INT nCount; HWND ahWnd[1]; } CHILDLIST, L_FAR *LPCHILDLIST; typedef struct _RANGEPARM { L_TCHAR szTitle[32]; L_TCHAR szLabel[32]; L_INT nValue; L_INT nMin; L_INT nMax; L_INT nStep; L_INT nPage; } RANGEPARM, FAR * LPRANGEPARM; typedef struct _LISTPARM { L_TCHAR szTitle[32]; L_TCHAR szLabel[32]; L_INT nValue; LPTSTR pList; } LISTPARM, FAR * LPLISTPARM; /*====(RangeDlgProc)====================================================== Description: Processes Range dialog box messages. Syntax : L_BOOL CALLBACK L_EXPORT RangeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT RangeDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPRANGEPARM pParm; L_INT n; L_BOOL fTranslated; switch (message) { case WM_INITDIALOG: pParm = (LPRANGEPARM) lParam; SetWindowText (hDlg, (LPTSTR) pParm->szTitle); SetDlgItemText (hDlg, IDC_RANGELABEL, (LPTSTR) pParm->szLabel); SetScrollRange (GetDlgItem (hDlg, IDC_RANGESCROLL), SB_CTL, pParm->nMin, pParm->nMax, FALSE); SetScrollPos (GetDlgItem (hDlg, IDC_RANGESCROLL), SB_CTL, pParm->nValue, TRUE); SetDlgItemInt (hDlg, IDC_RANGEEDIT, pParm->nValue, TRUE); return (TRUE); case WM_HSCROLL: n = GetDlgItemInt (hDlg, IDC_RANGEEDIT, &fTranslated, TRUE); if (!(!fTranslated || n < pParm->nMin || n > pParm->nMax)) pParm->nValue = n; switch (SCROLLCODE(wParam, lParam)) { case SB_LEFT: pParm->nValue = pParm->nMin; break; case SB_RIGHT: pParm->nValue = pParm->nMax; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: pParm->nValue = SCROLLPOS(wParam, lParam); break; case SB_LINELEFT: pParm->nValue = max (pParm->nValue - pParm->nStep, pParm->nMin); break; case SB_LINERIGHT: pParm->nValue = min (pParm->nValue + pParm->nStep, pParm->nMax); break; case SB_PAGELEFT: pParm->nValue = max (pParm->nValue - pParm->nPage, pParm->nMin); break; case SB_PAGERIGHT: pParm->nValue = min (pParm->nValue + pParm->nPage, pParm->nMax); break; } SetDlgItemInt (hDlg, IDC_RANGEEDIT, pParm->nValue, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RANGESCROLL), SB_CTL, pParm->nValue, TRUE); return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_RANGEEDIT: switch (NOTIFYCODE(wParam, lParam)) { case EN_CHANGE: n = GetDlgItemInt (hDlg, IDC_RANGEEDIT, &fTranslated, TRUE); if (!(!fTranslated || n < pParm->nMin || n > pParm->nMax)) { pParm->nValue = n; SetScrollPos (GetDlgItem (hDlg, IDC_RANGESCROLL), SB_CTL, pParm->nValue, TRUE); } break; } return (TRUE); case IDOK: n = GetDlgItemInt (hDlg, IDC_RANGEEDIT, &fTranslated, TRUE); if (!fTranslated || n < pParm->nMin || n > pParm->nMax) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_RANGEEDIT)); SendDlgItemMessage(hDlg, IDC_RANGEEDIT, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); } else { pParm->nValue = n; EndDialog (hDlg, IDOK); } return (TRUE); case IDCANCEL: EndDialog (hDlg, IDCANCEL); return (TRUE); } } return (FALSE); } /*====(ListDlgProc)======================================================== Description: Processes List dialog box messages. Syntax : L_BOOL CALLBACK L_EXPORT ListDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT ListDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPLISTPARM pParm; LPTSTR p; switch (message) { case WM_INITDIALOG: pParm = (LPLISTPARM) lParam; SetWindowText (hDlg, (LPTSTR) pParm->szTitle); SetDlgItemText (hDlg, IDC_LISTLABEL, (LPTSTR) pParm->szLabel); p = pParm->pList; while (*p) { SendDlgItemMessage (hDlg, IDC_LISTBOX, LB_ADDSTRING, 0, (LPARAM) p); p += _tcsicmp (p, '\0') + 1; } SendDlgItemMessage (hDlg, IDC_LISTBOX, LB_SETCURSEL, pParm->nValue, 0); return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_LISTBOX: switch (NOTIFYCODE(wParam, lParam)) { case LBN_DBLCLK: break; default: return (TRUE); } case IDOK: pParm->nValue = (L_INT) SendDlgItemMessage (hDlg, IDC_LISTBOX, LB_GETCURSEL, 0, 0); EndDialog (hDlg, IDOK); return (TRUE); case IDCANCEL: EndDialog (hDlg, IDCANCEL); return (TRUE); } } return (FALSE); } /*====(ResizeDlgProc)====================================================== Description: Processes Resize dialog box messages. Syntax : L_BOOL CALLBACK L_EXPORT ResizeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT ResizeDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPRESIZEPARM pParm; static L_BOOL fAspect; static L_INT nOrgWidth, nOrgHeight; L_INT nWidth, nHeight; L_BOOL fTranslated; switch (message) { case WM_INITDIALOG: pParm = (LPRESIZEPARM) lParam; nOrgWidth = pParm->nWidth; nOrgHeight = pParm->nHeight; SetWindowText (hDlg, (LPTSTR) pParm->pszTitle); SetScrollRange (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, 1, 0x4000, FALSE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, pParm->nWidth, TRUE); SetScrollRange (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, 1, 0x4000, FALSE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); SetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, pParm->nWidth, TRUE); SetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, pParm->nHeight, TRUE); fAspect = TRUE; CheckDlgButton(hDlg, IDC_RESIZEASPECT, fAspect); return (TRUE); case WM_HSCROLL: if(HWNDCTL(wParam, lParam) == GetDlgItem(hDlg, IDC_RESIZEWIDTHSCROLL)) { nWidth = GetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, &fTranslated, TRUE); if (!(!fTranslated || nWidth < 1 || nWidth > 0x4000)) pParm->nWidth = nWidth; switch (SCROLLCODE(wParam, lParam)) { case SB_LEFT: pParm->nWidth = 1; break; case SB_RIGHT: pParm->nWidth = 0x4000; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: pParm->nWidth = SCROLLPOS(wParam, lParam); break; case SB_LINELEFT: pParm->nWidth = max (pParm->nWidth - 10, 1); break; case SB_LINERIGHT: pParm->nWidth = min (pParm->nWidth + 10, 0x4000); break; case SB_PAGELEFT: pParm->nWidth = max (pParm->nWidth - 100, 1); break; case SB_PAGERIGHT: pParm->nWidth = min (pParm->nWidth + 100, 0x4000); break; } SetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, pParm->nWidth, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, pParm->nWidth, TRUE); if(fAspect) { pParm->nHeight = MulDiv(pParm->nWidth, nOrgHeight, nOrgWidth); SetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, pParm->nHeight, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); } } else { nHeight = GetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, &fTranslated, TRUE); if (!(!fTranslated || nHeight < 1 || nHeight > 0x4000)) pParm->nHeight = nHeight; switch (SCROLLCODE(wParam, lParam)) { case SB_LEFT: pParm->nHeight = 1; break; case SB_RIGHT: pParm->nHeight = 0x4000; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: pParm->nHeight = SCROLLPOS(wParam, lParam); break; case SB_LINELEFT: pParm->nHeight = max (pParm->nHeight - 10, 1); break; case SB_LINERIGHT: pParm->nHeight = min (pParm->nHeight + 10, 0x4000); break; case SB_PAGELEFT: pParm->nHeight = max (pParm->nHeight - 100, 1); break; case SB_PAGERIGHT: pParm->nHeight = min (pParm->nHeight + 100, 0x4000); break; } SetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, pParm->nHeight, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); if(fAspect) { pParm->nWidth = MulDiv(pParm->nHeight, nOrgWidth, nOrgHeight); SetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, pParm->nWidth, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, pParm->nWidth, TRUE); } } return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_RESIZEASPECT: if (NOTIFYCODE(wParam, lParam) == BN_CLICKED) { fAspect = !fAspect; if(fAspect) { pParm->nHeight = MulDiv(pParm->nWidth, nOrgHeight, nOrgWidth); SetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, pParm->nHeight, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); } return(TRUE); } break; case IDC_RESIZEWIDTHEDIT: switch (NOTIFYCODE(wParam, lParam)) { case EN_CHANGE: nWidth = GetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, &fTranslated, TRUE); if (!(!fTranslated || nWidth < 1 || nWidth > 0x4000)) { pParm->nWidth = nWidth; SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, pParm->nWidth, TRUE); if(fAspect) { fAspect = FALSE; pParm->nHeight = MulDiv(pParm->nWidth, nOrgHeight, nOrgWidth); SetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, pParm->nHeight, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); fAspect = TRUE; } } break; } return (TRUE); case IDC_RESIZEHEIGHTEDIT: switch (NOTIFYCODE(wParam, lParam)) { case EN_CHANGE: nHeight = GetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, &fTranslated, TRUE); if (!(!fTranslated || nHeight < 1 || nHeight > 0x4000)) { pParm->nHeight = nHeight; SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEHEIGHTSCROLL), SB_CTL, pParm->nHeight, TRUE); if(fAspect) { fAspect = FALSE; pParm->nWidth = MulDiv(pParm->nHeight, nOrgWidth, nOrgHeight); SetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, pParm->nWidth, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_RESIZEWIDTHSCROLL), SB_CTL, pParm->nWidth, TRUE); fAspect = TRUE; } } break; } return (TRUE); case IDOK: nWidth = GetDlgItemInt (hDlg, IDC_RESIZEWIDTHEDIT, &fTranslated, TRUE); if (!fTranslated || nWidth < 1 || nWidth > 0x4000) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_RESIZEWIDTHEDIT)); SendDlgItemMessage(hDlg, IDC_RESIZEWIDTHEDIT, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } nHeight = GetDlgItemInt (hDlg, IDC_RESIZEHEIGHTEDIT, &fTranslated, TRUE); if (!fTranslated || nHeight < 1 || nHeight > 0x4000) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_RESIZEHEIGHTEDIT)); SendDlgItemMessage(hDlg, IDC_RESIZEHEIGHTEDIT, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } pParm->nWidth = nWidth; pParm->nHeight = nHeight; EndDialog (hDlg, wParam); return (TRUE); case IDCANCEL: EndDialog (hDlg, wParam); return (TRUE); } } return (FALSE); } /*====(LoadInfoCallback)=================================================== Description: Obtains info to load headerless fax format files. Syntax : L_INT L_FAR L_EXPORT LoadInfoCallback(L_INT fd, pLOADINFO pInfo, L_VOID L_FAR * pVoid) Parameters : fd File handle to obtain info about. pInfo Structure to load with info. Return Value: SUCCESS Function was successful. ERROR_FILE_FORMAT User has indicated that the file is not a headerless fax format. ==========================================================================*/ L_INT L_FAR L_EXPORT LoadInfoCallback(L_INT fd, pLOADINFO pInfo, L_VOID L_FAR * pVoid) { UNREFERENCED_PARAMETER(fd); if(fGetImageParm) { fGetImageParm = FALSE; if(!GetImageParm(hWndFrame, &ImageParm)) return(ERROR_FILE_FORMAT); } pInfo->Width = ImageParm.nWidth; pInfo->Height = ImageParm.nHeight; pInfo->BitsPerPixel = 1; pInfo->XResolution = ImageParm.nHorz; pInfo->YResolution = ImageParm.nVert; pInfo->Offset = ImageParm.nOffset; pInfo->Flags = LOADINFO_TOPLEFT; pInfo->Flags |= (ImageParm.fBlackOnWhite ? 0 : LOADINFO_WHITEONBLACK); pInfo->Flags |= (ImageParm.fMSB ? 0 : LOADINFO_LSB); return(SUCCESS); } /*====(EnableLoadInfo)=================================================== Description: Enables/Disables the load info hook Syntax : L_BOOL EnableLoadInfo(L_BOOL fEnable) Parameters : fEnable TRUE to enable Return Value: Previous state ==========================================================================*/ L_BOOL EnableLoadInfo(L_BOOL fEnable) { L_BOOL fRet; if(fEnable) { if(!pfnLoadInfo) { pfnLoadInfo = LoadInfoCallback; pfnOldLoadInfo = L_SetLoadInfoCallback(pfnLoadInfo, NULL); fRet = FALSE; } else { fRet = TRUE; } fGetImageParm = TRUE; } else { if(pfnLoadInfo) { FreeProcInstance((FARPROC) pfnLoadInfo); L_SetLoadInfoCallback(pfnOldLoadInfo, NULL); pfnLoadInfo = NULL; fRet = TRUE; } else { fRet = FALSE; } } return(fRet); } /*====(FileInfoDlgProc)====================================================== Description: Shows file information Syntax : L_BOOL CALLBACK L_EXPORT FileInfoDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT FileInfoDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { LPFILEINFOPARM pParm; HWND hWnd; L_INT i; L_TCHAR szText[128]; RECT rcClient; RECT rcWindow; RECT rcItem; L_INT nHeight; switch(message) { case WM_INITDIALOG: pParm = (LPFILEINFOPARM) lParam; for(i = 0; aFormats[i].nFormat && aFormats[i].nFormat != (L_INT) pParm->FileInfo.Format; i++) ; wsprintf(szText, aFormats[i].pszName, (L_INT) pParm->FileInfo.Format); SetDlgItemText(hDlg, IDC_INFOFORMAT, szText); SetDlgItemText(hDlg, IDC_INFONAME, pParm->FileInfo.Name); SetDlgItemInt(hDlg, IDC_INFOWIDTH, pParm->FileInfo.Width, FALSE); SetDlgItemInt(hDlg, IDC_INFOHEIGHT, pParm->FileInfo.Height, FALSE); SetDlgItemInt(hDlg, IDC_INFOBITS, pParm->FileInfo.BitsPerPixel, FALSE); wsprintf(szText, TEXT("%lu"), pParm->FileInfo.SizeDisk); SetDlgItemText(hDlg, IDC_INFODISK, szText); wsprintf(szText, TEXT("%lu"), pParm->FileInfo.SizeMem); SetDlgItemText(hDlg, IDC_INFOMEMORY, szText); SetDlgItemText(hDlg, IDC_INFOCOMPRESSION, pParm->FileInfo.Compression); SetDlgItemInt(hDlg, IDC_INFOPAGE, pParm->FileInfo.PageNumber, FALSE); SetDlgItemInt(hDlg, IDC_XRESOLUTION, pParm->FileInfo.XResolution, FALSE); SetDlgItemInt(hDlg, IDC_YRESOLUTION, pParm->FileInfo.YResolution, FALSE); /* some files have a comment */ switch(pParm->FileInfo.Format) { default: GetWindowRect(hDlg, &rcWindow); GetClientRect(hDlg, &rcClient); hWnd = GetDlgItem(hDlg, IDC_INFOARTIST); GetWindowRect(hWnd, &rcItem); ClientToScreen(hDlg, (LPPOINT)&rcClient.left); ClientToScreen(hDlg, (LPPOINT)&rcClient.right); nHeight = rcClient.bottom - rcItem.top; MoveWindow(hDlg, rcWindow.left, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top - nHeight, FALSE); break; } return(TRUE); case WM_COMMAND: switch(CTLID(wParam, lParam)) { case IDOK: EndDialog (hDlg, 0); return (TRUE); } break; } return(FALSE); } /*====(OpenFileHook)====================================================== Description: Processes additional Open File dialog box parameters/messages. Syntax : L_BOOL CALLBACK L_EXPORT OpenFileHook(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT OpenFileHook (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPOPENFILENAME pofn; static LPOPENPARM pOpenParm; L_BOOL fTranslated; L_BOOL fLoadInfo; FILEINFOPARM parm; L_INT nRet; switch (message) { case WM_INITDIALOG: pofn = (LPOPENFILENAME) lParam; pOpenParm = (LPOPENPARM) pofn->lCustData; if(!pOpenParm->nPage) pOpenParm->nPage = 1; SetDlgItemInt (hDlg, edt2, pOpenParm->nPage, FALSE); break; case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDOK: pOpenParm->nPage = GetDlgItemInt (hDlg, edt2, &fTranslated, FALSE); if (!fTranslated || !pOpenParm->nPage) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, edt2)); return (TRUE); } break; case psh1: pOpenParm->nPage = GetDlgItemInt (hDlg, edt2, &fTranslated, FALSE); if (!fTranslated || !pOpenParm->nPage) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, edt2)); return (TRUE); } SetPageNumber(pOpenParm->nPage); GetDlgItemText(hDlg, edt1, parm.szFile, sizeof(parm.szFile)); fLoadInfo = EnableLoadInfo(FALSE); parm.FileInfo.uStructSize = sizeof(FILEINFO); nRet = L_FileInfo((LPTSTR) parm.szFile, &parm.FileInfo, sizeof(FILEINFO), 0, &LoadFileOption); EnableLoadInfo(fLoadInfo); if(nRet != SUCCESS) { #ifdef UNICODE L_CHAR *pszTempFilename = (L_CHAR*) malloc (((lstrlen (parm.szFile) +1) * sizeof(L_TCHAR))) ; wcstombs ( pszTempFilename, parm.szFile, ((lstrlen (parm.szFile) +1) * sizeof(L_TCHAR))) ; fMessageBox (hDlg, pszTempFilename, MB_ICONEXCLAMATION | MB_OK, "Information not available"); if(NULL != pszTempFilename) { free(pszTempFilename); } #else fMessageBox (hDlg, (LPSTR) parm.szFile, MB_ICONEXCLAMATION | MB_OK, "Information not available"); #endif } else { if(parm.FileInfo.Format == FILE_DICOM_GRAY || parm.FileInfo.Format == FILE_DICOM_COLOR) DoDialogBoxParam(IDD_FILEINFODICOM, hDlg, (DLGPROC) FileInfoDlgProc, (LPARAM) (LPTSTR) &parm); else DoDialogBoxParam(IDD_FILEINFO, hDlg, (DLGPROC) FileInfoDlgProc, (LPARAM) (LPTSTR) &parm); } return(TRUE); } break; } return (FALSE); } /*====(SaveFileHook)====================================================== Description: Processes additional Save File dialog box parameters/messages. Syntax : L_BOOL CALLBACK L_EXPORT SaveFileHook(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT SaveFileHook (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPOPENFILENAME pofn; static LPSAVEPARM pSaveParm; L_BOOL fTranslated; HWND hSubTypeComboBox; switch (message) { case WM_INITDIALOG: pofn = (LPOPENFILENAME) lParam; pSaveParm = (LPSAVEPARM) pofn->lCustData; SetDlgItemInt(hDlg, edt2, pSaveParm->nQFactor, TRUE); CheckDlgButton(hDlg, chx2, pSaveParm->fAppend); /* clear the subfiletype combobox */ SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_RESETCONTENT, 0, 0L ); /* set the subfile types */ ListSubFileTypes(aSFile[pSaveParm->nTypeIdx].nFormat, hDlg, (void L_FAR*)pSaveParm); SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_SETCURSEL, (WPARAM) pSaveParm->nSubTypeIdx, 0L); return(TRUE); break; case WM_COMMAND: hSubTypeComboBox = GetDlgItem(hDlg, IDC_SUBFILETYPE); ShowWindow (hSubTypeComboBox, SendDlgItemMessage(hDlg,IDC_SUBFILETYPE, CB_GETCOUNT, 0, 0L ) > 0 ? SW_SHOW : SW_HIDE); switch (CTLID(wParam, lParam)) { case IDC_SUBFILETYPE: pSaveParm->nSubTypeIdx = (L_UINT)SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_GETCURSEL, 0, 0L); break; case cmb1: if (pSaveParm) { /* clear the subfiletype combobox */ SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_RESETCONTENT, 0, 0L ); /* set the subfile types */ ListSubFileTypes(aSFile[SendDlgItemMessage(hDlg, cmb1, CB_GETCURSEL, 0, 0) + 1].nFormat, hDlg, (void L_FAR*)pSaveParm); SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_SETCURSEL, 0, 0L); } break; case IDOK: pSaveParm->nQFactor = GetDlgItemInt (hDlg, edt2, &fTranslated, TRUE); if (!fTranslated) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, edt2)); return (TRUE); } pSaveParm->fAppend = IsDlgButtonChecked(hDlg, chx2); break; } break; } return (FALSE); } /*====(ImageDlgProc)====================================================== Description: Processes Headerless Fax dialog box messages. Syntax : L_BOOL CALLBACK L_EXPORT ImageDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT ImageDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPIMAGEPARM pParm; L_INT n; L_BOOL fTranslated; L_TCHAR szText[16]; switch (message) { case WM_INITDIALOG: pParm = (LPIMAGEPARM) lParam; SetDlgItemInt(hDlg, IDC_IMAGEWIDTH, pParm->nWidth, FALSE); SetDlgItemInt(hDlg, IDC_IMAGEHEIGHT, pParm->nHeight, FALSE); SetDlgItemInt(hDlg, IDC_IMAGEHORZ, pParm->nHorz, FALSE); SetDlgItemInt(hDlg, IDC_IMAGEVERT, pParm->nVert, FALSE); wsprintf(szText, TEXT("%lu"), pParm->nOffset); SetDlgItemText(hDlg, IDC_IMAGEOFFSET, szText); CheckDlgButton(hDlg, pParm->fBlackOnWhite ? IDC_IMAGEBONW : IDC_IMAGEWONB, TRUE); CheckDlgButton(hDlg, pParm->fMSB ? IDC_IMAGEMSB : IDC_IMAGELSB, TRUE); SendDlgItemMessage(hDlg, IDC_IMAGETYPE, CB_ADDSTRING, 0, (LPARAM) (LPTSTR) TEXT("Group 3-1D Fax")); SendDlgItemMessage(hDlg, IDC_IMAGETYPE, CB_ADDSTRING, 0, (LPARAM) (LPTSTR) TEXT("Group 3-2D Fax")); SendDlgItemMessage(hDlg, IDC_IMAGETYPE, CB_ADDSTRING, 0, (LPARAM) (LPTSTR) TEXT("Group 4 Fax")); SendDlgItemMessage(hDlg, IDC_IMAGETYPE, CB_SETCURSEL, pParm->nType, 0); return(TRUE); case WM_COMMAND: switch(CTLID(wParam, lParam)) { case IDOK: n = GetDlgItemInt(hDlg, IDC_IMAGEWIDTH, &fTranslated, FALSE); if (!fTranslated || n <= 0) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_IMAGEWIDTH)); SendDlgItemMessage(hDlg, IDC_IMAGEWIDTH, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } pParm->nWidth = n; n = GetDlgItemInt(hDlg, IDC_IMAGEHEIGHT, &fTranslated, FALSE); if (!fTranslated || n <= 0) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_IMAGEHEIGHT)); SendDlgItemMessage(hDlg, IDC_IMAGEHEIGHT, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } pParm->nHeight = n; n = GetDlgItemInt(hDlg, IDC_IMAGEHORZ, &fTranslated, FALSE); if (!fTranslated || n <= 0) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_IMAGEHORZ)); SendDlgItemMessage(hDlg, IDC_IMAGEHORZ, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } pParm->nHorz = n; n = GetDlgItemInt(hDlg, IDC_IMAGEVERT, &fTranslated, FALSE); if (!fTranslated || n <= 0) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_IMAGEVERT)); SendDlgItemMessage(hDlg, IDC_IMAGEVERT, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); return(TRUE); } pParm->nVert = n; GetDlgItemText(hDlg, IDC_IMAGEOFFSET, szText, sizeof(szText)); pParm->nOffset = _ttol(szText); pParm->fBlackOnWhite = IsDlgButtonChecked(hDlg, IDC_IMAGEBONW); pParm->fMSB = IsDlgButtonChecked(hDlg, IDC_IMAGEMSB); pParm->nType = (L_INT) SendDlgItemMessage(hDlg, IDC_IMAGETYPE, CB_GETCURSEL, 0, 0); EndDialog (hDlg, wParam); return (TRUE); case IDCANCEL: EndDialog (hDlg, wParam); return (TRUE); } break; } return(FALSE); } /*====(SizeClientRect)===================================================== Description: Resizes the client window. Syntax : L_VOID SizeClientRect(HWND hWnd, L_INT nWidth, L_INT nHeight, L_BOOL fScrollBars) Prototype : fpxdemo.h Parameters : hWnd Handle of the client window. nWidth New Width. nHeight New Height. fScrollBars Boolean for "Are Scrollbars selected?". Return Value: None. ==========================================================================*/ L_VOID SizeClientRect (HWND hWnd, L_INT nWidth, L_INT nHeight, L_BOOL fScrollBars) { HWND hParent; RECT rcWindow; RECT rcClient; DWORD dwStyle; GetClientRect (hWnd, &rcClient); if (fScrollBars) { dwStyle = GetWindowLong (hWnd, GWL_STYLE); if (dwStyle & WS_VSCROLL) rcClient.right += (GetSystemMetrics (SM_CXVSCROLL) - GetSystemMetrics(SM_CXBORDER)); if (dwStyle & WS_HSCROLL) rcClient.bottom += (GetSystemMetrics (SM_CYHSCROLL) - GetSystemMetrics(SM_CYBORDER)); } GetWindowRect (hWnd, &rcWindow); hParent = GetParent (hWnd); if (hParent) { ScreenToClient (hParent, (LPPOINT) & rcWindow.left); ScreenToClient (hParent, (LPPOINT) & rcWindow.right); } MoveWindow (hWnd, rcWindow.left, rcWindow.top, RECTWIDTH (&rcWindow) + nWidth - RECTWIDTH (&rcClient), RECTHEIGHT (&rcWindow) + nHeight - RECTHEIGHT (&rcClient), TRUE); return; } /*====(DoDialogBoxParam)=================================================== Description: Creates a dialog box and returns the value selected by the user. Syntax : L_INT DoDialogBoxParam(L_INT nDialog, HWND hWnd, DLGPROC pfnDialog, LPARAM lParam) Prototype : fpxdemo.h Parameters : nDialog Fpxdemo IDD_... value of the dialog box. hWnd Handle of the owner of the dialog box. pfnDialog Function to be used for message processing by the dialog box. lParam Windows long parameter. Return Value: nRet Value returned by the function DialogBoxParam. ==========================================================================*/ L_INT DoDialogBoxParam(L_INT nDialog, HWND hWnd, DLGPROC pfnDialog, LPARAM lParam) { L_INT nRet; nRet = DialogBoxParam (hInst, MAKEINTRESOURCE (nDialog), hWnd, pfnDialog, lParam); return(nRet); } /*====(GetZoomFactor)====================================================== Description: Gets the zoom factor for the image. Syntax : L_INT GetZoomFactor (HWND hWnd, L_INT nInit) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. nInit Initial value of the control. Return Value: Zoom Factor. ==========================================================================*/ L_INT GetZoomFactor (HWND hWnd, L_INT nInit) { RANGEPARM Parm; lstrcpy (Parm.szTitle, TEXT("Zoom Factor")); lstrcpy (Parm.szLabel, TEXT("&Percentage")); Parm.nValue = nInit; Parm.nMin = 1; Parm.nMax = 800; Parm.nStep = 1; Parm.nPage = 100; switch (DoDialogBoxParam (IDD_RANGE, hWnd, (DLGPROC) RangeDlgProc, (LPARAM) (LPRANGEPARM) &Parm)) { case IDOK: break; case IDCANCEL: default: Parm.nValue = -1; break; } return (Parm.nValue); } /*====(GetFilterOption)==================================================== Description: Gets the filter option to be used during image processing. Syntax : L_INT GetFilterOption (HWND hWnd, LPTSTR pszTitle, LPTSTR pList) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. pszTitle Title for the dialog box. pList Pointer to a list of options. Return Value: Filter Option Value. ==========================================================================*/ L_INT GetFilterOption (HWND hWnd, LPTSTR pszTitle, LPTSTR pList) { LISTPARM Parm; lstrcpy (Parm.szTitle, pszTitle); lstrcpy (Parm.szLabel, TEXT("&Filter type")); Parm.nValue = 0; Parm.pList = pList; switch (DoDialogBoxParam (IDD_LIST, hWnd, (DLGPROC) ListDlgProc, (LPARAM) (LPLISTPARM) &Parm)) { case IDOK: break; case IDCANCEL: default: Parm.nValue = -1; break; } return (Parm.nValue); } /*====(GetOpenParm)====================================================== Description: Gets the parameters needed for loading an image from a file. Syntax : L_BOOL GetOpenParm (HWND hWnd, LPTSTR pszTitle, LPOPENPARM pParm) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. pszTitle Title for the dialog box. pParm Pointer to Open Parameter structure. Return Value: TRUE Load the image. FALSE Do not load the image. ==========================================================================*/ L_BOOL GetOpenParm (HWND hWnd, LPTSTR pszTitle, LPOPENPARM pParm) { static L_BOOL fInit = FALSE; OPENFILENAME ofn; L_INT nRet; L_BOOL fRet; _fmemset (&ofn, 0, sizeof (OPENFILENAME)); ofn.lStructSize = sizeof (OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = hInst; ofn.lpstrFilter = szOpenFileFilter; ofn.nFilterIndex = pParm->nTypeIdx; ofn.lpstrFile = pParm->szPath; ofn.nMaxFile = sizeof(pParm->szPath)/sizeof(L_TCHAR); ofn.lpstrFileTitle = pParm->szFile; ofn.nMaxFileTitle = sizeof(pParm->szFile)/sizeof(L_TCHAR); ofn.lpstrTitle = pszTitle; ofn.lpTemplateName = MAKEINTRESOURCE (IDD_OPEN); ofn.lCustData = (LPARAM) pParm; if(!fInit) { ofn.lpstrInitialDir = szImageDir; fInit = TRUE; } *((FARPROC *) &ofn.lpfnHook) = OpenFileHook; ofn.Flags = (OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK); fRet = GetOpenFileName(&ofn); FreeProcInstance ((FARPROC) ofn.lpfnHook); if (fRet == FALSE) { return FALSE; } pParm->nTypeIdx = (L_INT)ofn.nFilterIndex; SetPageNumber(pParm->nPage); pParm->Info.uStructSize = sizeof(FILEINFO); nRet = L_FileInfo(pParm->szPath, &pParm->Info, sizeof(FILEINFO), 0, &LoadFileOption); if (nRet == SUCCESS) { if ((pParm->Info.Format != FILE_FPX) && (pParm->Info.Format != FILE_FPX_SINGLE_COLOR) && (pParm->Info.Format != FILE_FPX_JPEG) && (pParm->Info.Format != FILE_FPX_JPEG_QFACTOR)) { nRet = ERROR_FILE_FORMAT; } } if (nRet != SUCCESS) { L_FileError(hWnd, nRet, pszTitle, pParm->szPath); return FALSE; } return TRUE; } /*====(GetSaveParm)====================================================== Description: Gets the parameters needed for saving an image to a file. Syntax : L_BOOL GetSaveParm (HWND hWnd, LPTSTR pszTitle, LPSAVEPARM pParm) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. pszTitle Title for the dialog box. pParm Pointer to Save Parameter structure. Return Value: TRUE Save the image. FALSE Do not save the image. ==========================================================================*/ L_BOOL GetSaveParm (HWND hWnd, LPTSTR pszTitle, LPSAVEPARM pParm) { static L_BOOL fInit = FALSE; OPENFILENAME ofn; L_BOOL fRet; _fmemset (&ofn, 0, sizeof (OPENFILENAME)); ofn.lStructSize = sizeof (OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = hInst; ofn.lpstrFilter = szSaveFileFilter; ofn.nFilterIndex = pParm->nTypeIdx; ofn.lpstrFile = pParm->szFile; ofn.nMaxFile = sizeof(pParm->szFile)/sizeof(L_TCHAR); ofn.lpstrTitle = pszTitle; ofn.lpTemplateName = MAKEINTRESOURCE (IDD_SAVE); ofn.lCustData = (LPARAM) pParm; if(!fInit) { ofn.lpstrInitialDir = szImageDir; fInit = TRUE; } *((FARPROC *) &ofn.lpfnHook) = SaveFileHook; ofn.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK); fRet = GetSaveFileName (&ofn); FreeProcInstance ((FARPROC) ofn.lpfnHook); if(fRet) { pParm->nTypeIdx = (L_INT) ofn.nFilterIndex; } return (fRet); } /*====(GetImageParm)======================================================= Description: Gets additional parameters needed for headerless fax formats. Syntax : L_BOOL GetImageParm (HWND hWnd, LPIMAGEPARM pParm) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. pParm Pointer to Image Parameter structure. Return Value: TRUE Load the image. FALSE Do not load the image. ==========================================================================*/ L_BOOL GetImageParm(HWND hWnd, LPIMAGEPARM pParm) { L_BOOL fRet; switch (DoDialogBoxParam (IDD_IMAGEPARM, hWnd, (DLGPROC) ImageDlgProc, (LPARAM) pParm)) { case IDOK: fRet = TRUE; break; case IDCANCEL: default: fRet = FALSE; break; } return (fRet); } /*====(SetPageNumber)====================================================== Description: Sets the page number for multipage file access. Syntax : L_VOID SetPageNumber(L_INT nPage) Prototype : fpxdemo.h Parameters : nPage Page number to be set. Return Value: None. ==========================================================================*/ L_VOID SetPageNumber(L_INT nPage) { LoadFileOption.PageNumber = nPage; SaveFileOption.PageNumber = nPage; return; } /*====(L_FileError)======================================================== Description: Sets up parameters for an error message box. Syntax : L_VOID L_FileError (HWND hwnd, L_INT nCode, LPTSTR pTitle, LPTSTR pFilename) Prototype : fpxdemo.h Parameters : hwnd Handle of a window. nCode Error code to be displayed. pTitle Pointer to the title of the message box. pFilename Pointer to the filename associated with the error. Return Value: None. ==========================================================================*/ L_VOID L_FileError (HWND hwnd, L_INT nCode, LPTSTR pTitle, LPTSTR pFilename) { L_TCHAR ErrorBuf[1024]; switch (nCode) { case ERROR_NO_MEMORY: wsprintf (ErrorBuf, TEXT("Not enough memory available!")); break; case ERROR_NO_BITMAP: wsprintf (ErrorBuf, TEXT("Invalid bitmap handle!")); break; case ERROR_MEMORY_TOO_LOW: wsprintf (ErrorBuf, TEXT("Not enough memory available!")); break; case ERROR_FILE_LSEEK: wsprintf (ErrorBuf, TEXT("Error seeking to position!")); break; case ERROR_FILE_WRITE: wsprintf (ErrorBuf, TEXT("Error writing file!")); break; case ERROR_FILE_GONE: wsprintf (ErrorBuf, TEXT("File not present - abort!")); break; case ERROR_FILE_READ: wsprintf (ErrorBuf, TEXT("Error reading file!")); break; case ERROR_INV_FILENAME: wsprintf (ErrorBuf, TEXT("Invalid filename specified!")); break; case ERROR_FILE_FORMAT: wsprintf (ErrorBuf, TEXT("Invalid file format!")); break; case ERROR_FILENOTFOUND: wsprintf (ErrorBuf, TEXT("File not found!")); break; case ERROR_INV_RANGE: wsprintf (ErrorBuf, TEXT("Invalid width/height!")); break; case ERROR_IMAGE_TYPE: wsprintf (ErrorBuf, TEXT("Image format recognized, but sub-type not supported!")); break; case ERROR_INV_PARAMETER: wsprintf (ErrorBuf, TEXT("Invalid parmameter!")); break; case ERROR_FILE_OPEN: wsprintf (ErrorBuf, TEXT("Not able to open file!")); break; case ERROR_UNKNOWN_COMP: wsprintf (ErrorBuf, TEXT("Unknown compression format!")); break; case ERROR_FEATURE_NOT_SUPPORTED: wsprintf (ErrorBuf, TEXT("Feature not supported!")); break; case ERROR_NOT_256_COLOR: wsprintf (ErrorBuf, TEXT("VGA card only supports 256 colors (8 bit)!")); break; case ERROR_CRC_CHECK: wsprintf (ErrorBuf, TEXT("Data CRC check error!")); break; case ERROR_QFACTOR: wsprintf (ErrorBuf, TEXT("Invalid QFactor specified!")); break; case ERROR_TARGAINSTALL: wsprintf (ErrorBuf, TEXT("TARGA not installed!")); break; case ERROR_OUTPUTTYPE: wsprintf (ErrorBuf, TEXT("Invalid compression format!")); break; case ERROR_XORIGIN: wsprintf (ErrorBuf, TEXT("X origin specified invalid!")); break; case ERROR_YORIGIN: wsprintf (ErrorBuf, TEXT("Y origin specified invalid!")); break; case ERROR_VIDEOTYPE: wsprintf (ErrorBuf, TEXT("Invalid video mode!")); break; case ERROR_BITPERPIXEL: wsprintf (ErrorBuf, TEXT("Invalid bits/pixel!")); break; case ERROR_WINDOWSIZE: wsprintf (ErrorBuf, TEXT("Invalid window size!")); break; case ERROR_NORMAL_ABORT: wsprintf (ErrorBuf, TEXT("Escape key pressed!")); break; case ERROR_NO_STAMP: wsprintf (ErrorBuf, TEXT("Stamp not found!")); break; case ERROR_G3CODE_INVALID: wsprintf (ErrorBuf, TEXT("Invalid group 3 data!")); break; case ERROR_G3CODE_EOF: case ERROR_G3CODE_EOL: wsprintf (ErrorBuf, TEXT("Group3 code end of code!")); break; case ERROR_PREMATURE_EOF: wsprintf (ErrorBuf, TEXT("Premature EOF at scanline!")); break; case ERROR_PREMATURE_EOL: case ERROR_UNCOMP_EOF: case ERROR_ACT_INCOMP: case ERROR_BAD_DECODE_STATE: wsprintf (ErrorBuf, TEXT("Premature end-of-line code!")); break; case ERROR_VERSION_NUMBER: wsprintf (ErrorBuf, TEXT("Bad version number!")); break; default: wsprintf (ErrorBuf, TEXT("Internal or Unrecognized Error!")); break; } #ifdef UNICODE { L_TCHAR szText[1024]; ZeroMemory(szText, sizeof(szText)); wsprintf(szText, TEXT("%s\nLEADTOOLS DLL Error (%d)\n%s"), pFilename, nCode, ErrorBuf) ; MessageBox (hwnd, szText, pTitle, MB_ICONEXCLAMATION | MB_OK); } #else fMessageBox (hwnd, pTitle, MB_ICONEXCLAMATION | MB_OK, "%s\nLEADTOOLS DLL Error (%d)\n%s", pFilename, nCode, (LPSTR) ErrorBuf); #endif return; } /*====(fMessageBox)======================================================== Description: Creates a message box. Syntax : L_INT fMessageBox (HWND hWnd, LPTSTR pCaption, UINT wType, LPTSTR pFormat,...) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. pCaption Pointer to the title of the message box. wType Type of the message box. pFormat Format of the message box. Return Value: X Return value of Window's MessageBox function. ==========================================================================*/ L_INT fMessageBox (HWND hWnd, LPSTR pCaption, UINT wType, LPSTR pFormat,...) { L_CHAR szText[256]; va_list ap; va_start (ap, pFormat); vsprintf (szText, pFormat, (LPSTR) ap); va_end (ap); return (MessageBoxA (hWnd, szText, pCaption, wType)); } /*====(BuildChildListCB)====================================================== Description: Child window enumeration procedure used by BuildChildList Syntax : L_BOOL CALLBACK L_EXPORT BuildChildListCB(HWND hWnd, LPARAM lParam) Prototype : fpxdemo.h Parameters : hWnd Handle of the child window. lParam Pointer to an LPCHILDLIST variable Return Value: TRUE To continue enumeration ==========================================================================*/ L_BOOL CALLBACK L_EXPORT BuildChildListCB (HWND hWnd, LPARAM lParam) { LPCHILDLIST pList; if (GetWindow (hWnd, GW_OWNER)) return(TRUE); pList = *((LPCHILDLIST L_FAR *) lParam); if(!pList) { pList = GlobalAllocPtr(GHND, sizeof(CHILDLIST)); } else { pList = GlobalReAllocPtr(pList, sizeof(CHILDLIST) + (sizeof(HWND) * pList->nCount), GMEM_MOVEABLE); } if(!pList) return(FALSE); pList->ahWnd[pList->nCount++] = hWnd; *((LPCHILDLIST L_FAR *) lParam) = pList; return(TRUE); } /*====(BuildChildList)====================================================== Description: Returns a list of child window handles Syntax : LPCHILDLIST BuildChildList (L_VOID) Parameters : None Return Value: Pointer to child list ==========================================================================*/ LPCHILDLIST BuildChildList(L_VOID) { LPCHILDLIST pList = NULL; EnumChildWindows(hWndClient, BuildChildListCB, (LPARAM) (LPCHILDLIST L_FAR *) &pList); return(pList); } /*====(SaveOptionsDlgProc)============================================== Description: Processes Save Options dialog box messages. Syntax : L_BOOL CALLBACK L_EXPORT SaveOptionsDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hDlg Handle of the dialog box. message Message to be processed. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE/FALSE Depends on the message. ==========================================================================*/ L_BOOL CALLBACK L_EXPORT SaveOptionsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPSAVEPARM pParm; L_INT n; L_BOOL fTranslated; switch (message) { case WM_INITDIALOG: pParm = (LPSAVEPARM) lParam; SetDlgItemInt (hDlg, IDC_PASSES, pParm->nPasses, TRUE); return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_PASSES: switch (NOTIFYCODE(wParam, lParam)) { case EN_CHANGE: n = GetDlgItemInt (hDlg, IDC_PASSES, &fTranslated, TRUE); break; } return (TRUE); case IDOK: n = GetDlgItemInt (hDlg, IDC_PASSES, &fTranslated, TRUE); if (!fTranslated) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_PASSES)); SendDlgItemMessage(hDlg, IDC_PASSES, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); } else { pParm->nPasses = n; EndDialog (hDlg, IDOK); } return (TRUE); case IDCANCEL: EndDialog (hDlg, IDCANCEL); return (TRUE); } } return (FALSE); } L_VOID ResizeDlgItem(HWND hDlg, L_INT nID, L_INT dx, L_INT dy) { RECT rc; HWND hwndItem; if( nID ) hwndItem = GetDlgItem(hDlg, nID); else hwndItem = hDlg; GetWindowRect(hwndItem, &rc); if( nID ) { ScreenToClient(hDlg, (LPPOINT) &rc.left); ScreenToClient(hDlg, (LPPOINT) &rc.right); } MoveWindow(hwndItem, rc.left, rc.top, rc.right - rc.left + dx, rc.bottom - rc.top + dy, FALSE); } L_VOID OffsetDlgItem(HWND hDlg, L_INT nID, L_INT dx, L_INT dy) { RECT rc; HWND hwndItem; hwndItem = GetDlgItem(hDlg, nID); GetWindowRect(hwndItem, &rc); ScreenToClient(hDlg, (LPPOINT) &rc.left); ScreenToClient(hDlg, (LPPOINT) &rc.right); MoveWindow(hwndItem, rc.left + dx, rc.top + dy, rc.right - rc.left, rc.bottom - rc.top, FALSE); } L_INT GetPercentageExt (HWND hWnd, LPTSTR pszTitle, L_INT nInit) { RANGEPARM Parm; lstrcpy (Parm.szTitle, pszTitle); lstrcpy (Parm.szLabel, TEXT("&Percentage")); Parm.nValue = nInit; Parm.nMin = -100; Parm.nMax = 100; Parm.nStep = 1; Parm.nPage = 10; switch (DoDialogBoxParam (IDD_RANGE, hWnd, (DLGPROC) RangeDlgProc, (LPARAM) (LPRANGEPARM) &Parm)) { case IDOK: break; case IDCANCEL: default: Parm.nValue = -101; break; } return (Parm.nValue); } L_INT GetThreshold (HWND hWnd, LPTSTR pszTitle, L_INT nInit) { RANGEPARM Parm; lstrcpy (Parm.szTitle, pszTitle); lstrcpy (Parm.szLabel, TEXT("&Threshold")); Parm.nValue = nInit; Parm.nMin = 0; Parm.nMax = 255; Parm.nStep = 1; Parm.nPage = 2; switch (DoDialogBoxParam (IDD_RANGE, hWnd, (DLGPROC) RangeDlgProc, (LPARAM) (LPRANGEPARM) &Parm)) { case IDOK: break; case IDCANCEL: default: Parm.nValue = -1; break; } return (Parm.nValue); } L_VOID ListSubFileTypes(L_INT nFormat, HWND hDlg, void L_FAR* lParm) { L_INT i; LPSAVEPARM pSaveParm; pSaveParm = (LPSAVEPARM) lParm; switch (nFormat) { case FILE_FPX_ALL: for(i = 0; i < SUB_FPX; i++) { SendDlgItemMessage(hDlg, IDC_SUBFILETYPE, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) szSubTypeFilterFPX[i]); } break; } } //====================================================================================== #define CONST_PI 3.141592653588 void RotationTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fAngle; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; ROTATEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( ROTATEDLGPARAMS ) ); DlgParams.uStructSize = sizeof ( ROTATEDLGPARAMS ) ; DlgParams.pBitmap = pBitmap; DlgParams.nAngle = 0 ; DlgParams.bResize = TRUE ; DlgParams.uDlgFlags = 0; if (L_DlgRotate ( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } DlgParams.nAngle/=100; fAngle = (L_FLOAT)((L_DOUBLE)DlgParams.nAngle * CONST_PI / 180.0); Matrix[0][0] = (L_FLOAT)cos(fAngle); Matrix[0][1] = (L_FLOAT)-sin(fAngle); Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)sin(fAngle); Matrix[1][1] = (L_FLOAT)cos(fAngle); Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void ShearHorizontalTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fAngle; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; SHEARDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( SHEARDLGPARAMS ) ); DlgParams.uStructSize = sizeof ( SHEARDLGPARAMS ) ; DlgParams.pBitmap = pBitmap; DlgParams.nAngle = 0 ; DlgParams.bHorizontal = TRUE ; DlgParams.uDlgFlags = 0; if (L_DlgShear ( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } DlgParams.nAngle/=100; fAngle = (L_FLOAT)((L_DOUBLE)DlgParams.nAngle * CONST_PI / 180.0); Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)-tan(fAngle); Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.0; Matrix[1][1] = (L_FLOAT)1.0; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void ShearVerticalTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fAngle; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; SHEARDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( SHEARDLGPARAMS ) ); DlgParams.uStructSize = sizeof ( SHEARDLGPARAMS ) ; DlgParams.pBitmap = pBitmap; DlgParams.nAngle = 0 ; DlgParams.bHorizontal = TRUE ; DlgParams.uDlgFlags = 0; if (L_DlgShear ( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } DlgParams.nAngle/=100; fAngle = (L_FLOAT)((L_DOUBLE)DlgParams.nAngle * CONST_PI / 180.0); Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)tan(fAngle); Matrix[1][1] = (L_FLOAT)1.0; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void FlipHorizontalTransform (HWND hWnd, pFILETRANSFORMS pTransforms) { L_FLOAT fAngle; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Flip Horizontal")); lstrcpy(dlg.szLabel, TEXT("&Angle (degrees)")); dlg.nValue = 0; dlg.nMin = 0; dlg.nMax = 360; dlg.nStep = 1; dlg.nPage = 10; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fAngle = (L_FLOAT)((L_DOUBLE)dlg.nValue * CONST_PI / 180.0); if (cos(fAngle) == (L_FLOAT)0.0) { return; } Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)-tan(fAngle); Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.0; Matrix[1][1] = (L_FLOAT)(1.0 / cos(fAngle)); Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void FlipVerticalTransform (HWND hWnd, pFILETRANSFORMS pTransforms) { L_FLOAT fAngle; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Flip Vertical")); lstrcpy(dlg.szLabel, TEXT("&Angle (degrees)")); dlg.nValue = 0; dlg.nMin = 0; dlg.nMax = 360; dlg.nStep = 1; dlg.nPage = 10; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fAngle = (L_FLOAT)((L_DOUBLE)dlg.nValue * CONST_PI / 180.0); if (cos(fAngle) == (L_FLOAT)0.0) { return; } Matrix[0][0] = (L_FLOAT)(1.0 / cos(fAngle)); Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)tan(fAngle); Matrix[1][1] = (L_FLOAT)1.0; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void ScalingTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fScaleX, fScaleY; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RESIZEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( RESIZEDLGPARAMS ) ); DlgParams.uStructSize = sizeof ( RESIZEDLGPARAMS ); DlgParams.uOriginalWidth = pBitmap->Width; DlgParams.uOriginalHeight = pBitmap->Height; DlgParams.uOriginalBitsPerPixel = pBitmap->BitsPerPixel; DlgParams.uOriginalResolutionX = pBitmap->XResolution; DlgParams.uOriginalResolutionY = pBitmap->YResolution; DlgParams.uNewWidth = pBitmap->Width; DlgParams.uNewHeight = pBitmap->Height; DlgParams.uNewResolutionX = pBitmap->XResolution; DlgParams.uNewResolutionY = pBitmap->YResolution; DlgParams.uResize = SIZE_NORMAL; DlgParams.uDlgFlags = DLG_RESIZE_SHOW_PERCENTAGE | DLG_RESIZE_SHOW_IDENTICALVALUE | DLG_RESIZE_SHOW_MAINTAINASPECT | DLG_RESIZE_SHOW_RESOLUTIONGRP; if (L_DlgResize( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } fScaleX = (L_FLOAT)((L_DOUBLE)DlgParams.uNewWidth / ((L_DOUBLE)pBitmap->Width)); fScaleY = (L_FLOAT)((L_DOUBLE)DlgParams.uNewHeight / ((L_DOUBLE)pBitmap->Height)); if ((fScaleX == (L_FLOAT)0.0) || (fScaleY == (L_FLOAT)0.0)) { return; } Matrix[0][0] = (L_FLOAT)1.0 / fScaleX; Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.0; Matrix[1][1] = (L_FLOAT)1.0 / fScaleY; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; AffineToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToAffine(Final, pTransforms); } void RestoreOriginalViewingTransforms (pFILETRANSFORMS pOldTransforms, pFILETRANSFORMS pNewTransforms) { pNewTransforms->a11 = pOldTransforms->a11; pNewTransforms->a12 = pOldTransforms->a12; pNewTransforms->a13 = pOldTransforms->a13; pNewTransforms->a14 = pOldTransforms->a14; pNewTransforms->a21 = pOldTransforms->a21; pNewTransforms->a22 = pOldTransforms->a22; pNewTransforms->a23 = pOldTransforms->a23; pNewTransforms->a24 = pOldTransforms->a24; pNewTransforms->a31 = pOldTransforms->a31; pNewTransforms->a32 = pOldTransforms->a32; pNewTransforms->a33 = pOldTransforms->a33; pNewTransforms->a34 = pOldTransforms->a34; pNewTransforms->a41 = pOldTransforms->a41; pNewTransforms->a42 = pOldTransforms->a42; pNewTransforms->a43 = pOldTransforms->a43; pNewTransforms->a44 = pOldTransforms->a44; } void IgnoreViewingTransforms (pFILETRANSFORMS pTransforms) { pTransforms->a11 = (L_FLOAT)1.0; pTransforms->a12 = (L_FLOAT)0.0; pTransforms->a13 = (L_FLOAT)0.0; pTransforms->a14 = (L_FLOAT)0.0; pTransforms->a21 = (L_FLOAT)0.0; pTransforms->a22 = (L_FLOAT)1.0; pTransforms->a23 = (L_FLOAT)0.0; pTransforms->a24 = (L_FLOAT)0.0; pTransforms->a31 = (L_FLOAT)0.0; pTransforms->a32 = (L_FLOAT)0.0; pTransforms->a33 = (L_FLOAT)1.0; pTransforms->a34 = (L_FLOAT)0.0; pTransforms->a41 = (L_FLOAT)0.0; pTransforms->a42 = (L_FLOAT)0.0; pTransforms->a43 = (L_FLOAT)0.0; pTransforms->a44 = (L_FLOAT)1.0; } void LightenTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fLighten; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; BRIGHTNESSDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( BRIGHTNESSDLGPARAMS ) ); DlgParams.uStructSize = sizeof(BRIGHTNESSDLGPARAMS); DlgParams.pBitmap = pBitmap; DlgParams.nChange = 0 ; DlgParams.uDlgFlags = 0; if (L_DlgBrightness ( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } fLighten = (L_FLOAT)((L_DOUBLE)(DlgParams.nChange + 100.0) / 100.0); fLighten = (L_FLOAT)sqrt((L_DOUBLE)fLighten); Matrix[0][0] = fLighten; Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.0; Matrix[1][1] = fLighten; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = fLighten; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; TwistColorToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToTwistColor(Final, pTransforms); } void SaturationTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fSaturation; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; SATURATIONDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( SATURATIONDLGPARAMS ) ); DlgParams.uStructSize = sizeof(SATURATIONDLGPARAMS); DlgParams.pBitmap = pBitmap; DlgParams.nChange = 0 ; DlgParams.uDlgFlags = 0; if (L_DlgSaturation( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } fSaturation = (L_FLOAT)((L_DOUBLE)(DlgParams.nChange + 100.0) / 100.0); Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.0; Matrix[1][1] = fSaturation; Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.0; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = fSaturation; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; TwistColorToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToTwistColor(Final, pTransforms); } void RedBalanceTransform (HWND hWnd, pFILETRANSFORMS pTransforms) { L_FLOAT fRed; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Red Balance")); lstrcpy(dlg.szLabel, TEXT("&Amount")); dlg.nValue = 0; dlg.nMin = -100; dlg.nMax = 100; dlg.nStep = 1; dlg.nPage = 10; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fRed = (L_FLOAT)((L_DOUBLE)(dlg.nValue + 100.0) / 100.0); fRed = (L_FLOAT)sqrt((L_DOUBLE)fRed) - (L_FLOAT)1.0; Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)0.0; Matrix[0][2] = (L_FLOAT)0.299 * fRed; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)-0.299 * fRed; Matrix[1][1] = (L_FLOAT)1.0 - ((L_FLOAT)0.299 * fRed); Matrix[1][2] = (L_FLOAT)-0.299 * fRed; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)0.701 * fRed; Matrix[2][1] = (L_FLOAT)0.0; Matrix[2][2] = (L_FLOAT)1.0 + ((L_FLOAT)0.402 * fRed); Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; TwistColorToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToTwistColor(Final, pTransforms); } void GreenBalanceTransform (HWND hWnd, pFILETRANSFORMS pTransforms) { L_FLOAT fGreen; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Green Balance")); lstrcpy(dlg.szLabel, TEXT("&Amount")); dlg.nValue = 0; dlg.nMin = -100; dlg.nMax = 100; dlg.nStep = 1; dlg.nPage = 10; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fGreen = (L_FLOAT)((L_DOUBLE)(dlg.nValue + 100.0) / 100.0); fGreen = (L_FLOAT)sqrt((L_DOUBLE)fGreen) - (L_FLOAT)1.0; Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)-0.114 * fGreen; Matrix[0][2] = (L_FLOAT)-0.299 * fGreen; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)-0.587 * fGreen; Matrix[1][1] = (L_FLOAT)1.0 - ((L_FLOAT)0.473 * fGreen); Matrix[1][2] = (L_FLOAT)0.299 * fGreen; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)-0.587 * fGreen; Matrix[2][1] = (L_FLOAT)0.114 * fGreen; Matrix[2][2] = (L_FLOAT)1.0 - ((L_FLOAT)0.288 * fGreen); Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; TwistColorToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToTwistColor(Final, pTransforms); } void BlueBalanceTransform (HWND hWnd, pFILETRANSFORMS pTransforms) { L_FLOAT fBlue; L_FLOAT Matrix[4][4], Original[4][4], Final[4][4]; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Blue Balance")); lstrcpy(dlg.szLabel, TEXT("&Amount")); dlg.nValue = 0; dlg.nMin = -100; dlg.nMax = 100; dlg.nStep = 1; dlg.nPage = 10; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fBlue = (L_FLOAT)((L_DOUBLE)(dlg.nValue + 100.0) / 100.0); fBlue = (L_FLOAT)sqrt((L_DOUBLE)fBlue) - (L_FLOAT)1.0; Matrix[0][0] = (L_FLOAT)1.0; Matrix[0][1] = (L_FLOAT)0.114 * fBlue; Matrix[0][2] = (L_FLOAT)0.0; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = (L_FLOAT)0.886 * fBlue; Matrix[1][1] = (L_FLOAT)1.0 + ((L_FLOAT)0.772 * fBlue); Matrix[1][2] = (L_FLOAT)0.0; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = (L_FLOAT)-0.114 * fBlue; Matrix[2][1] = (L_FLOAT)-0.114 * fBlue; Matrix[2][2] = (L_FLOAT)1.0 - ((L_FLOAT)0.114 * fBlue); Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; TwistColorToMatrix(pTransforms, Original); MatrixMultiply(Original, Matrix, Final); MatrixToTwistColor(Final, pTransforms); } void ContrastTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fContrast; CONTRASTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof ( CONTRASTDLGPARAMS ) ); DlgParams.uStructSize = sizeof(CONTRASTDLGPARAMS); DlgParams.pBitmap = pBitmap; DlgParams.nChange = 0; DlgParams.uDlgFlags = 0; if (L_DlgContrast( hWnd, &DlgParams )!= SUCCESS_DLG_OK) { return; } fContrast = (L_FLOAT)((L_DOUBLE)(DlgParams.nChange + 100.0) / 100.0); pTransforms->fContrastAdjustment = fContrast; } void SharpnessTransform (HWND hWnd, pBITMAPHANDLE pBitmap, pFILETRANSFORMS pTransforms) { L_FLOAT fSharpness; RANGEPARM dlg; lstrcpy(dlg.szTitle, TEXT("Sharpness")); lstrcpy(dlg.szLabel, TEXT("&Amount")); dlg.nValue = 0; dlg.nMin = -20; dlg.nMax = 20; dlg.nStep = 1; dlg.nPage = 5; if (DoDialogBoxParam(IDD_RANGE, hWnd, (DLGPROC)RangeDlgProc, (LPARAM)(LPRANGEPARM)&dlg) != IDOK) { return; } fSharpness = (L_FLOAT)((L_DOUBLE)dlg.nValue); pTransforms->fFilteringValue = fSharpness; } void RestoreOriginalColorTransforms (pFILETRANSFORMS pOldTransforms, pFILETRANSFORMS pNewTransforms) { pNewTransforms->byy = pOldTransforms->byy; pNewTransforms->byc1 = pOldTransforms->byc1; pNewTransforms->byc2 = pOldTransforms->byc2; pNewTransforms->bc1y = pOldTransforms->bc1y; pNewTransforms->bc1c1 = pOldTransforms->bc1c1; pNewTransforms->bc1c2 = pOldTransforms->bc1c2; pNewTransforms->bc2y = pOldTransforms->bc2y; pNewTransforms->bc2c1 = pOldTransforms->bc2c1; pNewTransforms->bc2c2 = pOldTransforms->bc2c2; pNewTransforms->fContrastAdjustment = pOldTransforms->fContrastAdjustment; pNewTransforms->fFilteringValue = pOldTransforms->fFilteringValue; } void IgnoreColorTransforms (pFILETRANSFORMS pTransforms) { pTransforms->byy = (L_FLOAT)1.0; pTransforms->byc1 = (L_FLOAT)0.0; pTransforms->byc2 = (L_FLOAT)0.0; pTransforms->bc1y = (L_FLOAT)0.0; pTransforms->bc1c1 = (L_FLOAT)1.0; pTransforms->bc1c2 = (L_FLOAT)0.0; pTransforms->bc2y = (L_FLOAT)0.0; pTransforms->bc2c1 = (L_FLOAT)0.0; pTransforms->bc2c2 = (L_FLOAT)1.0; pTransforms->fContrastAdjustment = (L_FLOAT)1.0; pTransforms->fFilteringValue = (L_FLOAT)0.0; } void AffineToMatrix (pFILETRANSFORMS pTransforms, L_FLOAT Matrix[4][4]) { Matrix[0][0] = pTransforms->a11; Matrix[0][1] = pTransforms->a12; Matrix[0][2] = pTransforms->a13; Matrix[0][3] = pTransforms->a14; Matrix[1][0] = pTransforms->a21; Matrix[1][1] = pTransforms->a22; Matrix[1][2] = pTransforms->a23; Matrix[1][3] = pTransforms->a24; Matrix[2][0] = pTransforms->a31; Matrix[2][1] = pTransforms->a32; Matrix[2][2] = pTransforms->a33; Matrix[2][3] = pTransforms->a34; Matrix[3][0] = pTransforms->a41; Matrix[3][1] = pTransforms->a42; Matrix[3][2] = pTransforms->a43; Matrix[3][3] = pTransforms->a44; } void MatrixToAffine (L_FLOAT Matrix[4][4], pFILETRANSFORMS pTransforms) { pTransforms->a11 = Matrix[0][0]; pTransforms->a12 = Matrix[0][1]; pTransforms->a13 = Matrix[0][2]; pTransforms->a14 = Matrix[0][3]; pTransforms->a21 = Matrix[1][0]; pTransforms->a22 = Matrix[1][1]; pTransforms->a23 = Matrix[1][2]; pTransforms->a24 = Matrix[1][3]; pTransforms->a31 = Matrix[2][0]; pTransforms->a32 = Matrix[2][1]; pTransforms->a33 = Matrix[2][2]; pTransforms->a34 = Matrix[2][3]; pTransforms->a41 = Matrix[3][0]; pTransforms->a42 = Matrix[3][1]; pTransforms->a43 = Matrix[3][2]; pTransforms->a44 = Matrix[3][3]; } void TwistColorToMatrix (pFILETRANSFORMS pTransforms, L_FLOAT Matrix[4][4]) { Matrix[0][0] = pTransforms->byy; Matrix[0][1] = pTransforms->byc1; Matrix[0][2] = pTransforms->byc2; Matrix[0][3] = (L_FLOAT)0.0; Matrix[1][0] = pTransforms->bc1y; Matrix[1][1] = pTransforms->bc1c1; Matrix[1][2] = pTransforms->bc1c2; Matrix[1][3] = (L_FLOAT)0.0; Matrix[2][0] = pTransforms->bc2y; Matrix[2][1] = pTransforms->bc2c1; Matrix[2][2] = pTransforms->bc2c2; Matrix[2][3] = (L_FLOAT)0.0; Matrix[3][0] = (L_FLOAT)0.0; Matrix[3][1] = (L_FLOAT)0.0; Matrix[3][2] = (L_FLOAT)0.0; Matrix[3][3] = (L_FLOAT)1.0; } void MatrixToTwistColor (L_FLOAT Matrix[4][4], pFILETRANSFORMS pTransforms) { pTransforms->byy = Matrix[0][0]; pTransforms->byc1 = Matrix[0][1]; pTransforms->byc2 = Matrix[0][2]; pTransforms->bc1y = Matrix[1][0]; pTransforms->bc1c1 = Matrix[1][1]; pTransforms->bc1c2 = Matrix[1][2]; pTransforms->bc2y = Matrix[2][0]; pTransforms->bc2c1 = Matrix[2][1]; pTransforms->bc2c2 = Matrix[2][2]; } void MatrixMultiply (L_FLOAT First[4][4], L_FLOAT Second[4][4], L_FLOAT Result[4][4]) { Result[0][0] = (First[0][0] * Second[0][0]) + (First[0][1] * Second[1][0]) + (First[0][2] * Second[2][0]) + (First[0][3] * Second[3][0]); Result[0][1] = (First[0][0] * Second[0][1]) + (First[0][1] * Second[1][1]) + (First[0][2] * Second[2][1]) + (First[0][3] * Second[3][1]); Result[0][2] = (First[0][0] * Second[0][2]) + (First[0][1] * Second[1][2]) + (First[0][2] * Second[2][2]) + (First[0][3] * Second[3][2]); Result[0][3] = (First[0][0] * Second[0][3]) + (First[0][1] * Second[1][3]) + (First[0][2] * Second[2][3]) + (First[0][3] * Second[3][3]); Result[1][0] = (First[1][0] * Second[0][0]) + (First[1][1] * Second[1][0]) + (First[1][2] * Second[2][0]) + (First[1][3] * Second[3][0]); Result[1][1] = (First[1][0] * Second[0][1]) + (First[1][1] * Second[1][1]) + (First[1][2] * Second[2][1]) + (First[1][3] * Second[3][1]); Result[1][2] = (First[1][0] * Second[0][2]) + (First[1][1] * Second[1][2]) + (First[1][2] * Second[2][2]) + (First[1][3] * Second[3][2]); Result[1][3] = (First[1][0] * Second[0][3]) + (First[1][1] * Second[1][3]) + (First[1][2] * Second[2][3]) + (First[1][3] * Second[3][3]); Result[2][0] = (First[2][0] * Second[0][0]) + (First[2][1] * Second[1][0]) + (First[2][2] * Second[2][0]) + (First[2][3] * Second[3][0]); Result[2][1] = (First[2][0] * Second[0][1]) + (First[2][1] * Second[1][1]) + (First[2][2] * Second[2][1]) + (First[2][3] * Second[3][1]); Result[2][2] = (First[2][0] * Second[0][2]) + (First[2][1] * Second[1][2]) + (First[2][2] * Second[2][2]) + (First[2][3] * Second[3][2]); Result[2][3] = (First[2][0] * Second[0][3]) + (First[2][1] * Second[1][3]) + (First[2][2] * Second[2][3]) + (First[2][3] * Second[3][3]); Result[3][0] = (First[3][0] * Second[0][0]) + (First[3][1] * Second[1][0]) + (First[3][2] * Second[2][0]) + (First[3][3] * Second[3][0]); Result[3][1] = (First[3][0] * Second[0][1]) + (First[3][1] * Second[1][1]) + (First[3][2] * Second[2][1]) + (First[3][3] * Second[3][1]); Result[3][2] = (First[3][0] * Second[0][2]) + (First[3][1] * Second[1][2]) + (First[3][2] * Second[2][2]) + (First[3][3] * Second[3][2]); Result[3][3] = (First[3][0] * Second[0][3]) + (First[3][1] * Second[1][3]) + (First[3][2] * Second[2][3]) + (First[3][3] * Second[3][3]); } static L_TCHAR *CommentName[] = { // Summary Information TEXT("Title"), TEXT("Subject"), TEXT("Author"), TEXT("Keywords"), TEXT("Comments"), TEXT("Template"), TEXT("Last author"), TEXT("Revision number"), TEXT("Total editing time"), TEXT("Last printed"), TEXT("Create date/time"), TEXT("Last saved date/time"), TEXT("Number of pages"), TEXT("Number of words"), TEXT("Number of characters"), TEXT("Thumbnail"), TEXT("Name of creating application"), TEXT("Security"), // File Source Group TEXT("File source"), TEXT("Scene type"), TEXT("Creation path vector"), TEXT("Software name/release"), TEXT("User defined ID"), TEXT("Sharpness approximation"), // Intellectual Property Group TEXT("Copyright message"), TEXT("Legal broker for original image"), TEXT("Legal broker for digital image"), TEXT("Authorship"), TEXT("Intellectual property notes"), // Content Description Group TEXT("Test target in the image"), TEXT("Group caption"), TEXT("Caption text"), TEXT("People in the image"), TEXT("Things in the image"), TEXT("Date of original image"), TEXT("Events in the image"), TEXT("Places in the image"), TEXT("Content description notes"), // Camera Information Group TEXT("Camera manufacturer name"), TEXT("Camera model name"), TEXT("Camera serial number"), // Per Picture Camera Settings Group TEXT("Capture date"), TEXT("Exposure time"), TEXT("F-number"), TEXT("Exposure program"), TEXT("Brightness value"), TEXT("Exposure bias value"), TEXT("Subject distance"), TEXT("Metering mode"), TEXT("Scene illuminant"), TEXT("Focal length"), TEXT("Maximum aperature value"), TEXT("Flash"), TEXT("Flash energy"), TEXT("Flash return"), TEXT("Back light"), TEXT("Subject location"), TEXT("Exposure index"), TEXT("Special effects optical filter"), TEXT("Per picture camera settings notes"), // Digital Camera Characterization Group TEXT("Sensing method"), TEXT("Focal plane X resolution"), TEXT("Focal plane Y resolution"), TEXT("Focal plane resolution unit"), TEXT("Spacial frequency response"), TEXT("CFA pattern"), TEXT("Spectral sensitivity"), TEXT("ISO speed ratings"), TEXT("OECF"), // Film Description Group TEXT("Film brand"), TEXT("Film category"), TEXT("Film size X"), TEXT("Film size Y"), TEXT("Film size unit"), TEXT("Film roll number"), TEXT("Film frame number"), // Original Document Scan Description Group TEXT("Original scanned image size"), TEXT("Original document size"), TEXT("Original medium"), TEXT("Type of reflection original"), // Scan Device Property Group TEXT("Scanner manufacturer name"), TEXT("Scanner model name"), TEXT("Scanner serial number"), TEXT("Scan software"), TEXT("Scan software revision date"), TEXT("Service bureau/organization name"), TEXT("Scan operator ID"), TEXT("Scan date"), TEXT("Last modified date"), TEXT("Scanner pixel size"), }; #define MAX_CHARS 75 void BoolToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_BOOL L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_BOOL L_FAR *)(pHeader + 1); if (*pData == 0) wsprintf(szText, TEXT("FALSE")); else wsprintf(szText, TEXT("TRUE")); } } void ShortToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT16 L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("%u"), *pData); } } void ShortArrayToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UINT16 L_FAR *pData; L_UINT32 i; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); for (i = 0; i < pHeader->elements; i++) { wsprintf(szTemp, TEXT("%u"), pData[i]); if (lstrlen(szTemp) + lstrlen(szText) + 2 > ( int ) uSize) { break; } lstrcat(szText, szTemp); lstrcat(szText, TEXT(", ")); } } } void LongToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT32 L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT32 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("%lu"), *pData); } } void LongArrayToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UINT32 L_FAR *pData; L_UINT32 i; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UINT32 L_FAR *)(pHeader + 1); for (i = 0; i < pHeader->elements; i++) { wsprintf(szTemp, TEXT("%lu"), pData[i]); if (lstrlen(szTemp) + lstrlen(szText) + 2 > ( int ) uSize) { break; } lstrcat(szText, szTemp); lstrcat(szText, TEXT(", ")); } } } void FloatToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_FLOAT L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_FLOAT L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("%f"), *pData); } } void FloatArrayToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_FLOAT L_FAR *pData; L_UINT32 i; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_FLOAT L_FAR *)(pHeader + 1); for (i = 0; i < pHeader->elements; i++) { wsprintf(szTemp, TEXT("%f"), pData[i]); if (lstrlen(szTemp) + lstrlen(szText) + 2 > ( int ) uSize) { break; } lstrcat(szText, szTemp); lstrcat(szText, TEXT(", ")); } } } void StrToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UCHAR L_FAR *pData; L_UINT32 i=0; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UCHAR L_FAR *)(pHeader + 1); for (i = 0; i < min(pHeader->elements, uSize); i++) { szText[i] = pData[i]; } } szText[i] = '\0'; } void StrArrayToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UCHAR L_FAR *pData; L_UINT32 i, uElements; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UCHAR L_FAR *)(pHeader + 1); uElements = pHeader->elements; for (i = 0; i < uElements; i++) { StrToText(pData, szTemp, MAX_CHARS); pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pData; pData = (L_UCHAR L_FAR *)pHeader + pHeader->size; if (lstrlen(szTemp) + lstrlen(szText) + 2 > ( int ) uSize) { break; } lstrcat(szText, szTemp); lstrcat(szText, TEXT("; ")); } } } void WideStrToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UINT16 L_FAR *pData; L_UINT32 i=0; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); for (i = 0; i < min(pHeader->elements, uSize); i++) { szText[i] = (L_UCHAR)pData[i]; } } szText[i] = '\0'; } void WideStrArrayToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UCHAR L_FAR *pData; L_UINT32 i, uElements; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UCHAR L_FAR *)(pHeader + 1); uElements = pHeader->elements; for (i = 0; i < uElements; i++) { WideStrToText(pData, szTemp, MAX_CHARS); pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pData; pData = (L_UCHAR L_FAR *)pHeader + pHeader->size; if (lstrlen(szTemp) + lstrlen(szText) + 2 > ( int ) uSize) { break; } lstrcat(szText, szTemp); lstrcat(szText, TEXT("; ")); } } } void ThumbnailToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ARRAY L_FAR *pHeader; L_UINT32 L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ARRAY L_FAR *)pSrc; pData = (L_UINT32 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("size=%lu, format=%ld"), pHeader->elements, pData[0]); } } void SpacialBlockToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT32 L_FAR *pData; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT32 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("columns=%lu, rows=%lu, headings="), pData[0], pData[1]); pData = &pData[2]; WideStrArrayToText(pData, szTemp, MAX_CHARS); if (lstrlen(szTemp) + lstrlen(szText) <= ( int ) uSize) { lstrcat(szText, szTemp); pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pData; pData = (L_UINT32 L_FAR *)((L_UCHAR L_FAR *)pHeader + pHeader->size); FloatArrayToText(pData, szTemp, MAX_CHARS); if (lstrlen(szTemp) + lstrlen(szText) + 7 <= ( int ) uSize) { lstrcat(szText, TEXT("; data=")); lstrcat(szText, szTemp); } } } } void OECFBlockToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT16 L_FAR *pData; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("columns=%u, rows=%u, headings="), pData[0], pData[1]); pData = &pData[2]; WideStrArrayToText(pData, szTemp, MAX_CHARS); if (lstrlen(szTemp) + lstrlen(szText) <= ( int ) uSize) { lstrcat(szText, szTemp); pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pData; pData = (L_UINT16 L_FAR *)((L_UCHAR L_FAR *)pHeader + pHeader->size); FloatArrayToText(pData, szTemp, MAX_CHARS); if (lstrlen(szTemp) + lstrlen(szText) + 7 <= ( int ) uSize) { lstrcat(szText, TEXT("; data=")); lstrcat(szText, szTemp); } } } } void CFABlockToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT16 L_FAR *pData; L_TCHAR szTemp[MAX_CHARS+1]; szText[0] = '\0'; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("rows=%u, cols=%u, array="), pData[0], pData[1]); pData = &pData[2]; StrToText(pData, szTemp, MAX_CHARS); if (lstrlen(szTemp) + lstrlen(szText) <= ( int ) uSize) { lstrcat(szText, szTemp); } } } void ScanBlockToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_FLOAT L_FAR *pData1; L_UINT32 L_FAR *pData2; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData1 = (L_FLOAT L_FAR *)(pHeader + 1); pData2 = (L_UINT32 L_FAR *)&pData1[2]; wsprintf(szText, TEXT("x=%f, y=%f, unit=%lu"), pData1[0], pData1[1], pData2[0]); } } void SystemTimeToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_UINT16 L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_UINT16 L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("%02d/%02d/%d %02d:%02d:%02d.%d"), pData[1], pData[3], pData[0], pData[4], pData[5], pData[6], pData[7]); } } void DateToText (L_VOID L_FAR *pSrc, L_TCHAR L_FAR *szText, L_UINT32 uSize) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; L_DOUBLE L_FAR *pData; if (pSrc != NULL) { pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pSrc; pData = (L_DOUBLE L_FAR *)(pHeader + 1); wsprintf(szText, TEXT("%f"), *pData); } } void CommentToText (FILECOMMENTS L_FAR *pComments, L_UINT uType, L_TCHAR L_FAR *szText) { FPXCOMMENT_HEADER_ELEMENT L_FAR *pHeader; szText[0] = '\0'; pHeader = (FPXCOMMENT_HEADER_ELEMENT L_FAR *)pComments->pointer[uType]; if (pHeader == NULL) { return; } switch (pHeader->type) { case FPXENUM_BOOL: BoolToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_SHORT: ShortToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_SHORT_ARRAY: ShortArrayToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_LONG: LongToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_LONG_ARRAY: LongArrayToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_FLOAT: FloatToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_FLOAT_ARRAY: FloatArrayToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_STRING: StrToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_STRING_ARRAY: StrArrayToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_WIDE_STRING: WideStrToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_WIDE_STRING_ARRAY: WideStrArrayToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_THUMBNAIL: ThumbnailToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_SPACIAL_FREQUENCY_RESPONSE_BLOCK: SpacialBlockToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_OECF_BLOCK: OECFBlockToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_CFA_PATTERN_BLOCK: CFABlockToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_SCANNED_IMAGE_SIZE_BLOCK: ScanBlockToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_SYSTEM_TIME: SystemTimeToText(pHeader, szText, MAX_CHARS); break; case FPXENUM_DATE: DateToText(pHeader, szText, MAX_CHARS); break; } } L_BOOL CALLBACK L_EXPORT CommentsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { LPCOMMENTSPARM pParm; L_UINT uType, uMinType, uMaxType, u; L_TCHAR szText[MAX_CHARS+1]; FILECOMMENTS L_FAR *pComments; switch(message) { case WM_INITDIALOG: pParm = (LPCOMMENTSPARM)lParam; pComments = pParm->pComments; uType = pParm->uType; switch (uType) { case CMNT_FPXSUMMARYINFORMATION: uMinType = CMNT_FPXSUMMARYINFORMATION1; uMaxType = CMNT_FPXSUMMARYINFORMATION2; SetWindowText(hDlg, TEXT("Summary Information")); break; case CMNT_FPXFILESOURCEGROUP: uMinType = CMNT_FPXFILESOURCEGROUP1; uMaxType = CMNT_FPXFILESOURCEGROUP2; SetWindowText(hDlg, TEXT("File Source Group")); break; case CMNT_FPXINTELLECTUALPROPERTYGROUP: uMinType = CMNT_FPXINTELLECTUALPROPERTYGROUP1; uMaxType = CMNT_FPXINTELLECTUALPROPERTYGROUP2; SetWindowText(hDlg, TEXT("Intellectual Property Group")); break; case CMNT_FPXCONTENTDESCRIPTIONGROUP: uMinType = CMNT_FPXCONTENTDESCRIPTIONGROUP1; uMaxType = CMNT_FPXCONTENTDESCRIPTIONGROUP2; SetWindowText(hDlg, TEXT("Content Description Group")); break; case CMNT_FPXCAMERAINFORMATIONGROUP: uMinType = CMNT_FPXCAMERAINFORMATIONGROUP1; uMaxType = CMNT_FPXCAMERAINFORMATIONGROUP2; SetWindowText(hDlg, TEXT("Camera Information Group")); break; case CMNT_FPXPERPICTURECAMERASETTINGSGROUP: uMinType = CMNT_FPXPERPICTURECAMERASETTINGSGROUP1; uMaxType = CMNT_FPXPERPICTURECAMERASETTINGSGROUP2; SetWindowText(hDlg, TEXT("Per Picture Camera Settings Group")); break; case CMNT_FPXDIGITALCAMERACHARACTERIZATIONGROUP: uMinType = CMNT_FPXDIGITALCAMERACHARACTERIZATIONGROUP1; uMaxType = CMNT_FPXDIGITALCAMERACHARACTERIZATIONGROUP2; SetWindowText(hDlg, TEXT("Digital Camera Characterization Group")); break; case CMNT_FPXFILMDESCRIPTIONGROUP: uMinType = CMNT_FPXFILMDESCRIPTIONGROUP1; uMaxType = CMNT_FPXFILMDESCRIPTIONGROUP2; SetWindowText(hDlg, TEXT("Film Description Group")); break; case CMNT_FPXORIGINALDOCUMENTSCANDESCRIPTIONGROUP: uMinType = CMNT_FPXORIGINALDOCUMENTSCANDESCRIPTIONGROUP1; uMaxType = CMNT_FPXORIGINALDOCUMENTSCANDESCRIPTIONGROUP2; SetWindowText(hDlg, TEXT("Original Document Scan Description Group")); break; case CMNT_FPXSCANDEVICEPROPERTYGROUP: uMinType = CMNT_FPXSCANDEVICEPROPERTYGROUP1; uMaxType = CMNT_FPXSCANDEVICEPROPERTYGROUP2; SetWindowText(hDlg, TEXT("Scan Device Property Group")); break; } for (u = uMinType; u <= uMaxType; u++) { SetDlgItemText(hDlg, IDC_STATIC1 + u - uMinType, CommentName[u-CMNT_FPXSUMMARYINFORMATION1]); CommentToText(pComments, u, szText); SetDlgItemText(hDlg, IDC_STATIC21 + u - uMinType, szText); } for (u = uMaxType - uMinType + 1; u < 19; u++) { SetDlgItemText(hDlg, IDC_STATIC1 + u, TEXT(" ")); SetDlgItemText(hDlg, IDC_STATIC21 + u, TEXT(" ")); } return(TRUE); case WM_COMMAND: switch(CTLID(wParam, lParam)) { case IDOK: EndDialog (hDlg, 0); return (TRUE); } break; } return(FALSE); }