From 0789935ebf94a763d4ed79a32fa35c9a80c1f6df Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 1 Nov 2008 23:27:28 +0900 Subject: [PATCH] [10/19] mspaint: Add TOOL_AIRBRUSH --- programs/mspaint/airbrush.bmp | Bin 0 -> 670 bytes programs/mspaint/airbrush.cur | Bin 0 -> 326 bytes programs/mspaint/canvas.c | 56 +++++++++++++++++++++++++++++++ programs/mspaint/main.c | 74 ++++++++++++++++++++++++++++++++++++++++- programs/mspaint/main.h | 2 + programs/mspaint/resource.h | 1 + programs/mspaint/rsrc.rc | 4 ++ 7 files changed, 136 insertions(+), 1 deletions(-) create mode 100644 programs/mspaint/airbrush.bmp create mode 100644 programs/mspaint/airbrush.cur diff --git a/programs/mspaint/airbrush.bmp b/programs/mspaint/airbrush.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8b1ff48922a58e8a38b9bd2ba1abfdabb35b3460 GIT binary patch literal 670 zcmZ?royWug26jMF1B!isG$Rm#Kmt(y2pWFD-`0)>(~o11gXOo!8-wZ1e|Lh#zx)3O z^B>>&4W|3}`oZ)+;q74h`NVKAeYqQA-&ZGpF#p*7crg9P7NY-;A%y<75<*kU|HPZ~ z9qgX}|2v?xB82{@e;*tV|4#1*g$w`xMejkh_z#qpb|Ns9ZICxlK?F|M% z(>xd$8d?|_9fcSensgZ$U1Av+R_tP6^eSOsSe?PZ7&(D~VSxezL-YYWrlCp!-9RKb r4^-C<#LWNy|6~0B{}03e|385E1CadzDE5IJi1~q79*FIM>WBjXE`x%_ literal 0 HcmV?d00001 diff --git a/programs/mspaint/canvas.c b/programs/mspaint/canvas.c index d7a3d84..070e5dc 100644 --- a/programs/mspaint/canvas.c +++ b/programs/mspaint/canvas.c @@ -611,6 +611,16 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) Globals.pt0 = pt; break; + case TOOL_AIRBRUSH: + SetCursor(Globals.hcurAirBrush); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + PrepareForUndo(); + KillTimer(hWnd, Globals.idTimer); + Globals.idTimer = SetTimer(hWnd, 1, 30, NULL); + Globals.fModified = TRUE; + break; + case TOOL_SPOIT: SetCursor(Globals.hcurSpoit); Globals.mode = MODE_CANVAS; @@ -1124,6 +1134,13 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown ShowNoSize(); break; + case TOOL_AIRBRUSH: + SetCursor(Globals.hcurAirBrush); + CanvasToImage(&pt); + ShowPos(pt); + ShowNoSize(); + break; + default: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -1408,6 +1425,11 @@ VOID Canvas_OnButtonUp(HWND hWnd, INT x, INT y, BOOL fRight) UpdateWindow(hWnd); break; + case TOOL_AIRBRUSH: + SetCursor(Globals.hcurAirBrush); + KillTimer(hWnd, Globals.idTimer); + break; + case TOOL_BOX: case TOOL_ELLIPSE: case TOOL_ROUNDRECT: @@ -1676,6 +1698,40 @@ LRESULT CALLBACK CanvasWndProc(HWND hWnd, UINT uMsg, } break; + case WM_TIMER: + { + HDC hDC = GetDC(hWnd); + HDC hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + POINT pt; + INT i, j, n; + HGDIOBJ hbmOld = SelectObject(hMemDC, Globals.hbmImage); + GetCursorPos(&pt); + ScreenToClient(hWnd, &pt); + CanvasToImage(&pt); + ShowPos(pt); + ShowNoSize(); + + n = Globals.nAirBrushRadius; + for (i = 0; i < 5; i++) + { + j = rand(); + SetPixelV(hMemDC, pt.x + n / 2 - cos(j) * (rand() % n), + pt.y + n / 2 - sin(j) * (rand() % n), + (GetKeyState(VK_RBUTTON) < 0) ? Globals.rgbBack : + Globals.rgbFore); + } + Globals.fModified = TRUE; + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + } + ReleaseDC(hWnd, hDC); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + } + case WM_PAINT: { PAINTSTRUCT ps; diff --git a/programs/mspaint/main.c b/programs/mspaint/main.c index 3ab5c08..13a21be 100644 --- a/programs/mspaint/main.c +++ b/programs/mspaint/main.c @@ -291,9 +291,11 @@ static VOID PAINT_InitData(VOID) Globals.hcurPencil = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(5)); Globals.hcurFill = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(6)); Globals.hcurSpoit = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(7)); + Globals.hcurAirBrush = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(8)); Globals.hcurZoom = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(9)); Globals.hcurCross2 = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(12)); + Globals.nAirBrushRadius = 6; Globals.nEraserSize = 8; Globals.nLineWidth = 1; Globals.iFillStyle = 0; @@ -671,6 +673,40 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) InvertRect(hDC, &rc); break; + case TOOL_AIRBRUSH: + hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_AIRBRUSH)); + hbmOld = SelectObject(hdcMem, hbm); + BitBlt(hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, + hdcMem, 0, 0, SRCCOPY); + SelectObject(hdcMem, hbmOld); + DeleteObject(hbm); + + switch (Globals.nAirBrushRadius) + { + case 6: + rc.left = 5; + rc.top = 210; + rc.right = 27; + rc.bottom = 250; + break; + + case 10: + rc.left = 28; + rc.top = 210; + rc.right = 49; + rc.bottom = 250; + break; + + case 14: + rc.left = 5; + rc.top = 251; + rc.right = 49; + rc.bottom = 290; + break; + } + InvertRect(hDC, &rc); + break; + default: break; } @@ -718,7 +754,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_BOXSELECT: case TOOL_TEXT: case TOOL_BRUSH: - case TOOL_AIRBRUSH: NotSupportedYet(); break; @@ -827,6 +862,42 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) } break; + case TOOL_AIRBRUSH: + rc.left = 5; + rc.top = 210; + rc.right = 27; + rc.bottom = 250; + if (PtInRect(&rc, pt)) + { + Globals.nAirBrushRadius = 6; + InvalidateRect(Globals.hToolBox, NULL, TRUE); + UpdateWindow(Globals.hToolBox); + return; + } + rc.left = 28; + rc.top = 210; + rc.right = 49; + rc.bottom = 250; + if (PtInRect(&rc, pt)) + { + Globals.nAirBrushRadius = 10; + InvalidateRect(Globals.hToolBox, NULL, TRUE); + UpdateWindow(Globals.hToolBox); + return; + } + rc.left = 5; + rc.top = 251; + rc.right = 49; + rc.bottom = 290; + if (PtInRect(&rc, pt)) + { + Globals.nAirBrushRadius = 14; + InvalidateRect(Globals.hToolBox, NULL, TRUE); + UpdateWindow(Globals.hToolBox); + return; + } + break; + default: rc.left = 6; rc.top = 210; @@ -962,6 +1033,7 @@ VOID PAINT_OnDestroy(HWND hWnd) DestroyCursor(Globals.hcurPencil); DestroyCursor(Globals.hcurFill); DestroyCursor(Globals.hcurSpoit); + DestroyCursor(Globals.hcurAirBrush); DestroyCursor(Globals.hcurZoom); DestroyCursor(Globals.hcurCross2); KillTimer(Globals.hCanvasWnd, Globals.idTimer); diff --git a/programs/mspaint/main.h b/programs/mspaint/main.h index 9f7a1bb..cac043f 100644 --- a/programs/mspaint/main.h +++ b/programs/mspaint/main.h @@ -102,6 +102,7 @@ typedef struct HCURSOR hcurPencil; HCURSOR hcurFill; HCURSOR hcurSpoit; + HCURSOR hcurAirBrush; HCURSOR hcurZoom; HCURSOR hcurCross2; @@ -111,6 +112,7 @@ typedef struct INT nZoom; BOOL fShowGrid; + INT nAirBrushRadius; INT nEraserSize; INT nLineWidth; INT iFillStyle; diff --git a/programs/mspaint/resource.h b/programs/mspaint/resource.h index 2b0c084..58bd696 100644 --- a/programs/mspaint/resource.h +++ b/programs/mspaint/resource.h @@ -23,6 +23,7 @@ #define SELECTION_MENU 0x203 #define ID_ACCEL 0x204 #define IDB_TOOLS 0x205 +#define IDB_AIRBRUSH 0x206 #define IDB_ERASER 0x20B #define IDB_ZOOM 0x20C #define IDB_LINE 0x20D diff --git a/programs/mspaint/rsrc.rc b/programs/mspaint/rsrc.rc index 13269d9..6e264f8 100644 --- a/programs/mspaint/rsrc.rc +++ b/programs/mspaint/rsrc.rc @@ -61,6 +61,8 @@ IDI_PAINT ICON "paint.ico" /* @makedep: tools.bmp */ IDB_TOOLS BITMAP "tools.bmp" +/* @makedep: airbrush.bmp */ +IDB_AIRBRUSH BITMAP "airbrush.bmp" /* @makedep: eraser.bmp */ IDB_ERASER BITMAP "eraser.bmp" /* @makedep: zoom.bmp */ @@ -84,6 +86,8 @@ IDB_FILL BITMAP "fill.bmp" 6 CURSOR "flood.cur" /* @makedep: spoit.cur */ 7 CURSOR "spoit.cur" +/* @makedep: airbrush.cur */ +8 CURSOR "airbrush.cur" /* @makedep: zoom.cur */ 9 CURSOR "zoom.cur" /* @makedep: cross2.cur */ -- 1.6.0.2