/*[]=====================================================================[]*/ /*[] 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 "TCHAR.h" #include "../../../include/l_bitmap.h" #include "../../../include/l_error.h" #include "fpxdemo.h" static VOID Child_OnPaint (HWND hWnd); static BOOL Child_OnCreate (HWND hWnd, CREATESTRUCT FAR * lpCreateStruct); static BOOL Child_OnEraseBkgnd (HWND hWnd, HDC hDC); static VOID Child_OnSize (HWND hWnd, UINT nState, int nCx, int nCy); static VOID Child_OnHScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos); static VOID Child_OnVScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos); static VOID Child_OnCommand (HWND hWnd, int id, HWND hwndCtl, UINT codeNotify); static VOID Child_OnMDIActivate (HWND hWnd, BOOL fActive, HWND hWndActivate, HWND hWndDeactivate); static VOID Child_OnPaletteChanged (HWND hWnd, HWND hWndPaletteChange); static BOOL Child_OnQueryNewPalette (HWND hWnd); static VOID Child_OnDestroy (HWND hWnd); static VOID Child_ProcessSize (HWND hWnd, UINT nState, L_INT nCx, L_INT nCy); static L_VOID MatchAspectRatio (LPRECT pRect, L_INT nWidth, L_INT nHeight); static L_VOID SetZoomFactor (HWND hWnd, L_INT nZoom); static L_VOID BitmapSizeChange (HWND hWnd, L_BOOL bDoPaint); static L_VOID SaveBitmap(HWND hWnd); static SAVEPARM SaveParm = { TEXT(""), FALSE, 2, 1, -1, 0 }; static L_BOOL fInScroll = FALSE; /*====(ChildWindowProc)==================================================== Description: Processes child window messages. Syntax : LRESULT CALLBACK L_EXPORT ChildWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. Msg Message to be processed. wParam First message parameter. lParam Second message parameter. Return Value: Depends on the message. ==========================================================================*/ LRESULT CALLBACK L_EXPORT ChildWindowProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { HANDLE_MSG (hWnd, WM_VSCROLL, Child_OnVScroll); HANDLE_MSG (hWnd, WM_HSCROLL, Child_OnHScroll); HANDLE_MSG (hWnd, WM_SIZE, Child_OnSize); HANDLE_MSG (hWnd, WM_ERASEBKGND, Child_OnEraseBkgnd); HANDLE_MSG (hWnd, WM_CREATE, Child_OnCreate); HANDLE_MSG (hWnd, WM_COMMAND, Child_OnCommand); HANDLE_MSG (hWnd, WM_PAINT, Child_OnPaint); HANDLE_MSG (hWnd, WM_DESTROY, Child_OnDestroy); HANDLE_MSG (hWnd, WM_PALETTECHANGED, Child_OnPaletteChanged); HANDLE_MSG (hWnd, WM_QUERYNEWPALETTE, Child_OnQueryNewPalette); HANDLE_MSG (hWnd, WM_MDIACTIVATE, Child_OnMDIActivate); } return(DefMDIChildProc (hWnd, Msg, wParam, lParam)); } /*====(Child_OnPaint)====================================================== Description: Paints the child window. Syntax : VOID Child_OnPaint(HWND hWnd) Parameters : hWnd Handle of the child window. Return Value: None. ==========================================================================*/ static VOID Child_OnPaint (HWND hWnd) { PAINTSTRUCT ps; HPALETTE hPalette = NULL; LPCHILDDATA pData; L_UINT32 ulFlags; BeginPaint (hWnd, &ps); pData = LOCKCHILDDATA (hWnd); if (pData->ActiveBitmap.Flags.Allocated) { if (pData->hPalette) { hPalette = SelectPalette (ps.hdc, pData->hPalette, TRUE); RealizePalette(ps.hdc); } ulFlags = L_GetDisplayMode (); switch (nDitherMode) { case IDM_PREFERENCES_DITHERING_ORDERED: L_SetDisplayMode (DISPLAYMODE_ORDEREDDITHER, DISPLAYMODE_ORDEREDDITHER); break; case IDM_PREFERENCES_DITHERING_ERROR_DIFFUSION: L_SetDisplayMode (DISPLAYMODE_ORDEREDDITHER, 0); break; } switch (nBitonalMode) { case IDM_PREFERENCES_BITONAL_SCALING_NORMAL: break; case IDM_PREFERENCES_BITONAL_SCALING_FAVOR_BLACK: L_SetDisplayMode (DISPLAYMODE_FAVORBLACK, DISPLAYMODE_FAVORBLACK); break; case IDM_PREFERENCES_BITONAL_SCALING_SCALE_TO_GRAY: L_SetDisplayMode (DISPLAYMODE_SCALETOGRAY, DISPLAYMODE_SCALETOGRAY); break; } if(nPaletteMode == IDM_PREFERENCES_PALETTE_FIXED) L_SetDisplayMode (DISPLAYMODE_FIXEDPALETTE, DISPLAYMODE_FIXEDPALETTE); if(fNetscapePalette) L_SetDisplayMode (DISPLAYMODE_NETSCAPEPALETTE, DISPLAYMODE_NETSCAPEPALETTE); L_PaintDC (ps.hdc, &pData->ActiveBitmap, NULL, NULL, &pData->rcView, &ps.rcPaint, SRCCOPY ); L_SetDisplayMode (DISPLAYMODE_RESETPOSITIONS, ulFlags); if (pData->hPalette) SelectPalette (ps.hdc, hPalette, TRUE); } UNLOCKCHILDDATA (hWnd); EndPaint (hWnd, &ps); return; } typedef struct _SETDUPTITLECOUNTSTRUCT { L_BOOL fRemove; HWND hWnd; L_UINT uCountLast; HWND hWndLast; } SETDUPTITLECOUNTSTRUCT, L_FAR *LPSETDUPTITLECOUNTSTRUCT; L_BOOL CALLBACK L_EXPORT SetDupTitleCountCB (HWND hWnd, LPARAM lParam) { LPCHILDDATA pData1; LPCHILDDATA pData2; LPSETDUPTITLECOUNTSTRUCT pdts = (LPSETDUPTITLECOUNTSTRUCT) lParam; if (GetWindow (hWnd, GW_OWNER)) return(TRUE); if(hWnd == pdts->hWnd) return(TRUE); pData1 = LOCKCHILDDATA(pdts->hWnd); pData2 = LOCKCHILDDATA(hWnd); if(!_tcsicmp(pData1->szTitle, pData2->szTitle)) { if(pdts->fRemove) { if(pData2->uTitleCount > pData1->uTitleCount) { pData2->uTitleCount--; DisplayImageTitle (hWnd); } if(pData2->uTitleCount > pdts->uCountLast) { pdts->uCountLast = pData2->uTitleCount; pdts->hWndLast = hWnd; } } else { pdts->uCountLast++; pdts->hWndLast = hWnd; } } UNLOCKCHILDDATA(hWnd); UNLOCKCHILDDATA(pdts->hWnd); return(TRUE); } static L_VOID SetDupTitleCount(HWND hWnd, L_BOOL fRemove) { LPCHILDDATA pData; SETDUPTITLECOUNTSTRUCT dts; FARPROC lpfn; dts.hWnd = hWnd; dts.fRemove = fRemove; dts.uCountLast = 0; dts.hWndLast = NULL; lpfn = MakeProcInstance((FARPROC) SetDupTitleCountCB, hInst); EnumChildWindows(hWndClient, (WNDENUMPROC) lpfn, (LPARAM) (LPSETDUPTITLECOUNTSTRUCT) &dts); FreeProcInstance(lpfn); if(fRemove) { if(dts.uCountLast == 1) { pData = LOCKCHILDDATA(dts.hWndLast); pData->uTitleCount = 0; DisplayImageTitle (dts.hWndLast); UNLOCKCHILDDATA(dts.hWndLast); } } else { if(dts.uCountLast) { if(dts.uCountLast == 1) { pData = LOCKCHILDDATA(dts.hWndLast); pData->uTitleCount = dts.uCountLast; DisplayImageTitle (dts.hWndLast); UNLOCKCHILDDATA(dts.hWndLast); } pData = LOCKCHILDDATA(hWnd); pData->uTitleCount = dts.uCountLast + 1; DisplayImageTitle (hWnd); UNLOCKCHILDDATA(hWnd); } else { pData = LOCKCHILDDATA(hWnd); pData->uTitleCount = 0; DisplayImageTitle (hWnd); UNLOCKCHILDDATA(hWnd); } } } /*====(Child_OnCreate)===================================================== Description: Creates an MDI child window. The image can come from a file or the clipboard. Syntax : BOOL Child_OnCreate(HWND hWnd, CREATESTRUCT FAR* lpCreateStruct) Parameters : hWnd Handle of a window. lpCreateStruct Pointer to CREATESTRUCT Return Value: TRUE The function was successful. FALSE The function was not successful. ==========================================================================*/ static BOOL Child_OnCreate (HWND hWnd, CREATESTRUCT FAR * lpCreateStruct) { HANDLE hMem; LPCREATEDATA pCreateData; LPCHILDDATA pData; RECT rc; pCreateData = (LPCREATEDATA) CHILDCREATELPARAM (lpCreateStruct); hMem = GlobalAlloc (GHND, sizeof (CHILDDATA)); SETCHILDDATA (hWnd, hMem); if(!hMem) return(FALSE); pData = LOCKCHILDDATA (hWnd); lstrcpy (pData->szTitle, pCreateData->pszTitle); SetDupTitleCount(hWnd, FALSE); lstrcpy (pData->szFile, pCreateData->pszFile); memcpy (&pData->OriginalTransforms, pCreateData->pTransforms, sizeof(FILETRANSFORMS)); memcpy (&pData->WorkingTransforms, pCreateData->pTransforms, sizeof(FILETRANSFORMS)); pData->Bitmap = *pCreateData->pBitmap; pData->ActiveBitmap = pData->Bitmap; GetClientRect(hWnd, &rc); pData->nZoom = max(1, min(100, (L_INT) min((L_INT32) RECTWIDTH(&rc) * 100 / BITMAPWIDTH(&pData->ActiveBitmap), (L_INT32) RECTHEIGHT(&rc) * 100 / BITMAPHEIGHT(&pData->ActiveBitmap)))); UNLOCKCHILDDATA(hWnd); return(TRUE); } /*====(Child_OnEraseBkgnd)================================================= Description: Erases the background of a child window. Syntax : BOOL Child_OnEraseBkgnd(HWND hWnd, HDC hDC) Parameters : hWnd Handle to the child window. hDC Handle to the device context. Return Value: TRUE The function was successful. ==========================================================================*/ static BOOL Child_OnEraseBkgnd (HWND hWnd, HDC hDC) { HGDIOBJ hBrush; HRGN hClientRgn, hFillRgn; RECT rcView, rcClient; LPCHILDDATA pData; pData = LOCKCHILDDATA (hWnd); if (IsIconic (hWnd)) hBrush = GetStockObject (BLACK_BRUSH); else hBrush = GETHBRBACKGROUND (hWnd); GetClientRect (hWnd, &rcClient); if (fInScroll) { IntersectRect (&rcView, &pData->rcView, &rcClient); hClientRgn = CreateRectRgnIndirect (&rcClient); hFillRgn = CreateRectRgnIndirect (&rcView); CombineRgn (hFillRgn, hClientRgn, hFillRgn, RGN_DIFF); FillRgn (hDC, hFillRgn, hBrush); DeleteObject (hFillRgn); DeleteObject (hClientRgn); } else { FillRect (hDC, &rcClient, hBrush); } UNLOCKCHILDDATA (hWnd); return(TRUE); } /*====(Child_OnSize)======================================================= Description: Responds to WM_SIZE message and sets the internal data accordingly. Also forwards the message to DefMDIChildProc. Syntax : VOID Child_OnSize(HWND hWnd, UINT nState, int nCx, int nCy) Parameters : hWnd Handle to the child window. nState State of resizing requested. nCx Size to be used for the "x" direction. nCy Size to be used for the "y" direction. Return Value: None. ==========================================================================*/ static VOID Child_OnSize (HWND hWnd, UINT nState, int nCx, int nCy) { LPCHILDDATA pData; pData = LOCKCHILDDATA (hWnd); Child_ProcessSize (hWnd, nState, nCx, nCy); DefMDIChildProc (hWnd, WM_SIZE, (WPARAM) nState, MAKELPARAM (nCy, nCx)); UNLOCKCHILDDATA (hWnd); return; } /*====(Child_OnHScroll)==================================================== Description: Scrolls the child window horizontally. Syntax : VOID Child_OnHScroll(HWND hWnd, HWND hWndCtl, UINT nCode, int npos) Parameters : hWnd Handle of a window. hWndCtl Not used. nCode Amount/Direction to be scrolled. npos The new position of the thumb. Return Value: None. ==========================================================================*/ static VOID Child_OnHScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int nPos) { LPCHILDDATA pData; L_INT nScrollInc; UNREFERENCED_PARAMETER(hWndCtl); pData = LOCKCHILDDATA (hWnd); fInScroll = TRUE; switch (nCode) { case SB_LEFT: nScrollInc = -pData->nHScrollPos; break; case SB_RIGHT: nScrollInc = pData->nHScrollMax - pData->nHScrollPos; break; case SB_LINELEFT: nScrollInc = -pData->nHScrollStep; break; case SB_LINERIGHT: nScrollInc = pData->nHScrollStep; break; case SB_PAGELEFT: nScrollInc = -max (pData->nHScrollStep, (pData->cxClient - pData->nHScrollStep)); break; case SB_PAGERIGHT: nScrollInc = max (pData->nHScrollStep, (pData->cxClient - pData->nHScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = nPos - pData->nHScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max (-pData->nHScrollPos, min (nScrollInc, (pData->nHScrollMax - pData->nHScrollPos))); if(nScrollInc) { pData->nHScrollPos += nScrollInc; OffsetRect (&pData->rcView, -nScrollInc, 0); ScrollWindow (hWnd, -nScrollInc, 0, NULL, NULL); SetScrollPos (hWnd, SB_HORZ, pData->nHScrollPos, TRUE); UpdateWindow (hWnd); } UNLOCKCHILDDATA (hWnd); fInScroll = FALSE; return; } /*====(Child_OnVScroll)==================================================== Description: Scrolls the child window vertically. Syntax : VOID Child_OnVScroll(HWND hWnd, HWND hWndCtl, UINT nCode, int nPos) Parameters : hWnd Handle of a window. hWndCtl Not used. nCode Amount/Direction to be scrolled. npos The new position of the thumb. Return Value: None. ==========================================================================*/ static VOID Child_OnVScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int nPos) { L_INT nScrollInc; LPCHILDDATA pData; UNREFERENCED_PARAMETER(hWndCtl); fInScroll = TRUE; pData = LOCKCHILDDATA (hWnd); switch (nCode) { case SB_BOTTOM: nScrollInc = pData->nVScrollMax - pData->nVScrollPos; break; case SB_TOP: nScrollInc = -pData->nVScrollPos; break; case SB_LINEDOWN: nScrollInc = pData->nVScrollStep; break; case SB_LINEUP: nScrollInc = -pData->nVScrollStep; break; case SB_PAGEDOWN: nScrollInc = max (pData->nVScrollStep, (pData->cyClient - pData->nVScrollStep)); break; case SB_PAGEUP: nScrollInc = -max (pData->nVScrollStep, (pData->cyClient - pData->nVScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = nPos - pData->nVScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max (-pData->nVScrollPos, min (nScrollInc, (pData->nVScrollMax - pData->nVScrollPos))); if(nScrollInc) { pData->nVScrollPos += nScrollInc; OffsetRect (&pData->rcView, 0, -nScrollInc); ScrollWindow (hWnd, 0, -nScrollInc, NULL, NULL); SetScrollPos (hWnd, SB_VERT, pData->nVScrollPos, TRUE); UpdateWindow (hWnd); } UNLOCKCHILDDATA (hWnd); fInScroll = FALSE; return; } /*====(Child_OnCommand)==================================================== Description: Processes the WM_COMMAND for a child window. Syntax : VOID Child_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) Parameters : hWnd Handle to the child window. id Value of the command to be processed. hWndCtl Not used. codeNotify Not used. Return Value: None. ==========================================================================*/ static VOID Child_OnCommand (HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) { LPCHILDDATA pData; L_INT nValue; UNREFERENCED_PARAMETER(codeNotify); UNREFERENCED_PARAMETER(hWndCtl); switch (id) { case IDM_FILE_SAVEAS: SaveBitmap(hWnd); break; case IDM_VIEW_NORMAL: pData = LOCKCHILDDATA (hWnd); pData->fFitImage = FALSE; SetZoomFactor (hWnd, 100); BitmapSizeChange (hWnd, TRUE); UNLOCKCHILDDATA (hWnd); break; case IDM_VIEW_SNAP_WINDOW_TO_IMAGE: pData = LOCKCHILDDATA (hWnd); SizeClientRect (hWnd, MulDiv(BITMAPWIDTH(&pData->ActiveBitmap), pData->nZoom, 100), MulDiv(BITMAPHEIGHT(&pData->ActiveBitmap), pData->nZoom, 100), TRUE); UNLOCKCHILDDATA (hWnd); break; case IDM_VIEW_FIT_IMAGE_TO_WINDOW: pData = LOCKCHILDDATA (hWnd); pData->fFitImage = TRUE; pData->nZoom = 100; BitmapSizeChange (hWnd, TRUE); UNLOCKCHILDDATA (hWnd); break; case IDM_VIEW_ZOOM: pData = LOCKCHILDDATA (hWnd); if ((nValue = GetZoomFactor (hWnd, pData->nZoom)) > 0) { pData->fFitImage = FALSE; SetZoomFactor (hWnd, nValue); BitmapSizeChange (hWnd, TRUE); } UNLOCKCHILDDATA (hWnd); break; case IDM_INFORMATION_SUMMARY_INFORMATION: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXSUMMARYINFORMATION); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_FILE_SOURCE_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXFILESOURCEGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_INTELLECTUAL_PROPERTY_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXINTELLECTUALPROPERTYGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_CONTENT_DESCRIPTION_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXCONTENTDESCRIPTIONGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_CAMERA_INFORMATION_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXCAMERAINFORMATIONGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_PER_PICTURE_CAMERA_SETTINGS_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXPERPICTURECAMERASETTINGSGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_DIGITAL_CAMERA_CHARACTERIZATION_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXDIGITALCAMERACHARACTERIZATIONGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_FILM_DESCRIPTION_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXFILMDESCRIPTIONGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_ORIGINAL_DOCUMENT_SCAN_DESCRIPTION_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXORIGINALDOCUMENTSCANDESCRIPTIONGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_INFORMATION_SCAN_DEVICE_PROPERTY_GROUP: pData = LOCKCHILDDATA(hWnd); DisplayComments(hWnd, pData->szFile, pData->nPage, CMNT_FPXSCANDEVICEPROPERTYGROUP); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_ROTATION: pData = LOCKCHILDDATA(hWnd); RotationTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SHEAR_HORIZONTAL: pData = LOCKCHILDDATA(hWnd); ShearHorizontalTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SHEAR_VERTICAL: pData = LOCKCHILDDATA(hWnd); ShearVerticalTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_FLIP_HORIZONTAL: pData = LOCKCHILDDATA(hWnd); FlipHorizontalTransform(hWnd, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_FLIP_VERTICAL: pData = LOCKCHILDDATA(hWnd); FlipVerticalTransform(hWnd, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SCALING: pData = LOCKCHILDDATA(hWnd); ScalingTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_RESTORE_ORIGINAL_VIEWING_TRANSFORMS: pData = LOCKCHILDDATA(hWnd); RestoreOriginalViewingTransforms(&pData->OriginalTransforms, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_IGNORE_VIEWING_TRANSFORMS: pData = LOCKCHILDDATA(hWnd); IgnoreViewingTransforms(&pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_LIGHTEN: pData = LOCKCHILDDATA(hWnd); LightenTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SATURATION: pData = LOCKCHILDDATA(hWnd); SaturationTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_RED_BALANCE: pData = LOCKCHILDDATA(hWnd); RedBalanceTransform(hWnd, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_GREEN_BALANCE: pData = LOCKCHILDDATA(hWnd); GreenBalanceTransform(hWnd, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_BLUE_BALANCE: pData = LOCKCHILDDATA(hWnd); BlueBalanceTransform(hWnd, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_CONTRAST: pData = LOCKCHILDDATA(hWnd); ContrastTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA (hWnd); break; case IDM_TRANSFORMS_SHARPNESS: pData = LOCKCHILDDATA(hWnd); SharpnessTransform(hWnd, &pData->ActiveBitmap, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_RESTORE_ORIGINAL_COLOR_TRANSFORMS: pData = LOCKCHILDDATA(hWnd); RestoreOriginalColorTransforms(&pData->OriginalTransforms, &pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_IGNORE_COLOR_TRANSFORMS: pData = LOCKCHILDDATA(hWnd); IgnoreColorTransforms(&pData->WorkingTransforms); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SAVE_TRANSFORMS_FALSE: pData = LOCKCHILDDATA(hWnd); ReLoadBitmap(pData->szFile, pData->nPage, &pData->WorkingTransforms, &pData->ActiveBitmap, FALSE); BitmapSizeChange(hWnd, TRUE); UNLOCKCHILDDATA(hWnd); break; case IDM_TRANSFORMS_SAVE_TRANSFORMS_TRUE: pData = LOCKCHILDDATA(hWnd); ReLoadBitmap(pData->szFile, pData->nPage, &pData->WorkingTransforms, &pData->ActiveBitmap, TRUE); BitmapSizeChange(hWnd, TRUE); UNLOCKCHILDDATA(hWnd); break; } return; } /*====(Child_OnMDIActivate)================================================ Description: Informs the child window it is going to receive the focus. Syntax : VOID Child_OnMDIActivate(HWND hWnd, BOOL fActive, HWND hWndActivate, HWND hWndDeactivate) Parameters : hWnd Handle of a window. fActive Truth of "Is the window active". hWndActivate Handle to the window to be activated. hWndDeactivate Handle to the window to be deactivated. Return Value: None. ==========================================================================*/ static VOID Child_OnMDIActivate (HWND hWnd, BOOL fActive, HWND hWndActivate, HWND hWndDeactivate) { UNREFERENCED_PARAMETER(hWndDeactivate); if(fActive) { FORWARD_WM_QUERYNEWPALETTE (hWnd, SendMessage); SetFocus(hWnd); } return; } /*====(Child_OnPaletteChanged)============================================== Description: Processes WM_PALETTECHANGED message for a child window. Syntax : VOID Child_OnPaletteChanged(HWND hWnd, HWND hWndPaletteChange) Parameters : hWnd Handle of a window. hWndPaletteChange Handle of the window that has the palette realized. Return Value: None. ==========================================================================*/ static VOID Child_OnPaletteChanged (HWND hWnd, HWND hWndPaletteChange) { HDC hDC; HPALETTE hPalette; LPCHILDDATA pData; if (hWnd == hWndPaletteChange) return; pData = LOCKCHILDDATA (hWnd); if (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } hDC = GetDC (hWnd); pData->hPalette = L_CreatePaintPalette (hDC, &pData->ActiveBitmap); hPalette = SelectPalette (hDC, pData->hPalette, TRUE); RealizePalette (hDC); InvalidateRect (hWnd, NULL, FALSE); SelectPalette (hDC, hPalette, TRUE); ReleaseDC (hWnd, hDC); UNLOCKCHILDDATA (hWnd); return; } /*====(Child_OnQueryNewPalette)============================================ Description: Processes WM_QUERYNEWPALETTE message for a child window. Syntax : BOOL Child_OnQueryNewPalette(HWND hWnd) Parameters : hWnd Handle of a window. Return Value: nNoColors Number of colors changed in the palette. ==========================================================================*/ static BOOL Child_OnQueryNewPalette (HWND hWnd) { HDC hDC; HPALETTE hPalette; L_INT nNoColors = 0; LPCHILDDATA pData; L_UINT32 ulFlags; pData = LOCKCHILDDATA (hWnd); if (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } if (pData->ActiveBitmap.Flags.Allocated) { hDC = GetDC (hWndFrame); ulFlags = L_GetDisplayMode (); if (nBitonalMode == IDM_PREFERENCES_BITONAL_SCALING_SCALE_TO_GRAY) L_SetDisplayMode (DISPLAYMODE_SCALETOGRAY, DISPLAYMODE_SCALETOGRAY); if(nPaletteMode == IDM_PREFERENCES_PALETTE_FIXED) L_SetDisplayMode (DISPLAYMODE_FIXEDPALETTE, DISPLAYMODE_FIXEDPALETTE); if(fNetscapePalette) L_SetDisplayMode (DISPLAYMODE_NETSCAPEPALETTE, DISPLAYMODE_NETSCAPEPALETTE); pData->hPalette = L_CreatePaintPalette (hDC, &pData->ActiveBitmap); if(pData->hPalette) { hPalette = SelectPalette (hDC, pData->hPalette, FALSE); nNoColors = RealizePalette (hDC); if (nNoColors) InvalidateRect (hWnd, NULL, FALSE); SelectPalette (hDC, hPalette, TRUE); } L_SetDisplayMode (DISPLAYMODE_RESETPOSITIONS, ulFlags); ReleaseDC (hWndFrame, hDC); } UNLOCKCHILDDATA (hWnd); return(nNoColors); } /*====(Child_OnDestroy)==================================================== Description: Performs cleanup for the child window. Syntax : VOID Child_OnDestroy(HWND hWnd) Parameters : hWnd Handle of a window. Return Value: None. ==========================================================================*/ static VOID Child_OnDestroy (HWND hWnd) { LPCHILDDATA pData = LOCKCHILDDATA (hWnd); if(pData) { SetDupTitleCount(hWnd, TRUE); if (pData->hPalette) { DeleteObject (pData->hPalette); } if (pData->Bitmap.Flags.Allocated) { L_FreeBitmap (&pData->Bitmap); } GlobalFreePtr (pData); } return; } /*====(Child_ProcessSize)=================================================== Description: Responds to WM_SIZE message and sets the internal data accordingly. Syntax : VOID Child_ProcessSize(HWND hWnd, UINT nState, L_INT nCx, L_INT nCy) Parameters : hWnd Handle to the child window. nState State of resizing requested. nCx Size to be used for the "x" direction. nCy Size to be used for the "y" direction. Return Value: None. ==========================================================================*/ static VOID Child_ProcessSize (HWND hWnd, UINT nState, L_INT nCx, L_INT nCy) { static L_BOOL fSizeInUse = FALSE; L_INT nWidth, nHeight, nVScroll, nHScroll; DWORD dwStyle; LPCHILDDATA pData; if (!fSizeInUse) { fSizeInUse = TRUE; pData = LOCKCHILDDATA (hWnd); if (nState != SIZEICONIC) { if (pData->fFitImage) { nWidth = 0; nHeight = 0; } else { nWidth = MulDiv (BITMAPWIDTH(&pData->ActiveBitmap), pData->nZoom, 100); nHeight = MulDiv (BITMAPHEIGHT(&pData->ActiveBitmap), pData->nZoom, 100); } pData->cxClient = nCx; pData->cyClient = nCy; dwStyle = GetWindowLong (hWnd, GWL_STYLE); nVScroll = GetSystemMetrics (SM_CXVSCROLL) - GetSystemMetrics(SM_CXBORDER); nHScroll = GetSystemMetrics (SM_CYHSCROLL) - GetSystemMetrics(SM_CYBORDER); if (WS_VSCROLL & dwStyle) pData->cxClient += nVScroll; if (WS_HSCROLL & dwStyle) pData->cyClient += nHScroll; if (pData->cxClient < nWidth) { pData->cyClient -= nHScroll; if (pData->cyClient < nHeight) pData->cxClient -= nVScroll; } else if (pData->cyClient < nHeight) { pData->cxClient -= nVScroll; if (pData->cxClient < nWidth) pData->cyClient -= nHScroll; } pData->nHScrollStep = max (1, pData->cxClient / SCROLL_RATIO); pData->nVScrollStep = max (1, pData->cyClient / SCROLL_RATIO); pData->nVScrollMax = max (0, (nHeight - pData->cyClient /*- 1*/)); pData->nVScrollPos = max (0, min (pData->nVScrollPos, pData->nVScrollMax)); pData->nHScrollMax = max (0, (nWidth - pData->cxClient /*- 1*/)); pData->nHScrollPos = max (0, min (pData->nHScrollPos, pData->nHScrollMax)); if (pData->fFitImage) { SetRect (&pData->rcView, 0, 0, pData->cxClient, pData->cyClient); MatchAspectRatio (&pData->rcView, BITMAPWIDTH(&pData->ActiveBitmap), BITMAPHEIGHT(&pData->ActiveBitmap)); } else { SetRect (&pData->rcView, 0, 0, nWidth, nHeight); OffsetRect (&pData->rcView, -pData->nHScrollPos, -pData->nVScrollPos); } SetScrollRange (hWnd, SB_HORZ, 0, pData->nHScrollMax, FALSE); SetScrollPos (hWnd, SB_HORZ, pData->nHScrollPos, TRUE); SetScrollRange (hWnd, SB_VERT, 0, pData->nVScrollMax, FALSE); SetScrollPos (hWnd, SB_VERT, pData->nVScrollPos, TRUE); } else { pData->cxClient = nCx; pData->cyClient = nCy; SetRect (&pData->rcView, 0, 0, pData->cxClient, pData->cyClient); MatchAspectRatio (&pData->rcView, BITMAPWIDTH(&pData->ActiveBitmap), BITMAPHEIGHT(&pData->ActiveBitmap)); } UNLOCKCHILDDATA (hWnd); fSizeInUse = FALSE; } return; } /*====(MatchAspectRatio)===================================================== Description: Reduces a given rectangle to match a given aspect ratio. Syntax : L_VOID MatchAspectRatio(LPRECT pRect, L_INT nWidth, L_INT nHeight) Parameters : pRect Pointer to rectangle to scale. nWidth Aspect width. nHeight Aspect height. Return Value: None. ==========================================================================*/ static L_VOID MatchAspectRatio (LPRECT pRect, L_INT nWidth, L_INT nHeight) { L_INT cxRect, cyRect; cyRect = RECTHEIGHT (pRect); cxRect = MulDiv (cyRect, nWidth, nHeight); if (cxRect > RECTWIDTH (pRect)) { cxRect = RECTWIDTH (pRect); cyRect = MulDiv (cxRect, nHeight, nWidth); } pRect->bottom = pRect->top + cyRect; pRect->right = pRect->left + cxRect; return; } /*====(SetZoomFactor)===================================================== Description: Sets the scale of the image. Syntax : L_VOID SetZoomFactor (HWND hWnd, L_INT nZoom) Parameters : hWnd Handle of a window. nZoom Scalar to use for resizing. Return Value: None. ==========================================================================*/ static L_VOID SetZoomFactor (HWND hWnd, L_INT nZoom) { DWORD dwStyle; L_INT nHScroll, nVScroll; L_INT nHeight, nWidth; RECT rcClient; L_INT cxClient, cyClient; LPCHILDDATA pData; L_INT x, y; pData = LOCKCHILDDATA (hWnd); GetClientRect (hWnd, &rcClient); cxClient = RECTWIDTH (&rcClient); cyClient = RECTHEIGHT (&rcClient); x = cxClient / 2; y = cyClient / 2; nWidth = MulDiv (BITMAPWIDTH(&pData->ActiveBitmap), nZoom, 100); nHeight = MulDiv (BITMAPHEIGHT(&pData->ActiveBitmap), nZoom, 100); dwStyle = GetWindowLong (hWnd, GWL_STYLE); nVScroll = GetSystemMetrics (SM_CXVSCROLL) - GetSystemMetrics(SM_CXBORDER); nHScroll = GetSystemMetrics (SM_CYHSCROLL) - GetSystemMetrics(SM_CYBORDER); if (dwStyle & WS_VSCROLL) cxClient += nVScroll; if (dwStyle & WS_HSCROLL) cyClient += nHScroll; if (cxClient < nWidth) { cyClient -= nHScroll; if (cyClient < nHeight) cxClient -= nVScroll; } else if (cyClient < nHeight) { cxClient -= nVScroll; if (cxClient < nWidth) cyClient -= nHScroll; } pData->nVScrollMax = max (0, (L_INT) nHeight - (L_INT) cyClient /*- 1*/); pData->nHScrollMax = max (0, (L_INT) nWidth - (L_INT) cxClient /*- 1*/); pData->nVScrollStep = max (1, cyClient / SCROLL_RATIO); pData->nHScrollStep = max (1, cxClient / SCROLL_RATIO); if(RECTWIDTH(&pData->rcView)) pData->nHScrollPos = (L_INT) ((L_INT32) (x - pData->rcView.left) * nWidth / RECTWIDTH(&pData->rcView)) - (cxClient / 2); if(RECTHEIGHT(&pData->rcView)) pData->nVScrollPos = (L_INT) ((L_INT32) (y - pData->rcView.top) * nHeight / RECTHEIGHT(&pData->rcView)) - (cyClient / 2); pData->nVScrollPos = max (0, min (pData->nVScrollPos, pData->nVScrollMax)); pData->nHScrollPos = max (0, min (pData->nHScrollPos, pData->nHScrollMax)); pData->nZoom = nZoom; UNLOCKCHILDDATA (hWnd); return; } /*====(BitmapSizeChange)=================================================== Description: Determines the use of scroll bars when the image size changed. Syntax : L_VOID BitmapSizeChange(HWND hWnd, L_BOOL bDoPaint) Parameters : hWnd Handle of a window. bDoPaint Boolean for "should we paint?". Return Value: None. ==========================================================================*/ static L_VOID BitmapSizeChange (HWND hWnd, L_BOOL bDoPaint) { RECT rcClient; if (bDoPaint) InvalidateRect (hWnd, NULL, TRUE); GetClientRect (hWnd, &rcClient); Child_ProcessSize (hWnd, IsIconic (hWnd) ? SIZEICONIC : SIZENORMAL, RECTWIDTH (&rcClient), RECTHEIGHT (&rcClient)); return; } L_VOID GetChildTitle(HWND hWnd, LPTSTR pszTitle) { LPCHILDDATA pData; pData = LOCKCHILDDATA (hWnd); if(pData->uTitleCount) { wsprintf(pszTitle, TEXT("%s:%d"), pData->szTitle, pData->uTitleCount); } else lstrcpy(pszTitle, pData->szTitle); UNLOCKCHILDDATA (hWnd); return; } /*====(DisplayImageTitle)================================================== Description: Displays the title of the image. Syntax : L_VOID DisplayImageTitle(HWND hWnd) Prototype : fpxdemo.h Parameters : hWnd Handle of a window. Return Value: None. ==========================================================================*/ L_VOID DisplayImageTitle (HWND hWnd) { L_TCHAR szTitle[_MAX_PATH]; LPCHILDDATA pData; pData = LOCKCHILDDATA (hWnd); GetChildTitle(hWnd, szTitle); SetWindowText (hWnd, szTitle); UNLOCKCHILDDATA (hWnd); return; } /*====(SaveBitmap)========================================================= Description: Save the image to file. Syntax : L_VOID SaveBitmap(HWND hWnd) Parameters : hWnd Handle of a window. Return Value: None. ==========================================================================*/ static L_VOID SaveBitmap(HWND hWnd) { LPCHILDDATA pData; HCURSOR hCursor; L_INT nRet; L_INT nSaveFormat; pData = LOCKCHILDDATA(hWnd); if (GetSaveParm (hWndFrame, TEXT("Save File"), &SaveParm)) { hCursor = SetCursor (LoadCursor (NULL, IDC_WAIT)); L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SaveFileOption.PageNumber = SaveParm.fAppend ? 2 : 1; SaveFileOption.Passes = 0; SaveFileOption.Flags = 0; nSaveFormat = aSFile[SaveParm.nTypeIdx].nFormat; /* if format has SubType, setup variables for Save */ switch (aSFile[SaveParm.nTypeIdx].nFormat) { case FILE_FPX_ALL: /* 8-bit or 24-bit FPX */ switch (SaveParm.nSubTypeIdx) /* what is the subtype? */ { case SUB_FPX - 1: nSaveFormat = FILE_FPX_JPEG_QFACTOR; break; case SUB_FPX - 2: nSaveFormat = FILE_FPX_JPEG; break; case SUB_FPX - 3: nSaveFormat = FILE_FPX_SINGLE_COLOR; break; case SUB_FPX - 4: nSaveFormat = FILE_FPX; break; } break; } nRet = L_SaveBitmap (SaveParm.szFile, &pData->ActiveBitmap, nSaveFormat, aSFile[SaveParm.nTypeIdx].nBitsPerPixel, SaveParm.nQFactor, &SaveFileOption); SetCursor (hCursor); if (nRet != SUCCESS) L_FileError (hWndFrame, nRet, (LPTSTR) "Save File", SaveParm.szFile); } UNLOCKCHILDDATA(hWnd); return; }