diff --git a/base/applications/mspaint/common.h b/base/applications/mspaint/common.h index 288bba64be4..af55873145f 100644 --- a/base/applications/mspaint/common.h +++ b/base/applications/mspaint/common.h @@ -30,6 +30,9 @@ BOOL zoomTo(int newZoom, int mouseX, int mouseY); BOOL nearlyEqualPoints(INT x0, INT y0, INT x1, INT y1); +void placeSelWin(void); +void updateStartAndLast(LONG x, LONG y); +void updateLast(LONG x, LONG y); static inline int Zoomed(int xy) { diff --git a/base/applications/mspaint/globalvar.h b/base/applications/mspaint/globalvar.h index cd427c86b05..a639f620be1 100644 --- a/base/applications/mspaint/globalvar.h +++ b/base/applications/mspaint/globalvar.h @@ -106,5 +106,3 @@ extern CStretchSkewDialog stretchSkewDialog; /* VARIABLES declared in mouse.cpp **********************************/ -extern POINT pointStack[256]; -extern short pointSP; diff --git a/base/applications/mspaint/imgarea.cpp b/base/applications/mspaint/imgarea.cpp index d521b6f065d..69a6de62984 100644 --- a/base/applications/mspaint/imgarea.cpp +++ b/base/applications/mspaint/imgarea.cpp @@ -159,41 +159,43 @@ LRESULT CImgAreaWindow::OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO LRESULT CImgAreaWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - if ((!drawing) || (toolsModel.GetActiveTool() == TOOL_COLOR)) - { - SetCapture(); - drawing = TRUE; - startPaintingL(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam)), - paletteModel.GetFgColor(), paletteModel.GetBgColor()); - } - else - { - SendMessage(WM_LBUTTONUP, wParam, lParam); - imageModel.Undo(); - } + drawing = TRUE; + SetCapture(); + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonDown(TRUE, UnZoomed(x), UnZoomed(y), FALSE); + Invalidate(FALSE); + return 0; +} + +LRESULT CImgAreaWindow::OnLButtonDblClk(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + drawing = FALSE; + ReleaseCapture(); + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonDown(TRUE, UnZoomed(x), UnZoomed(y), TRUE); + toolsModel.resetTool(); Invalidate(FALSE); - if ((toolsModel.GetActiveTool() == TOOL_ZOOM) && (toolsModel.GetZoom() < MAX_ZOOM)) - zoomTo(toolsModel.GetZoom() * 2, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; } LRESULT CImgAreaWindow::OnRButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - if ((!drawing) || (toolsModel.GetActiveTool() == TOOL_COLOR)) - { - SetCapture(); - drawing = TRUE; - startPaintingR(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam)), - paletteModel.GetFgColor(), paletteModel.GetBgColor()); - } - else - { - SendMessage(WM_RBUTTONUP, wParam, lParam); - imageModel.Undo(); - } + drawing = TRUE; + SetCapture(); + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonDown(FALSE, UnZoomed(x), UnZoomed(y), FALSE); + Invalidate(FALSE); + return 0; +} + +LRESULT CImgAreaWindow::OnRButtonDblClk(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) +{ + drawing = FALSE; + ReleaseCapture(); + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonDown(FALSE, UnZoomed(x), UnZoomed(y), TRUE); + toolsModel.resetTool(); Invalidate(FALSE); - if ((toolsModel.GetActiveTool() == TOOL_ZOOM) && (toolsModel.GetZoom() > MIN_ZOOM)) - zoomTo(toolsModel.GetZoom() / 2, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; } @@ -201,62 +203,27 @@ LRESULT CImgAreaWindow::OnLButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO { if (drawing) { - endPaintingL(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam)), paletteModel.GetFgColor(), - paletteModel.GetBgColor()); + drawing = FALSE; + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonUp(TRUE, UnZoomed(x), UnZoomed(y)); Invalidate(FALSE); - if (toolsModel.GetActiveTool() == TOOL_COLOR) - { - COLORREF tempColor = - GetPixel(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam))); - if (tempColor != CLR_INVALID) - paletteModel.SetFgColor(tempColor); - } SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) ""); } - drawing = FALSE; ReleaseCapture(); return 0; } void CImgAreaWindow::cancelDrawing() { - POINT pt; - switch (toolsModel.GetActiveTool()) - { - case TOOL_FREESEL: case TOOL_RECTSEL: - case TOOL_TEXT: case TOOL_ZOOM: case TOOL_SHAPE: - imageModel.ResetToPrevious(); - selectionModel.ResetPtStack(); - pointSP = 0; - Invalidate(FALSE); - break; - default: - GetCursorPos(&pt); - ScreenToClient(&pt); - // FIXME: dirty hack - if (GetKeyState(VK_LBUTTON) < 0) - { - endPaintingL(imageModel.GetDC(), UnZoomed(pt.x), UnZoomed(pt.y), paletteModel.GetFgColor(), - paletteModel.GetBgColor()); - } - else if (GetKeyState(VK_RBUTTON) < 0) - { - endPaintingR(imageModel.GetDC(), UnZoomed(pt.x), UnZoomed(pt.y), paletteModel.GetFgColor(), - paletteModel.GetBgColor()); - } - imageModel.Undo(); - pointSP = 0; - selectionModel.ResetPtStack(); - } + drawing = FALSE; + toolsModel.OnCancelDraw(); + Invalidate(FALSE); } LRESULT CImgAreaWindow::OnCaptureChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (drawing) - { cancelDrawing(); - drawing = FALSE; - } return 0; } @@ -270,14 +237,8 @@ LRESULT CImgAreaWindow::OnKeyDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& } else { - switch (toolsModel.GetActiveTool()) - { - case TOOL_SHAPE: case TOOL_BEZIER: - cancelDrawing(); - break; - default: - break; - } + if (drawing || ToolBase::pointSP != 0) + cancelDrawing(); } } return 0; @@ -287,19 +248,12 @@ LRESULT CImgAreaWindow::OnRButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO { if (drawing) { - endPaintingR(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam)), paletteModel.GetFgColor(), - paletteModel.GetBgColor()); + drawing = FALSE; + INT x = GET_X_LPARAM(lParam), y = GET_Y_LPARAM(lParam); + toolsModel.OnButtonUp(FALSE, UnZoomed(x), UnZoomed(y)); Invalidate(FALSE); - if (toolsModel.GetActiveTool() == TOOL_COLOR) - { - COLORREF tempColor = - GetPixel(imageModel.GetDC(), UnZoomed(GET_X_LPARAM(lParam)), UnZoomed(GET_Y_LPARAM(lParam))); - if (tempColor != CLR_INVALID) - paletteModel.SetBgColor(tempColor); - } SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) ""); } - drawing = FALSE; ReleaseCapture(); return 0; } @@ -374,9 +328,9 @@ LRESULT CImgAreaWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO default: break; } - if ((wParam & MK_LBUTTON) != 0) + if (wParam & MK_LBUTTON) { - whilePaintingL(imageModel.GetDC(), xNow, yNow, paletteModel.GetFgColor(), paletteModel.GetBgColor()); + toolsModel.OnMouseMove(TRUE, xNow, yNow); Invalidate(FALSE); if ((toolsModel.GetActiveTool() >= TOOL_TEXT) || (toolsModel.GetActiveTool() == TOOL_RECTSEL) || (toolsModel.GetActiveTool() == TOOL_FREESEL)) { @@ -387,9 +341,9 @@ LRESULT CImgAreaWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) (LPCTSTR) strSize); } } - if ((wParam & MK_RBUTTON) != 0) + if (wParam & MK_RBUTTON) { - whilePaintingR(imageModel.GetDC(), xNow, yNow, paletteModel.GetFgColor(), paletteModel.GetBgColor()); + toolsModel.OnMouseMove(FALSE, xNow, yNow); Invalidate(FALSE); if (toolsModel.GetActiveTool() >= TOOL_TEXT) { diff --git a/base/applications/mspaint/imgarea.h b/base/applications/mspaint/imgarea.h index 184076c965a..4c1a41ec27c 100644 --- a/base/applications/mspaint/imgarea.h +++ b/base/applications/mspaint/imgarea.h @@ -13,6 +13,10 @@ class CImgAreaWindow : public CWindowImpl { public: + CImgAreaWindow() : drawing(FALSE) + { + } + DECLARE_WND_CLASS_EX(_T("ImgAreaWindow"), CS_DBLCLKS, COLOR_BTNFACE) BEGIN_MSG_MAP(CImgAreaWindow) @@ -20,7 +24,9 @@ public: MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk) MESSAGE_HANDLER(WM_RBUTTONDOWN, OnRButtonDown) + MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnRButtonDblClk) MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) @@ -39,7 +45,9 @@ private: LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnSetCursor(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); + LRESULT OnLButtonDblClk(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnRButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); + LRESULT OnRButtonDblClk(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnLButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnRButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); diff --git a/base/applications/mspaint/mouse.cpp b/base/applications/mspaint/mouse.cpp index 0720a9fde56..e5b50b617ad 100644 --- a/base/applications/mspaint/mouse.cpp +++ b/base/applications/mspaint/mouse.cpp @@ -11,6 +11,9 @@ #include "precomp.h" +INT ToolBase::pointSP = 0; +POINT ToolBase::pointStack[256] = { { 0 } }; + /* FUNCTIONS ********************************************************/ void @@ -58,512 +61,583 @@ BOOL nearlyEqualPoints(INT x0, INT y0, INT x1, INT y1) return (abs(x1 - x0) <= cxThreshold) && (abs(y1 - y0) <= cyThreshold); } -POINT pointStack[256]; -short pointSP; - -void -startPaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) +void updateStartAndLast(LONG x, LONG y) +{ + start.x = last.x = x; + start.y = last.y = y; +} + +void updateLast(LONG x, LONG y) { - start.x = x; - start.y = y; last.x = x; last.y = y; - switch (toolsModel.GetActiveTool()) +} + +void ToolBase::reset() +{ + pointSP = 0; +} + +void ToolBase::OnCancelDraw() +{ + reset(); +} + +void ToolBase::beginEvent() +{ + m_hdc = imageModel.GetDC(); + m_fg = paletteModel.GetFgColor(); + m_bg = paletteModel.GetBgColor(); +} + +void ToolBase::endEvent() +{ + m_hdc = NULL; +} + +/* TOOLS ********************************************************/ + +// TOOL_FREESEL +struct FreeSelTool : ToolBase +{ + FreeSelTool() : ToolBase(TOOL_FREESEL) { - case TOOL_FREESEL: - selectionWindow.ShowWindow(SW_HIDE); - selectionModel.ResetPtStack(); - selectionModel.PushToPtStack(x, y); - break; - case TOOL_LINE: - case TOOL_RECT: - case TOOL_ELLIPSE: - case TOOL_RRECT: + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + selectionWindow.ShowWindow(SW_HIDE); + selectionModel.ResetPtStack(); + selectionModel.PushToPtStack(x, y); + } + + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + if (selectionModel.PtStackSize() == 1) imageModel.CopyPrevious(); - break; - case TOOL_RECTSEL: - case TOOL_TEXT: + selectionModel.PushToPtStack(max(0, min(x, imageModel.GetWidth())), max(0, min(y, imageModel.GetHeight()))); + imageModel.ResetToPrevious(); + selectionModel.DrawFramePoly(m_hdc); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + selectionModel.CalculateBoundingBoxAndContents(m_hdc); + if (selectionModel.PtStackSize() > 1) + { + selectionModel.DrawBackgroundPoly(m_hdc, m_bg); + imageModel.CopyPrevious(); + + selectionModel.DrawSelection(m_hdc); + + placeSelWin(); + selectionWindow.ShowWindow(SW_SHOW); + ForceRefreshSelectionContents(); + } + selectionModel.ResetPtStack(); + } + + void OnCancelDraw() + { + imageModel.ResetToPrevious(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); + } +}; + +// TOOL_RECTSEL +struct RectSelTool : ToolBase +{ + RectSelTool() : ToolBase(TOOL_RECTSEL) + { + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + if (bLeftButton) + { imageModel.CopyPrevious(); selectionWindow.ShowWindow(SW_HIDE); selectionModel.SetSrcRectSizeToZero(); - break; - case TOOL_RUBBER: - imageModel.CopyPrevious(); - Erase(hdc, x, y, x, y, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_FILL: - imageModel.CopyPrevious(); - Fill(hdc, x, y, fg); - break; - case TOOL_PEN: - imageModel.CopyPrevious(); - SetPixel(hdc, x, y, fg); - break; - case TOOL_BRUSH: - imageModel.CopyPrevious(); - Brush(hdc, x, y, x, y, fg, toolsModel.GetBrushStyle()); - break; - case TOOL_AIRBRUSH: - imageModel.CopyPrevious(); - Airbrush(hdc, x, y, fg, toolsModel.GetAirBrushWidth()); - break; - case TOOL_BEZIER: - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if (pointSP == 0) - { - imageModel.CopyPrevious(); - pointSP++; - } - break; - case TOOL_SHAPE: - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if (pointSP + 1 >= 2) - Poly(hdc, pointStack, pointSP + 1, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - if (pointSP == 0) - { - imageModel.CopyPrevious(); - pointSP++; - } - break; - case TOOL_COLOR: - case TOOL_ZOOM: - break; + } } -} -void -whilePaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) -{ - switch (toolsModel.GetActiveTool()) + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) { - case TOOL_FREESEL: - if (selectionModel.PtStackSize() == 1) - imageModel.CopyPrevious(); - selectionModel.PushToPtStack(max(0, min(x, imageModel.GetWidth())), max(0, min(y, imageModel.GetHeight()))); - imageModel.ResetToPrevious(); - selectionModel.DrawFramePoly(hdc); - break; - case TOOL_RECTSEL: - case TOOL_TEXT: + POINT temp; + if (bLeftButton) { - POINT temp; imageModel.ResetToPrevious(); temp.x = max(0, min(x, imageModel.GetWidth())); temp.y = max(0, min(y, imageModel.GetHeight())); selectionModel.SetSrcAndDestRectFromPoints(start, temp); - RectSel(hdc, start.x, start.y, temp.x, temp.y); - break; + RectSel(m_hdc, start.x, start.y, temp.x, temp.y); } - case TOOL_RUBBER: - Erase(hdc, last.x, last.y, x, y, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_PEN: - Line(hdc, last.x, last.y, x, y, fg, 1); - break; - case TOOL_BRUSH: - Brush(hdc, last.x, last.y, x, y, fg, toolsModel.GetBrushStyle()); - break; - case TOOL_AIRBRUSH: - Airbrush(hdc, x, y, fg, toolsModel.GetAirBrushWidth()); - break; - case TOOL_LINE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(start.x, start.y, x, y); - Line(hdc, start.x, start.y, x, y, fg, toolsModel.GetLineWidth()); - break; - case TOOL_BEZIER: - imageModel.ResetToPrevious(); - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - switch (pointSP) - { - case 1: - Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, fg, - toolsModel.GetLineWidth()); - break; - case 2: - Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], fg, toolsModel.GetLineWidth()); - break; - case 3: - Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], fg, toolsModel.GetLineWidth()); - break; - } - break; - case TOOL_RECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Rect(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_SHAPE: - imageModel.ResetToPrevious(); - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - pointStack[pointSP].x, pointStack[pointSP].y); - if (pointSP + 1 >= 2) - Poly(hdc, pointStack, pointSP + 1, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - break; - case TOOL_ELLIPSE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Ellp(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_RRECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - RRect(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_FILL: - case TOOL_COLOR: - case TOOL_ZOOM: - break; } - last.x = x; - last.y = y; -} - -void -endPaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) -{ - switch (toolsModel.GetActiveTool()) + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) { - case TOOL_FREESEL: + if (bLeftButton) { - selectionModel.CalculateBoundingBoxAndContents(hdc); - if (selectionModel.PtStackSize() > 1) + imageModel.ResetToPrevious(); + if (selectionModel.IsSrcRectSizeNonzero()) { - selectionModel.DrawBackgroundPoly(hdc, bg); + selectionModel.CalculateContents(m_hdc); + selectionModel.DrawBackgroundRect(m_hdc, m_bg); imageModel.CopyPrevious(); - selectionModel.DrawSelection(hdc); + selectionModel.DrawSelection(m_hdc); placeSelWin(); selectionWindow.ShowWindow(SW_SHOW); ForceRefreshSelectionContents(); } - selectionModel.ResetPtStack(); - break; } - case TOOL_RECTSEL: - imageModel.ResetToPrevious(); - if (selectionModel.IsSrcRectSizeNonzero()) - { - selectionModel.CalculateContents(hdc); - selectionModel.DrawBackgroundRect(hdc, bg); - imageModel.CopyPrevious(); - - selectionModel.DrawSelection(hdc); - - placeSelWin(); - selectionWindow.ShowWindow(SW_SHOW); - ForceRefreshSelectionContents(); - } - break; - case TOOL_TEXT: - imageModel.ResetToPrevious(); - if (selectionModel.IsSrcRectSizeNonzero()) - { - imageModel.CopyPrevious(); - - placeSelWin(); - selectionWindow.ShowWindow(SW_SHOW); - ForceRefreshSelectionContents(); - } - break; - case TOOL_RUBBER: - Erase(hdc, last.x, last.y, x, y, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_PEN: - Line(hdc, last.x, last.y, x, y, fg, 1); - SetPixel(hdc, x, y, fg); - break; - case TOOL_LINE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(start.x, start.y, x, y); - Line(hdc, start.x, start.y, x, y, fg, toolsModel.GetLineWidth()); - break; - case TOOL_BEZIER: - pointSP++; - if (pointSP == 4) - pointSP = 0; - break; - case TOOL_RECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Rect(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_SHAPE: - imageModel.ResetToPrevious(); - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - pointStack[pointSP].x, pointStack[pointSP].y); - pointSP++; - if (pointSP >= 2) - { - if (nearlyEqualPoints(x, y, pointStack[0].x, pointStack[0].y)) - { - Poly(hdc, pointStack, pointSP, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), TRUE, FALSE); - pointSP = 0; - } - else - { - Poly(hdc, pointStack, pointSP, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - } - } - if (pointSP == 255) - pointSP--; - break; - case TOOL_ELLIPSE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Ellp(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_RRECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - RRect(hdc, start.x, start.y, x, y, fg, bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_FILL: - case TOOL_COLOR: - case TOOL_ZOOM: - case TOOL_BRUSH: - case TOOL_AIRBRUSH: - break; } -} -void -startPaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) -{ - start.x = x; - start.y = y; - last.x = x; - last.y = y; - switch (toolsModel.GetActiveTool()) + void OnCancelDraw() { - case TOOL_FREESEL: - case TOOL_TEXT: - case TOOL_LINE: - case TOOL_RECT: - case TOOL_ELLIPSE: - case TOOL_RRECT: - imageModel.CopyPrevious(); - break; - case TOOL_RUBBER: - imageModel.CopyPrevious(); - Replace(hdc, x, y, x, y, fg, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_FILL: - imageModel.CopyPrevious(); - Fill(hdc, x, y, bg); - break; - case TOOL_PEN: - imageModel.CopyPrevious(); - SetPixel(hdc, x, y, bg); - break; - case TOOL_BRUSH: - imageModel.CopyPrevious(); - Brush(hdc, x, y, x, y, bg, toolsModel.GetBrushStyle()); - break; - case TOOL_AIRBRUSH: - imageModel.CopyPrevious(); - Airbrush(hdc, x, y, bg, toolsModel.GetAirBrushWidth()); - break; - case TOOL_BEZIER: - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if (pointSP == 0) - { - imageModel.CopyPrevious(); - pointSP++; - } - break; - case TOOL_SHAPE: - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if (pointSP + 1 >= 2) - Poly(hdc, pointStack, pointSP + 1, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - if (pointSP == 0) - { - imageModel.CopyPrevious(); - pointSP++; - } - break; - case TOOL_RECTSEL: - case TOOL_COLOR: - case TOOL_ZOOM: - break; + imageModel.ResetToPrevious(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); } -} +}; -void -whilePaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) +struct GenericDrawTool : ToolBase { - switch (toolsModel.GetActiveTool()) + GenericDrawTool(TOOLTYPE type) : ToolBase(type) { - case TOOL_RUBBER: - Replace(hdc, last.x, last.y, x, y, fg, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_PEN: - Line(hdc, last.x, last.y, x, y, bg, 1); - break; - case TOOL_BRUSH: - Brush(hdc, last.x, last.y, x, y, bg, toolsModel.GetBrushStyle()); - break; - case TOOL_AIRBRUSH: - Airbrush(hdc, x, y, bg, toolsModel.GetAirBrushWidth()); - break; - case TOOL_LINE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(start.x, start.y, x, y); - Line(hdc, start.x, start.y, x, y, bg, toolsModel.GetLineWidth()); - break; - case TOOL_BEZIER: - imageModel.ResetToPrevious(); - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - switch (pointSP) - { - case 1: - Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, bg, - toolsModel.GetLineWidth()); - break; - case 2: - Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], bg, toolsModel.GetLineWidth()); - break; - case 3: - Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], bg, toolsModel.GetLineWidth()); - break; - } - break; - case TOOL_RECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Rect(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_SHAPE: - imageModel.ResetToPrevious(); - pointStack[pointSP].x = x; - pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - pointStack[pointSP].x, pointStack[pointSP].y); - if (pointSP + 1 >= 2) - Poly(hdc, pointStack, pointSP + 1, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - break; - case TOOL_ELLIPSE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Ellp(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_RRECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - RRect(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_FREESEL: - case TOOL_RECTSEL: - case TOOL_FILL: - case TOOL_COLOR: - case TOOL_ZOOM: - case TOOL_TEXT: - break; } - last.x = x; - last.y = y; -} + virtual void draw(BOOL bLeftButton, LONG x, LONG y) = 0; -void -endPaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg) + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + draw(bLeftButton, x, y); + } + + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + draw(bLeftButton, x, y); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + draw(bLeftButton, x, y); + } + + void OnCancelDraw() + { + OnButtonUp(FALSE, 0, 0); + imageModel.Undo(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); + } +}; + +// TOOL_RUBBER +struct RubberTool : GenericDrawTool { - switch (toolsModel.GetActiveTool()) + RubberTool() : GenericDrawTool(TOOL_RUBBER) { - case TOOL_RUBBER: - Replace(hdc, last.x, last.y, x, y, fg, bg, toolsModel.GetRubberRadius()); - break; - case TOOL_PEN: - Line(hdc, last.x, last.y, x, y, bg, 1); - SetPixel(hdc, x, y, bg); - break; - case TOOL_LINE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(start.x, start.y, x, y); - Line(hdc, start.x, start.y, x, y, bg, toolsModel.GetLineWidth()); - break; - case TOOL_BEZIER: + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + if (bLeftButton) + Erase(m_hdc, last.x, last.y, x, y, m_bg, toolsModel.GetRubberRadius()); + else + Replace(m_hdc, last.x, last.y, x, y, m_fg, m_bg, toolsModel.GetRubberRadius()); + } +}; + +// TOOL_FILL +struct FillTool : ToolBase +{ + FillTool() : ToolBase(TOOL_FILL) + { + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + Fill(m_hdc, x, y, bLeftButton ? m_fg : m_bg); + } +}; + +// TOOL_COLOR +struct ColorTool : ToolBase +{ + ColorTool() : ToolBase(TOOL_COLOR) + { + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + COLORREF tempColor; + + if (0 <= x && x < imageModel.GetWidth() && 0 <= y && y < imageModel.GetHeight()) + tempColor = GetPixel(m_hdc, x, y); + else + tempColor = RGB(255, 255, 255); // Outside is white + + if (bLeftButton) + paletteModel.SetFgColor(tempColor); + else + paletteModel.SetBgColor(tempColor); + + toolsModel.SetActiveTool(toolsModel.GetOldActiveTool()); + } +}; + +// TOOL_ZOOM +struct ZoomTool : ToolBase +{ + ZoomTool() : ToolBase(TOOL_ZOOM) + { + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + if (bLeftButton) + { + if (toolsModel.GetZoom() < MAX_ZOOM) + zoomTo(toolsModel.GetZoom() * 2, x, y); + } + else + { + if (toolsModel.GetZoom() > MIN_ZOOM) + zoomTo(toolsModel.GetZoom() / 2, x, y); + } + } +}; + +// TOOL_PEN +struct PenTool : GenericDrawTool +{ + PenTool() : GenericDrawTool(TOOL_PEN) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + COLORREF rgb = bLeftButton ? m_fg : m_bg; + Line(m_hdc, last.x, last.y, x, y, rgb, 1); + SetPixel(m_hdc, x, y, rgb); + } +}; + +// TOOL_BRUSH +struct BrushTool : GenericDrawTool +{ + BrushTool() : GenericDrawTool(TOOL_BRUSH) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + COLORREF rgb = bLeftButton ? m_fg : m_bg; + Brush(m_hdc, last.x, last.y, x, y, rgb, toolsModel.GetBrushStyle()); + } +}; + +// TOOL_AIRBRUSH +struct AirBrushTool : GenericDrawTool +{ + AirBrushTool() : GenericDrawTool(TOOL_AIRBRUSH) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + COLORREF rgb = bLeftButton ? m_fg : m_bg; + Airbrush(m_hdc, x, y, rgb, toolsModel.GetAirBrushWidth()); + } +}; + +// TOOL_TEXT +struct TextTool : ToolBase +{ + TextTool() : ToolBase(TOOL_TEXT) + { + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + imageModel.CopyPrevious(); + } + + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + POINT temp; + imageModel.ResetToPrevious(); + temp.x = max(0, min(x, imageModel.GetWidth())); + temp.y = max(0, min(y, imageModel.GetHeight())); + selectionModel.SetSrcAndDestRectFromPoints(start, temp); + RectSel(m_hdc, start.x, start.y, temp.x, temp.y); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if (selectionModel.IsSrcRectSizeNonzero()) + { + imageModel.CopyPrevious(); + + placeSelWin(); + selectionWindow.ShowWindow(SW_SHOW); + ForceRefreshSelectionContents(); + } + } + + void OnCancelDraw() + { + imageModel.ResetToPrevious(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); + } +}; + +// TOOL_LINE +struct LineTool : GenericDrawTool +{ + LineTool() : GenericDrawTool(TOOL_LINE) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(start.x, start.y, x, y); + COLORREF rgb = bLeftButton ? m_fg : m_bg; + Line(m_hdc, start.x, start.y, x, y, rgb, toolsModel.GetLineWidth()); + } +}; + +// TOOL_BEZIER +struct BezierTool : ToolBase +{ + BezierTool() : ToolBase(TOOL_BEZIER) + { + } + + void draw(BOOL bLeftButton) + { + COLORREF rgb = (bLeftButton ? m_fg : m_bg); + switch (pointSP) + { + case 1: + Line(m_hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, rgb, + toolsModel.GetLineWidth()); + break; + case 2: + Bezier(m_hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], rgb, toolsModel.GetLineWidth()); + break; + case 3: + Bezier(m_hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], rgb, toolsModel.GetLineWidth()); + break; + } + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + + if (pointSP == 0) + { + imageModel.CopyPrevious(); + pointSP++; + } + } + + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + draw(bLeftButton); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + draw(bLeftButton); + pointSP++; + if (pointSP == 4) + pointSP = 0; + } + + void OnCancelDraw() + { + OnButtonUp(FALSE, 0, 0); + imageModel.Undo(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); + } +}; + +// TOOL_RECT +struct RectTool : GenericDrawTool +{ + RectTool() : GenericDrawTool(TOOL_RECT) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(start.x, start.y, x, y); + if (bLeftButton) + Rect(m_hdc, start.x, start.y, x, y, m_fg, m_bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + else + Rect(m_hdc, start.x, start.y, x, y, m_bg, m_fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + } +}; + +// TOOL_SHAPE +struct ShapeTool : ToolBase +{ + ShapeTool() : ToolBase(TOOL_SHAPE) + { + } + + void draw(BOOL bLeftButton, LONG x, LONG y, BOOL bClosed = FALSE) + { + if (pointSP + 1 >= 2) + { + if (bLeftButton) + Poly(m_hdc, pointStack, pointSP + 1, m_fg, m_bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), bClosed, FALSE); + else + Poly(m_hdc, pointStack, pointSP + 1, m_bg, m_fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), bClosed, FALSE); + } + } + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + + if (pointSP == 0 && !bDoubleClick) + { + imageModel.CopyPrevious(); + draw(bLeftButton, x, y); + pointSP++; + } + else + { + draw(bLeftButton, x, y, bDoubleClick); + } + } + + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, x, y); + draw(bLeftButton, x, y, FALSE); + } + + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, x, y); + + if (nearlyEqualPoints(x, y, pointStack[0].x, pointStack[0].y)) + { + pointSP--; + draw(bLeftButton, x, y, TRUE); + pointSP = 0; + } + else + { pointSP++; - if (pointSP == 4) - pointSP = 0; - break; - case TOOL_RECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Rect(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_SHAPE: - imageModel.ResetToPrevious(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - pointStack[pointSP].x, pointStack[pointSP].y); - pointSP++; - if (pointSP >= 2) - { - if (nearlyEqualPoints(x, y, pointStack[0].x, pointStack[0].y)) - { - Poly(hdc, pointStack, pointSP, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), TRUE, FALSE); - pointSP = 0; - } - else - { - Poly(hdc, pointStack, pointSP, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle(), FALSE, FALSE); - } - } - if (pointSP == 255) - pointSP--; - break; - case TOOL_ELLIPSE: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - Ellp(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_RRECT: - imageModel.ResetToPrevious(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(start.x, start.y, x, y); - RRect(hdc, start.x, start.y, x, y, bg, fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); - break; - case TOOL_FREESEL: - case TOOL_RECTSEL: - case TOOL_FILL: - case TOOL_COLOR: - case TOOL_ZOOM: - case TOOL_BRUSH: - case TOOL_AIRBRUSH: - case TOOL_TEXT: - break; + draw(bLeftButton, x, y, FALSE); + } + + if (pointSP == _countof(pointStack)) + pointSP--; } + + void OnCancelDraw() + { + imageModel.ResetToPrevious(); + selectionModel.ResetPtStack(); + ToolBase::OnCancelDraw(); + } +}; + +// TOOL_ELLIPSE +struct EllipseTool : GenericDrawTool +{ + EllipseTool() : GenericDrawTool(TOOL_ELLIPSE) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(start.x, start.y, x, y); + if (bLeftButton) + Ellp(m_hdc, start.x, start.y, x, y, m_fg, m_bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + else + Ellp(m_hdc, start.x, start.y, x, y, m_bg, m_fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + } +}; + +// TOOL_RRECT +struct RRectTool : GenericDrawTool +{ + RRectTool() : GenericDrawTool(TOOL_RRECT) + { + } + + virtual void draw(BOOL bLeftButton, LONG x, LONG y) + { + imageModel.ResetToPrevious(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(start.x, start.y, x, y); + if (bLeftButton) + RRect(m_hdc, start.x, start.y, x, y, m_fg, m_bg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + else + RRect(m_hdc, start.x, start.y, x, y, m_bg, m_fg, toolsModel.GetLineWidth(), toolsModel.GetShapeStyle()); + } +}; + +/*static*/ ToolBase* +ToolBase::createToolObject(TOOLTYPE type) +{ + switch (type) + { + case TOOL_FREESEL: return new FreeSelTool(); + case TOOL_RECTSEL: return new RectSelTool(); + case TOOL_RUBBER: return new RubberTool(); + case TOOL_FILL: return new FillTool(); + case TOOL_COLOR: return new ColorTool(); + case TOOL_ZOOM: return new ZoomTool(); + case TOOL_PEN: return new PenTool(); + case TOOL_BRUSH: return new BrushTool(); + case TOOL_AIRBRUSH: return new AirBrushTool(); + case TOOL_TEXT: return new TextTool(); + case TOOL_LINE: return new LineTool(); + case TOOL_BEZIER: return new BezierTool(); + case TOOL_RECT: return new RectTool(); + case TOOL_SHAPE: return new ShapeTool(); + case TOOL_ELLIPSE: return new EllipseTool(); + case TOOL_RRECT: return new RRectTool(); + } + UNREACHABLE; + return NULL; } diff --git a/base/applications/mspaint/mouse.h b/base/applications/mspaint/mouse.h deleted file mode 100644 index 59f13fd7425..00000000000 --- a/base/applications/mspaint/mouse.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * PROJECT: PAINT for ReactOS - * LICENSE: LGPL - * FILE: base/applications/mspaint/mouse.h - * PURPOSE: Things which should not be in the mouse event handler itself - * PROGRAMMERS: Benedikt Freisen - */ - -#pragma once - -void placeSelWin(void); - -void startPaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); - -void whilePaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); - -void endPaintingL(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); - -void startPaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); - -void whilePaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); - -void endPaintingR(HDC hdc, LONG x, LONG y, COLORREF fg, COLORREF bg); diff --git a/base/applications/mspaint/precomp.h b/base/applications/mspaint/precomp.h index d51eafa85e6..5b5bfa8279d 100644 --- a/base/applications/mspaint/precomp.h +++ b/base/applications/mspaint/precomp.h @@ -38,7 +38,6 @@ #include "history.h" #include "imgarea.h" #include "miniature.h" -#include "mouse.h" #include "palette.h" #include "palettemodel.h" #include "registry.h" diff --git a/base/applications/mspaint/scrollbox.cpp b/base/applications/mspaint/scrollbox.cpp index 32f48e6d490..d2be15f8f18 100644 --- a/base/applications/mspaint/scrollbox.cpp +++ b/base/applications/mspaint/scrollbox.cpp @@ -176,7 +176,23 @@ LRESULT CScrollboxWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO LRESULT CScrollboxWindow::OnLButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { selectionWindow.ShowWindow(SW_HIDE); - pointSP = 0; // resets the point-buffer of the polygon and bezier functions + + switch (toolsModel.GetActiveTool()) + { + case TOOL_BEZIER: + case TOOL_SHAPE: + if (ToolBase::pointSP != 0) + { + toolsModel.OnCancelDraw(); + imageArea.Invalidate(); + } + break; + + default: + break; + } + + toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions return 0; } diff --git a/base/applications/mspaint/toolbox.cpp b/base/applications/mspaint/toolbox.cpp index 7e0a3aeeafd..d11917b5cac 100644 --- a/base/applications/mspaint/toolbox.cpp +++ b/base/applications/mspaint/toolbox.cpp @@ -71,58 +71,42 @@ LRESULT CToolBox::OnSysColorChange(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL return 0; } +struct COMMAND_TO_TOOL +{ + UINT id; + TOOLTYPE tool; +}; + +static const COMMAND_TO_TOOL CommandToToolMapping[] = +{ + { ID_FREESEL, TOOL_FREESEL }, + { ID_RECTSEL, TOOL_RECTSEL }, + { ID_RUBBER, TOOL_RUBBER }, + { ID_FILL, TOOL_FILL }, + { ID_COLOR, TOOL_COLOR }, + { ID_ZOOM, TOOL_ZOOM }, + { ID_PEN, TOOL_PEN }, + { ID_BRUSH, TOOL_BRUSH }, + { ID_AIRBRUSH, TOOL_AIRBRUSH }, + { ID_TEXT, TOOL_TEXT }, + { ID_LINE, TOOL_LINE }, + { ID_BEZIER, TOOL_BEZIER }, + { ID_RECT, TOOL_RECT }, + { ID_SHAPE, TOOL_SHAPE }, + { ID_ELLIPSE, TOOL_ELLIPSE }, + { ID_RRECT, TOOL_RRECT }, +}; + LRESULT CToolBox::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - switch (LOWORD(wParam)) + UINT id = LOWORD(wParam); + for (size_t i = 0; i < _countof(CommandToToolMapping); ++i) { - case ID_FREESEL: - toolsModel.SetActiveTool(TOOL_FREESEL); - break; - case ID_RECTSEL: - toolsModel.SetActiveTool(TOOL_RECTSEL); - break; - case ID_RUBBER: - toolsModel.SetActiveTool(TOOL_RUBBER); - break; - case ID_FILL: - toolsModel.SetActiveTool(TOOL_FILL); - break; - case ID_COLOR: - toolsModel.SetActiveTool(TOOL_COLOR); - break; - case ID_ZOOM: - toolsModel.SetActiveTool(TOOL_ZOOM); - break; - case ID_PEN: - toolsModel.SetActiveTool(TOOL_PEN); - break; - case ID_BRUSH: - toolsModel.SetActiveTool(TOOL_BRUSH); - break; - case ID_AIRBRUSH: - toolsModel.SetActiveTool(TOOL_AIRBRUSH); - break; - case ID_TEXT: - toolsModel.SetActiveTool(TOOL_TEXT); - break; - case ID_LINE: - toolsModel.SetActiveTool(TOOL_LINE); - break; - case ID_BEZIER: - toolsModel.SetActiveTool(TOOL_BEZIER); - break; - case ID_RECT: - toolsModel.SetActiveTool(TOOL_RECT); - break; - case ID_SHAPE: - toolsModel.SetActiveTool(TOOL_SHAPE); - break; - case ID_ELLIPSE: - toolsModel.SetActiveTool(TOOL_ELLIPSE); - break; - case ID_RRECT: - toolsModel.SetActiveTool(TOOL_RRECT); + if (CommandToToolMapping[i].id == id) + { + toolsModel.SetActiveTool(CommandToToolMapping[i].tool); break; + } } return 0; } @@ -130,6 +114,18 @@ LRESULT CToolBox::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHand LRESULT CToolBox::OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { selectionWindow.ShowWindow(SW_HIDE); - pointSP = 0; // resets the point-buffer of the polygon and bezier functions + toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions + + // Check the toolbar button + TOOLTYPE tool = toolsModel.GetActiveTool(); + for (size_t i = 0; i < _countof(CommandToToolMapping); ++i) + { + if (CommandToToolMapping[i].tool == tool) + { + toolbar.SendMessage(TB_CHECKBUTTON, CommandToToolMapping[i].id, TRUE); + break; + } + } + return 0; } diff --git a/base/applications/mspaint/toolsmodel.cpp b/base/applications/mspaint/toolsmodel.cpp index a0ceaeff1ef..bedf12d4e9a 100644 --- a/base/applications/mspaint/toolsmodel.cpp +++ b/base/applications/mspaint/toolsmodel.cpp @@ -17,11 +17,27 @@ ToolsModel::ToolsModel() m_lineWidth = 1; m_shapeStyle = 0; m_brushStyle = 0; - m_activeTool = TOOL_PEN; + m_oldActiveTool = m_activeTool = TOOL_PEN; m_airBrushWidth = 5; m_rubberRadius = 4; m_transpBg = FALSE; m_zoom = 1000; + ZeroMemory(&m_tools, sizeof(m_tools)); + m_pToolObject = GetOrCreateTool(m_activeTool); +} + +ToolsModel::~ToolsModel() +{ + for (size_t i = 0; i < TOOL_MAX + 1; ++i) + delete m_tools[i]; +} + +ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool) +{ + if (!m_tools[nTool]) + m_tools[nTool] = ToolBase::createToolObject(nTool); + + return m_tools[nTool]; } int ToolsModel::GetLineWidth() const @@ -62,9 +78,29 @@ TOOLTYPE ToolsModel::GetActiveTool() const return m_activeTool; } +TOOLTYPE ToolsModel::GetOldActiveTool() const +{ + return m_oldActiveTool; +} + void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool) { + switch (m_activeTool) + { + case TOOL_FREESEL: + case TOOL_RECTSEL: + case TOOL_RUBBER: + case TOOL_COLOR: + case TOOL_ZOOM: + case TOOL_TEXT: + break; + default: + m_oldActiveTool = m_activeTool; + break; + } + m_activeTool = nActiveTool; + m_pToolObject = GetOrCreateTool(m_activeTool); NotifyToolChanged(); } @@ -129,3 +165,47 @@ void ToolsModel::NotifyZoomChanged() { toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); } + +void ToolsModel::OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) +{ + m_pToolObject->beginEvent(); + updateStartAndLast(x, y); + m_pToolObject->OnButtonDown(bLeftButton, x, y, bDoubleClick); + m_pToolObject->endEvent(); +} + +void ToolsModel::OnMouseMove(BOOL bLeftButton, LONG x, LONG y) +{ + m_pToolObject->beginEvent(); + m_pToolObject->OnMouseMove(bLeftButton, x, y); + updateLast(x, y); + m_pToolObject->endEvent(); +} + +void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y) +{ + m_pToolObject->beginEvent(); + m_pToolObject->OnButtonUp(bLeftButton, x, y); + updateLast(x, y); + m_pToolObject->endEvent(); +} + +void ToolsModel::OnCancelDraw() +{ + m_pToolObject->beginEvent(); + m_pToolObject->OnCancelDraw(); + m_pToolObject->endEvent(); +} + +void ToolsModel::resetTool() +{ + m_pToolObject->reset(); +} + +void ToolsModel::selectAll() +{ + SetActiveTool(TOOL_RECTSEL); + OnButtonDown(TRUE, 0, 0, FALSE); + OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); + OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); +} diff --git a/base/applications/mspaint/toolsmodel.h b/base/applications/mspaint/toolsmodel.h index 0fff204d626..b8a70dce4a7 100644 --- a/base/applications/mspaint/toolsmodel.h +++ b/base/applications/mspaint/toolsmodel.h @@ -26,10 +26,48 @@ enum TOOLTYPE TOOL_SHAPE = 14, TOOL_ELLIPSE = 15, TOOL_RRECT = 16, + TOOL_MAX = TOOL_RRECT, }; /* CLASSES **********************************************************/ +struct ToolBase +{ + TOOLTYPE m_tool; + HDC m_hdc; + COLORREF m_fg, m_bg; + static INT pointSP; + static POINT pointStack[256]; + + ToolBase(TOOLTYPE tool) : m_tool(tool), m_hdc(NULL) + { + } + + virtual ~ToolBase() + { + } + + virtual void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) + { + } + + virtual void OnMouseMove(BOOL bLeftButton, LONG x, LONG y) + { + } + + virtual void OnButtonUp(BOOL bLeftButton, LONG x, LONG y) + { + } + + virtual void OnCancelDraw(); + + void beginEvent(); + void endEvent(); + void reset(); + + static ToolBase* createToolObject(TOOLTYPE type); +}; + class ToolsModel { private: @@ -37,10 +75,15 @@ private: int m_shapeStyle; int m_brushStyle; TOOLTYPE m_activeTool; + TOOLTYPE m_oldActiveTool; int m_airBrushWidth; int m_rubberRadius; BOOL m_transpBg; int m_zoom; + ToolBase* m_tools[TOOL_MAX + 1]; + ToolBase *m_pToolObject; + + ToolBase *GetOrCreateTool(TOOLTYPE nTool); void NotifyToolChanged(); void NotifyToolSettingsChanged(); @@ -48,6 +91,7 @@ private: public: ToolsModel(); + ~ToolsModel(); int GetLineWidth() const; void SetLineWidth(int nLineWidth); int GetShapeStyle() const; @@ -55,6 +99,7 @@ public: int GetBrushStyle() const; void SetBrushStyle(int nBrushStyle); TOOLTYPE GetActiveTool() const; + TOOLTYPE GetOldActiveTool() const; void SetActiveTool(TOOLTYPE nActiveTool); int GetAirBrushWidth() const; void SetAirBrushWidth(int nAirBrushWidth); @@ -64,4 +109,12 @@ public: void SetBackgroundTransparent(BOOL bTransparent); int GetZoom() const; void SetZoom(int nZoom); + + void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick); + void OnMouseMove(BOOL bLeftButton, LONG x, LONG y); + void OnButtonUp(BOOL bLeftButton, LONG x, LONG y); + void OnCancelDraw(); + + void resetTool(); + void selectAll(); }; diff --git a/base/applications/mspaint/winproc.cpp b/base/applications/mspaint/winproc.cpp index 4ccc7be0cdb..643a914309c 100644 --- a/base/applications/mspaint/winproc.cpp +++ b/base/applications/mspaint/winproc.cpp @@ -559,11 +559,8 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH { HWND hToolbar = FindWindowEx(toolBoxContainer.m_hWnd, NULL, TOOLBARCLASSNAME, NULL); SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELPARAM(TRUE, 0)); - toolBoxContainer.SendMessage(WM_COMMAND, ID_RECTSEL); - //TODO: do this properly - startPaintingL(imageModel.GetDC(), 0, 0, paletteModel.GetFgColor(), paletteModel.GetBgColor()); - whilePaintingL(imageModel.GetDC(), imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetFgColor(), paletteModel.GetBgColor()); - endPaintingL(imageModel.GetDC(), imageModel.GetWidth(), imageModel.GetHeight(), paletteModel.GetFgColor(), paletteModel.GetBgColor()); + toolsModel.selectAll(); + imageArea.Invalidate(TRUE); break; } case IDM_EDITCOPYTO: