Index: paint/globalvar.h =================================================================== --- paint/globalvar.h (revision 47373) +++ paint/globalvar.h (working copy) @@ -101,3 +101,5 @@ extern POINT pointStack[256]; extern short pointSP; +extern POINT *ptStack; +extern int ptSP; Index: paint/lang/cs-CZ.rc =================================================================== --- paint/lang/cs-CZ.rc (revision 47373) +++ paint/lang/cs-CZ.rc (working copy) @@ -12,8 +12,8 @@ BEGIN POPUP "&Soubor" BEGIN - MENUITEM "Nový\tCtrl+N", IDM_FILENEW - MENUITEM "Otevřít...\tCtrl+O", IDM_FILEOPEN + MENUITEM "&Nový\tCtrl+N", IDM_FILENEW + MENUITEM "&Otevřít...\tCtrl+O", IDM_FILEOPEN MENUITEM "Uložit\tCtrl+S", IDM_FILESAVE MENUITEM "Uložit jako...", IDM_FILESAVEAS MENUITEM SEPARATOR @@ -60,7 +60,7 @@ MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Zobrazit mřížku", IDM_VIEWSHOWGRID + MENUITEM "Zobrazit mřížku\tCtrl+G", IDM_VIEWSHOWGRID MENUITEM "Zobrazit miniaturu", IDM_VIEWSHOWMINIATURE END MENUITEM "Celá obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN Index: paint/registry.c =================================================================== --- paint/registry.c (revision 47373) +++ paint/registry.c (working copy) @@ -14,11 +14,11 @@ /* FUNCTIONS ********************************************************/ void -SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: The pattern (tiled/stretched) is not set +SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: Has to be called 2x to apply the pattern (tiled/stretched) too { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) FileName, SPIF_UPDATEINIFILE); - /*HKEY hDesktop; + HKEY hDesktop; TCHAR szStyle[3], szTile[3]; if ((dwStyle > 2) || (dwTile > 2)) @@ -39,5 +39,5 @@ _tcslen(szTile) * sizeof(TCHAR)); RegCloseKey(hDesktop); - }*/ + } } Index: paint/selection.c =================================================================== --- paint/selection.c (revision 47373) +++ paint/selection.c (working copy) @@ -9,6 +9,8 @@ /* INCLUDES *********************************************************/ #include +#include +#include #include "globalvar.h" #include "drawing.h" #include "history.h" @@ -87,6 +89,7 @@ case WM_MOUSEMOVE: if (moving) { + TCHAR sizeStr[100]; int xDelta; int yDelta; resetToU1(); @@ -147,6 +150,9 @@ break; } + _stprintf(sizeStr, _T("%d x %d"), rectSel_dest[2], rectSel_dest[3]); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); + if (action != 0) StretchBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], hSelDC, 0, 0, GetDIBWidth(hSelBm), GetDIBHeight(hSelBm), SRCCOPY); else @@ -182,6 +188,7 @@ int h = rectSel_dest[3] * zoom / 1000 + 6; xPos = LOWORD(lParam); yPos = HIWORD(lParam); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) NULL); action = identifyCorner(xPos, yPos, w, h); if (action != 0) SetCursor(LoadCursor(NULL, cursors[action])); Index: paint/winproc.c =================================================================== --- paint/winproc.c (revision 47373) +++ paint/winproc.c (working copy) @@ -145,12 +145,18 @@ } BOOL drawing; +TCHAR setwallpaperpath[1000]; LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { + case WM_CREATE: + ptStack = NULL; + ptSP = 0; + break; + case WM_DESTROY: PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; @@ -446,9 +452,7 @@ HDC hdc; GetClientRect(hwndMiniature, (LPRECT) &mclient); hdc = GetDC(hwndMiniature); - BitBlt(hdc, -min(imgXRes * GetScrollPos(hScrollbox, SB_HORZ) / 10000, imgXRes - mclient[2]), - -min(imgYRes * GetScrollPos(hScrollbox, SB_VERT) / 10000, imgYRes - mclient[3]), - imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY); + BitBlt(hdc, 0, 0, imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY); ReleaseDC(hwndMiniature, hdc); } break; @@ -565,6 +569,24 @@ } break; + case WM_KEYDOWN: + if (wParam == VK_ESCAPE) + { + if (!drawing) + { + /* Deselect */ + if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL)) + { + startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + whilePaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + endPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + ShowWindow(hSelection, SW_HIDE); + } + } + /* FIXME: also cancel current drawing underway */ + } + break; + case WM_MOUSEMOVE: if (hwnd == hImageArea) { @@ -640,6 +662,8 @@ if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL)) { TCHAR sizeStr[100]; + if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0)) + yRel = xRel; _stprintf(sizeStr, _T("%d x %d"), xRel, yRel); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); } @@ -651,6 +675,8 @@ if (activeTool >= TOOL_TEXT) { TCHAR sizeStr[100]; + if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0)) + yRel = xRel; _stprintf(sizeStr, _T("%d x %d"), xRel, yRel); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); } @@ -739,14 +765,29 @@ } break; case IDM_FILEASWALLPAPERPLANE: - SetWallpaper(filepathname, 1, 1); + { + ExpandEnvironmentStrings(_T("%APPDATA%\\Microsoft\\Wallpaper1.bmp"), setwallpaperpath, 999); + SaveDIBToFile(hBms[currInd], setwallpaperpath, hDrawingDC, &fileTime, &fileSize, + fileHPPM, fileVPPM); + SetWallpaper(setwallpaperpath, 1, 1); break; + } case IDM_FILEASWALLPAPERCENTERED: - SetWallpaper(filepathname, 1, 0); + { + ExpandEnvironmentStrings(_T("%APPDATA%\\Microsoft\\Wallpaper1.bmp"), setwallpaperpath, 999); + SaveDIBToFile(hBms[currInd], setwallpaperpath, hDrawingDC, &fileTime, &fileSize, + fileHPPM, fileVPPM); + SetWallpaper(setwallpaperpath, 1, 0); break; + } case IDM_FILEASWALLPAPERSTRETCHED: - SetWallpaper(filepathname, 2, 0); + { + ExpandEnvironmentStrings(_T("%APPDATA%\\Microsoft\\Wallpaper1.bmp"), setwallpaperpath, 999); + SaveDIBToFile(hBms[currInd], setwallpaperpath, hDrawingDC, &fileTime, &fileSize, + fileHPPM, fileVPPM); + SetWallpaper(setwallpaperpath, 2, 0); break; + } case IDM_EDITUNDO: undo(); SendMessage(hImageArea, WM_PAINT, 0, 0); @@ -783,7 +824,7 @@ case IDM_EDITDELETESELECTION: { /* remove selection window and already painted content using undo(), - paint Rect for rectangular selections and nothing for freeform selections */ + paint Rect for rectangular selections and Poly for freeform selections */ undo(); if (activeTool == TOOL_RECTSEL) { @@ -791,16 +832,23 @@ Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0], rectSel_dest[3] + rectSel_dest[1], bgColor, bgColor, 0, TRUE); } + if (activeTool == TOOL_FREESEL) + { + newReversible(); + Poly(hDrawingDC, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE); + } break; } case IDM_EDITSELECTALL: - if (activeTool == TOOL_RECTSEL) - { - startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); - whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); - endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); - } + { + HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL); + SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0)); + SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0); + startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); + endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); break; + } case IDM_EDITCOPYTO: if (GetSaveFileName(&ofn) != 0) SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM); @@ -829,24 +877,62 @@ case IDM_IMAGEROTATEMIRROR: switch (mirrorRotateDlg()) { - case 1: + case 1: /* flip horizontally */ newReversible(); - StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, + if (IsWindowVisible(hSelection) && (activeTool == TOOL_RECTSEL)) + { + StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hDrawingDC, + rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], SRCCOPY); + /* force refresh of selection contents, used also in case 2 and case 4 */ + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } break; - case 2: + case 2: /* flip vertically */ newReversible(); - StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0, + if (IsWindowVisible(hSelection) && (activeTool == TOOL_RECTSEL)) + { + StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hDrawingDC, + rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } break; - case 4: + case 3: /* rotate 90 degrees */ + break; + case 4: /* rotate 180 degrees */ newReversible(); - StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC, + if (IsWindowVisible(hSelection) && (activeTool == TOOL_RECTSEL)) + { + StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hDrawingDC, + rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC, 0, 0, imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } break; + case 5: /* rotate 270 degrees */ + break; } break; case IDM_IMAGEATTRIBUTES: @@ -895,6 +981,7 @@ case IDM_VIEWSHOWGRID: showGrid = !showGrid; + SendMessage(hImageArea, WM_PAINT, 0, 0); break; case IDM_VIEWSHOWMINIATURE: showMiniature = !showMiniature;