- apply patch by Black_Fox (see bug 5434)
- fix minor bugs introduced by it
- generalize changes related to mirroring rectangular selections to free form selections
- solve problem regarding selection contents update

svn path=/trunk/; revision=49089
This commit is contained in:
Benedikt Freisen 2010-10-10 09:57:44 +00:00
parent 4ab377fc5e
commit 47bd0d25ed
6 changed files with 131 additions and 31 deletions

View file

@ -101,3 +101,5 @@ extern HWND hSizeboxRightBottom;
extern POINT pointStack[256]; extern POINT pointStack[256];
extern short pointSP; extern short pointSP;
extern POINT *ptStack;
extern int ptSP;

View file

@ -12,8 +12,8 @@ ID_MENU MENU
BEGIN BEGIN
POPUP "&Soubor" POPUP "&Soubor"
BEGIN BEGIN
MENUITEM "Nový\tCtrl+N", IDM_FILENEW MENUITEM "&Nový\tCtrl+N", IDM_FILENEW
MENUITEM "Otevøít...\tCtrl+O", IDM_FILEOPEN MENUITEM "&Otevøít...\tCtrl+O", IDM_FILEOPEN
MENUITEM "Uložit\tCtrl+S", IDM_FILESAVE MENUITEM "Uložit\tCtrl+S", IDM_FILESAVE
MENUITEM "Uložit jako...", IDM_FILESAVEAS MENUITEM "Uložit jako...", IDM_FILESAVEAS
MENUITEM SEPARATOR MENUITEM SEPARATOR
@ -60,7 +60,7 @@ BEGIN
MENUITEM "800%", IDM_VIEWZOOM800 MENUITEM "800%", IDM_VIEWZOOM800
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Zobrazit møížku", IDM_VIEWSHOWGRID MENUITEM "Zobrazit møížku\tCtrl+G", IDM_VIEWSHOWGRID
MENUITEM "Zobrazit miniaturu", IDM_VIEWSHOWMINIATURE MENUITEM "Zobrazit miniaturu", IDM_VIEWSHOWMINIATURE
END END
MENUITEM "Celá obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN MENUITEM "Celá obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN

View file

@ -284,6 +284,10 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
placeSelWin(); placeSelWin();
ShowWindow(hSelection, SW_SHOW); ShowWindow(hSelection, SW_SHOW);
/* force refresh of selection contents */
SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
} }
HeapFree(GetProcessHeap(), 0, ptStack); HeapFree(GetProcessHeap(), 0, ptStack);
ptStack = NULL; ptStack = NULL;
@ -310,6 +314,10 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
placeSelWin(); placeSelWin();
ShowWindow(hSelection, SW_SHOW); ShowWindow(hSelection, SW_SHOW);
/* force refresh of selection contents */
SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0);
SendMessage(hSelection, WM_MOUSEMOVE, 0, 0);
SendMessage(hSelection, WM_LBUTTONUP, 0, 0);
} }
break; break;
case TOOL_RUBBER: case TOOL_RUBBER:

View file

@ -14,11 +14,11 @@
/* FUNCTIONS ********************************************************/ /* FUNCTIONS ********************************************************/
void 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); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) FileName, SPIF_UPDATEINIFILE);
/*HKEY hDesktop; HKEY hDesktop;
TCHAR szStyle[3], szTile[3]; TCHAR szStyle[3], szTile[3];
if ((dwStyle > 2) || (dwTile > 2)) if ((dwStyle > 2) || (dwTile > 2))
@ -39,5 +39,5 @@ SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: The pat
_tcslen(szTile) * sizeof(TCHAR)); _tcslen(szTile) * sizeof(TCHAR));
RegCloseKey(hDesktop); RegCloseKey(hDesktop);
}*/ }
} }

View file

@ -9,6 +9,8 @@
/* INCLUDES *********************************************************/ /* INCLUDES *********************************************************/
#include <windows.h> #include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include "globalvar.h" #include "globalvar.h"
#include "drawing.h" #include "drawing.h"
#include "history.h" #include "history.h"
@ -87,6 +89,7 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
if (moving) if (moving)
{ {
TCHAR sizeStr[100];
int xDelta; int xDelta;
int yDelta; int yDelta;
resetToU1(); resetToU1();
@ -147,6 +150,9 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
break; break;
} }
_stprintf(sizeStr, _T("%d x %d"), rectSel_dest[2], rectSel_dest[3]);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
if (action != 0) 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); StretchBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], hSelDC, 0, 0, GetDIBWidth(hSelBm), GetDIBHeight(hSelBm), SRCCOPY);
else else
@ -182,6 +188,7 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
int h = rectSel_dest[3] * zoom / 1000 + 6; int h = rectSel_dest[3] * zoom / 1000 + 6;
xPos = LOWORD(lParam); xPos = LOWORD(lParam);
yPos = HIWORD(lParam); yPos = HIWORD(lParam);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) NULL);
action = identifyCorner(xPos, yPos, w, h); action = identifyCorner(xPos, yPos, w, h);
if (action != 0) if (action != 0)
SetCursor(LoadCursor(NULL, cursors[action])); SetCursor(LoadCursor(NULL, cursors[action]));

View file

@ -151,6 +151,11 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch (message) /* handle the messages */ switch (message) /* handle the messages */
{ {
case WM_CREATE:
ptStack = NULL;
ptSP = 0;
break;
case WM_DESTROY: case WM_DESTROY:
PostQuitMessage(0); /* send a WM_QUIT to the message queue */ PostQuitMessage(0); /* send a WM_QUIT to the message queue */
break; break;
@ -446,9 +451,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
HDC hdc; HDC hdc;
GetClientRect(hwndMiniature, (LPRECT) &mclient); GetClientRect(hwndMiniature, (LPRECT) &mclient);
hdc = GetDC(hwndMiniature); hdc = GetDC(hwndMiniature);
BitBlt(hdc, -min(imgXRes * GetScrollPos(hScrollbox, SB_HORZ) / 10000, imgXRes - mclient[2]), BitBlt(hdc, 0, 0, imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY);
-min(imgYRes * GetScrollPos(hScrollbox, SB_VERT) / 10000, imgYRes - mclient[3]),
imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY);
ReleaseDC(hwndMiniature, hdc); ReleaseDC(hwndMiniature, hdc);
} }
break; break;
@ -565,6 +568,24 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
} }
break; 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: case WM_MOUSEMOVE:
if (hwnd == hImageArea) if (hwnd == hImageArea)
{ {
@ -640,6 +661,8 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL)) if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL))
{ {
TCHAR sizeStr[100]; TCHAR sizeStr[100];
if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0))
yRel = xRel;
_stprintf(sizeStr, _T("%d x %d"), xRel, yRel); _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
} }
@ -651,6 +674,8 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
if (activeTool >= TOOL_TEXT) if (activeTool >= TOOL_TEXT)
{ {
TCHAR sizeStr[100]; TCHAR sizeStr[100];
if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0))
yRel = xRel;
_stprintf(sizeStr, _T("%d x %d"), xRel, yRel); _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
} }
@ -783,7 +808,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case IDM_EDITDELETESELECTION: case IDM_EDITDELETESELECTION:
{ {
/* remove selection window and already painted content using undo(), /* 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(); undo();
if (activeTool == TOOL_RECTSEL) if (activeTool == TOOL_RECTSEL)
{ {
@ -791,16 +816,23 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0], Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0],
rectSel_dest[3] + rectSel_dest[1], bgColor, bgColor, 0, TRUE); 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; break;
} }
case IDM_EDITSELECTALL: case IDM_EDITSELECTALL:
if (activeTool == TOOL_RECTSEL) {
{ HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL);
startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0));
whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0);
endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
} whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
break; break;
}
case IDM_EDITCOPYTO: case IDM_EDITCOPYTO:
if (GetSaveFileName(&ofn) != 0) if (GetSaveFileName(&ofn) != 0)
SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM); SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM);
@ -829,23 +861,73 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case IDM_IMAGEROTATEMIRROR: case IDM_IMAGEROTATEMIRROR:
switch (mirrorRotateDlg()) switch (mirrorRotateDlg())
{ {
case 1: case 1: /* flip horizontally */
newReversible(); if (IsWindowVisible(hSelection))
StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, {
imgXRes, imgYRes, SRCCOPY); SelectObject(hSelDC, hSelMask);
SendMessage(hImageArea, WM_PAINT, 0, 0); StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
SelectObject(hSelDC, hSelBm);
StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC,
0, 0, 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
{
newReversible();
StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0,
imgXRes, imgYRes, SRCCOPY);
SendMessage(hImageArea, WM_PAINT, 0, 0);
}
break; break;
case 2: case 2: /* flip vertically */
newReversible(); if (IsWindowVisible(hSelection))
StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0, {
imgXRes, imgYRes, SRCCOPY); SelectObject(hSelDC, hSelMask);
SendMessage(hImageArea, WM_PAINT, 0, 0); StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
SelectObject(hSelDC, hSelBm);
StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC,
0, 0, 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
{
newReversible();
StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0,
imgXRes, imgYRes, SRCCOPY);
SendMessage(hImageArea, WM_PAINT, 0, 0);
}
break; break;
case 4: case 3: /* rotate 90 degrees */
newReversible(); break;
StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC, case 4: /* rotate 180 degrees */
0, 0, imgXRes, imgYRes, SRCCOPY); if (IsWindowVisible(hSelection))
SendMessage(hImageArea, WM_PAINT, 0, 0); {
SelectObject(hSelDC, hSelMask);
StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC,
0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY);
SelectObject(hSelDC, hSelBm);
StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC,
0, 0, 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
{
newReversible();
StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC,
0, 0, imgXRes, imgYRes, SRCCOPY);
SendMessage(hImageArea, WM_PAINT, 0, 0);
}
break;
case 5: /* rotate 270 degrees */
break; break;
} }
break; break;
@ -895,6 +977,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case IDM_VIEWSHOWGRID: case IDM_VIEWSHOWGRID:
showGrid = !showGrid; showGrid = !showGrid;
SendMessage(hImageArea, WM_PAINT, 0, 0);
break; break;
case IDM_VIEWSHOWMINIATURE: case IDM_VIEWSHOWMINIATURE:
showMiniature = !showMiniature; showMiniature = !showMiniature;