From af06faa9962175e35e4b9973190ec67d218b8ab6 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 25 Oct 2008 11:05:36 +0900 Subject: [PATCH] [11/19] paint: Add TOOL_BRUSH --- programs/paint/brush.bmp | Bin 0 -> 670 bytes programs/paint/canvas.c | 178 ++++++++++++++++++++++++++++++++++++++++++++- programs/paint/cross.cur | Bin 0 -> 326 bytes programs/paint/main.c | 38 +++++++++- programs/paint/main.h | 2 + programs/paint/resource.h | 1 + programs/paint/rsrc.rc | 4 + 7 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 programs/paint/brush.bmp create mode 100644 programs/paint/cross.cur diff --git a/programs/paint/brush.bmp b/programs/paint/brush.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d4c7ec0861f0e58238e0fa1aa9778b49933b36e5 GIT binary patch literal 670 zcmcJL%?-jZ3`PTs^vV=O;#_uM6K}#Q5$Yh#tw(w*QU&JoALRlPLQNGvC3ftm9**a2 z(zQq2`EJ1tK3ONv>)|ahbHYYUpIJOl#s|+@f9FX#^OXzUPuw$sIO%{KA*XeToxU)2}wxf8j;v)n;MF|B`c1e4<|T*7Uo1|B-A?&4c;n?!^M1k?cO| I<=HP@PnUvhDF6Tf literal 0 HcmV?d00001 diff --git a/programs/paint/canvas.c b/programs/paint/canvas.c index 070e5dc..c6aaade 100644 --- a/programs/paint/canvas.c +++ b/programs/paint/canvas.c @@ -73,6 +73,100 @@ VOID PrepareForUndo(VOID) Globals.sizImageUndo = Globals.sizImage; } +VOID DrawBrush(HDC hMemDC, INT x, INT y, COLORREF rgb) +{ + switch (Globals.iBrushType) + { + case 0: + Ellipse(hMemDC, x - 3, y - 3, x + 4, y + 4); + break; + + case 1: + Ellipse(hMemDC, x - 2, y - 2, x + 2, y + 2); + break; + + case 2: + SetPixel(hMemDC, x, y, rgb); + break; + + case 3: + Rectangle(hMemDC, x - 4, y - 4, x + 4, y + 4); + break; + + case 4: + Rectangle(hMemDC, x - 2, y - 2, x + 3, y + 3); + break; + + case 5: + Rectangle(hMemDC, x - 1, y - 1, x + 1, y + 1); + break; + + case 6: + MoveToEx(hMemDC, x + 4, y - 4, NULL); + LineTo(hMemDC, x - 4, y + 4); + break; + + case 7: + MoveToEx(hMemDC, x + 2, y - 2, NULL); + LineTo(hMemDC, x - 3, y + 3); + break; + + case 8: + MoveToEx(hMemDC, x + 1, y - 1, NULL); + LineTo(hMemDC, x - 1, y + 1); + break; + + case 9: + MoveToEx(hMemDC, x - 4, y - 4, NULL); + LineTo(hMemDC, x + 4, y + 4); + break; + + case 10: + MoveToEx(hMemDC, x - 2, y - 2, NULL); + LineTo(hMemDC, x + 3, y + 3); + break; + + case 11: + MoveToEx(hMemDC, x - 1, y - 1, NULL); + LineTo(hMemDC, x + 1, y + 1); + break; + } +} + +VOID CALLBACK ForeBrushDDAProc(INT x, INT y, LPARAM lParam) +{ + HBRUSH hbr; + HPEN hPen; + HGDIOBJ hbrOld, hpenOld; + HDC hMemDC = (HDC)lParam; + hPen = CreatePen(PS_SOLID, 0, Globals.rgbFore); + hbr = CreateSolidBrush(Globals.rgbFore); + hpenOld = SelectObject(hMemDC, hPen); + hbrOld = SelectObject(hMemDC, hbr); + DrawBrush(hMemDC, x, y, Globals.rgbFore); + SelectObject(hMemDC, hpenOld); + SelectObject(hMemDC, hbrOld); + DeleteObject(hPen); + DeleteObject(hbr); +} + +VOID CALLBACK BackBrushDDAProc(INT x, INT y, LPARAM lParam) +{ + HBRUSH hbr; + HPEN hPen; + HGDIOBJ hbrOld, hpenOld; + HDC hMemDC = (HDC)lParam; + hPen = CreatePen(PS_SOLID, 0, Globals.rgbBack); + hbr = CreateSolidBrush(Globals.rgbBack); + hpenOld = SelectObject(hMemDC, hPen); + hbrOld = SelectObject(hMemDC, hbr); + DrawBrush(hMemDC, x, y, Globals.rgbBack); + SelectObject(hMemDC, hpenOld); + SelectObject(hMemDC, hbrOld); + DeleteObject(hPen); + DeleteObject(hbr); +} + VOID Canvas_DrawBuffer(HDC hDC) { HDC hMemDC; @@ -130,6 +224,13 @@ VOID Canvas_DrawBuffer(HDC hDC) DeleteObject(hPen); break; + case TOOL_BRUSH: + if (Globals.fSwapColor) + BackBrushDDAProc(Globals.pt0.x, Globals.pt0.y, (LPARAM)hDC); + else + ForeBrushDDAProc(Globals.pt0.x, Globals.pt0.y, (LPARAM)hDC); + break; + case TOOL_BOX: case TOOL_ELLIPSE: case TOOL_ROUNDRECT: @@ -562,6 +663,29 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) } break; + case TOOL_BRUSH: + SetCursor(Globals.hcurCross); + Globals.mode = MODE_CANVAS; + SetCapture(hWnd); + CanvasToImage(&pt); + PrepareForUndo(); + hDC = GetDC(hWnd); + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + hbmOld = SelectObject(hMemDC, Globals.hbmImage); + if (fRight) + BackBrushDDAProc(pt.x, pt.y, (LPARAM)hMemDC); + else + ForeBrushDDAProc(pt.x, pt.y, (LPARAM)hMemDC); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + Globals.fModified = TRUE; + } + ReleaseDC(hWnd, hDC); + Globals.pt0 = pt; + break; + case TOOL_FILL: SetCursor(Globals.hcurFill); CanvasToImage(&pt); @@ -707,7 +831,6 @@ VOID Canvas_OnButtonDown(HWND hWnd, INT x, INT y, BOOL fRight) CanvasToImage(&pt); Globals.pt0 = Globals.pt1 = pt; break; - default: break; } @@ -822,6 +945,30 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown case MODE_CANVAS: switch (Globals.iToolSelect) { + case TOOL_BRUSH: + SetCursor(Globals.hcurCross); + CanvasToImage(&pt); + hDC = GetDC(hWnd); + if (hDC != NULL) + { + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HGDIOBJ hbmOld = SelectObject(hMemDC, Globals.hbmImage); + LineDDA(Globals.pt0.x, Globals.pt0.y, pt.x, pt.y, + ForeBrushDDAProc, (LPARAM)hMemDC); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + } + ReleaseDC(hWnd, hDC); + } + Globals.pt0 = pt; + ShowPos(pt); + ShowNoSize(); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_ERASER: SetCursor(NULL); CanvasToImage(&pt); @@ -961,6 +1108,25 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown { switch (Globals.iToolSelect) { + case TOOL_BRUSH: + SetCursor(Globals.hcurCross); + CanvasToImage(&pt); + hDC = GetDC(hWnd); + hMemDC = CreateCompatibleDC(hDC); + if (hMemDC != NULL) + { + HGDIOBJ hbmOld = SelectObject(hMemDC, Globals.hbmImage); + LineDDA(Globals.pt0.x, Globals.pt0.y, pt.x, pt.y, + BackBrushDDAProc, (LPARAM)hMemDC); + SelectObject(hMemDC, hbmOld); + DeleteDC(hMemDC); + } + ReleaseDC(hWnd, hDC); + Globals.pt0 = pt; + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_POLYGON: SetCursor(Globals.hcurCross2); CanvasToImage(&pt); @@ -1103,6 +1269,16 @@ VOID Canvas_OnMouseMove(HWND hWnd, INT x, INT y, BOOL fLeftDown, BOOL fRightDown UpdateWindow(hWnd); break; + case TOOL_BRUSH: + SetCursor(Globals.hcurCross); + CanvasToImage(&pt); + Globals.pt0 = pt; + ShowPos(pt); + ShowNoSize(); + InvalidateRect(hWnd, NULL, FALSE); + UpdateWindow(hWnd); + break; + case TOOL_ERASER: SetCursor(NULL); CanvasToImage(&pt); diff --git a/programs/paint/cross.cur b/programs/paint/cross.cur new file mode 100644 index 0000000000000000000000000000000000000000..18a8cb91eab30dc590514f4192a5d8d14ea8f18e GIT binary patch literal 326 zcmaKmISzm@3Yk8vb}W0V3j3%kJzY_diivMGMG l6it6?t-Z-AZy?EjUa^pH9XXV4$n^+~EPPMI|IyyZ61^Rog7yFa literal 0 HcmV?d00001 diff --git a/programs/paint/main.c b/programs/paint/main.c index 13a21be..455b587 100644 --- a/programs/paint/main.c +++ b/programs/paint/main.c @@ -293,11 +293,13 @@ static VOID PAINT_InitData(VOID) Globals.hcurSpoit = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(7)); Globals.hcurAirBrush = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(8)); Globals.hcurZoom = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(9)); + Globals.hcurCross = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(10)); Globals.hcurCross2 = LoadCursor(Globals.hInstance, MAKEINTRESOURCE(12)); Globals.nAirBrushRadius = 6; Globals.nEraserSize = 8; Globals.nLineWidth = 1; + Globals.iBrushType = 1; Globals.iFillStyle = 0; Globals.nZoom = 1; @@ -655,6 +657,21 @@ VOID ToolBox_OnPaint(HWND hWnd, HDC hDC) } break; + case TOOL_BRUSH: + hbm = LoadBitmap(Globals.hInstance, MAKEINTRESOURCE(IDB_BRUSH)); + 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); + + rc.left = 6 + (48 - 6) * (Globals.iBrushType % 3) / 3; + rc.right = rc.left + (48 - 6) / 3; + rc.top = 210 + (290 - 210) * (Globals.iBrushType / 3) / 4; + rc.bottom = rc.top + (290 - 210) / 4; + InvertRect(hDC, &rc); + break; + case TOOL_BOX: case TOOL_POLYGON: case TOOL_ROUNDRECT: @@ -753,7 +770,6 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) case TOOL_POLYSELECT: case TOOL_BOXSELECT: case TOOL_TEXT: - case TOOL_BRUSH: NotSupportedYet(); break; @@ -774,6 +790,25 @@ void ToolBox_OnLButton(HWND hWnd, int x, int y, BOOL fDown) switch (Globals.iToolSelect) { + case TOOL_BRUSH: + for (i = 0; i < 12; i++) + { + rc.left = 6 + (48 - 6) * (i % 3) / 3; + rc.right = rc.left + (48 - 6) / 3; + rc.top = 210 + (290 - 210) * (i / 3) / 4; + rc.bottom = rc.top + (290 - 210) / 4; + + if (PtInRect(&rc, pt)) + { + Globals.iBrushType = i; + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + } + Globals.pt0.x = Globals.pt0.y = 0xFFFFFFFF; + break; + case TOOL_BOX: case TOOL_ROUNDRECT: case TOOL_ELLIPSE: @@ -1035,6 +1070,7 @@ VOID PAINT_OnDestroy(HWND hWnd) DestroyCursor(Globals.hcurSpoit); DestroyCursor(Globals.hcurAirBrush); DestroyCursor(Globals.hcurZoom); + DestroyCursor(Globals.hcurCross); DestroyCursor(Globals.hcurCross2); KillTimer(Globals.hCanvasWnd, Globals.idTimer); if (Globals.pPolyline != NULL) diff --git a/programs/paint/main.h b/programs/paint/main.h index cac043f..ea128e0 100644 --- a/programs/paint/main.h +++ b/programs/paint/main.h @@ -104,6 +104,7 @@ typedef struct HCURSOR hcurSpoit; HCURSOR hcurAirBrush; HCURSOR hcurZoom; + HCURSOR hcurCross; HCURSOR hcurCross2; UINT idTimer; @@ -115,6 +116,7 @@ typedef struct INT nAirBrushRadius; INT nEraserSize; INT nLineWidth; + INT iBrushType; INT iFillStyle; INT xScrollPos; diff --git a/programs/paint/resource.h b/programs/paint/resource.h index 58bd696..83f6b5f 100644 --- a/programs/paint/resource.h +++ b/programs/paint/resource.h @@ -27,6 +27,7 @@ #define IDB_ERASER 0x20B #define IDB_ZOOM 0x20C #define IDB_LINE 0x20D +#define IDB_BRUSH 0x20E #define IDB_FILL 0x20F #define IDD_ZOOM 0x207 #define IDD_STRETCH_SKEW 0x208 diff --git a/programs/paint/rsrc.rc b/programs/paint/rsrc.rc index 6e264f8..a36b663 100644 --- a/programs/paint/rsrc.rc +++ b/programs/paint/rsrc.rc @@ -69,6 +69,8 @@ IDB_ERASER BITMAP "eraser.bmp" IDB_ZOOM BITMAP "zoom.bmp" /* @makedep: line.bmp */ IDB_LINE BITMAP "line.bmp" +/* @makedep: brush.bmp */ +IDB_BRUSH BITMAP "brush.bmp" /* @makedep: fill.bmp */ IDB_FILL BITMAP "fill.bmp" @@ -90,6 +92,8 @@ IDB_FILL BITMAP "fill.bmp" 8 CURSOR "airbrush.cur" /* @makedep: zoom.cur */ 9 CURSOR "zoom.cur" +/* @makedep: cross.cur */ +10 CURSOR "cross.cur" /* @makedep: cross2.cur */ 12 CURSOR "cross2.cur" -- 1.6.0.2