1 /* 2 * PROJECT: PAINT for ReactOS 3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) 4 * PURPOSE: Keep track of tool parameters, notify listeners 5 * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> 6 */ 7 8 #pragma once 9 10 enum TOOLTYPE 11 { 12 TOOL_FREESEL = 1, 13 TOOL_RECTSEL = 2, 14 TOOL_RUBBER = 3, 15 TOOL_FILL = 4, 16 TOOL_COLOR = 5, 17 TOOL_ZOOM = 6, 18 TOOL_PEN = 7, 19 TOOL_BRUSH = 8, 20 TOOL_AIRBRUSH = 9, 21 TOOL_TEXT = 10, 22 TOOL_LINE = 11, 23 TOOL_BEZIER = 12, 24 TOOL_RECT = 13, 25 TOOL_SHAPE = 14, 26 TOOL_ELLIPSE = 15, 27 TOOL_RRECT = 16, 28 TOOL_MAX = TOOL_RRECT, 29 }; 30 31 enum BrushStyle 32 { 33 BrushStyleRound, 34 BrushStyleSquare, 35 BrushStyleForeSlash, 36 BrushStyleBackSlash, 37 }; 38 39 /* CLASSES **********************************************************/ 40 41 struct ToolBase 42 { 43 HDC m_hdc; 44 COLORREF m_fg, m_bg; 45 46 ToolBase() : m_hdc(NULL) { } 47 virtual ~ToolBase() { } 48 49 virtual void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) { } 50 virtual BOOL OnMouseMove(BOOL bLeftButton, LONG& x, LONG& y) { return TRUE; } 51 virtual BOOL OnButtonUp(BOOL bLeftButton, LONG& x, LONG& y) { return TRUE; } 52 53 virtual void OnDrawOverlayOnImage(HDC hdc) { } 54 virtual void OnDrawOverlayOnCanvas(HDC hdc) { } 55 56 virtual void OnSpecialTweak(BOOL bMinus) { } 57 58 virtual void OnEndDraw(BOOL bCancel); 59 60 void beginEvent(); 61 void endEvent(); 62 void reset(); 63 64 static ToolBase* createToolObject(TOOLTYPE type); 65 }; 66 67 class ToolsModel 68 { 69 private: 70 int m_lineWidth; 71 INT m_penWidth; 72 INT m_brushWidth; 73 int m_shapeStyle; 74 BrushStyle m_brushStyle; 75 TOOLTYPE m_activeTool; 76 TOOLTYPE m_oldActiveTool; 77 INT m_airBrushRadius; 78 int m_rubberRadius; 79 BOOL m_transpBg; 80 int m_zoom; 81 ToolBase *m_pToolObject; 82 83 ToolBase *GetOrCreateTool(TOOLTYPE nTool); 84 85 public: 86 ToolsModel(); 87 ~ToolsModel(); 88 89 BOOL IsSelection() const; 90 91 int GetLineWidth() const; 92 void SetLineWidth(int nLineWidth); 93 void MakeLineThickerOrThinner(BOOL bThinner); 94 95 INT GetPenWidth() const; 96 void SetPenWidth(INT nPenWidth); 97 void MakePenThickerOrThinner(BOOL bThinner); 98 99 int GetShapeStyle() const; 100 void SetShapeStyle(int nShapeStyle); 101 102 INT GetBrushWidth() const; 103 void SetBrushWidth(INT nBrushWidth); 104 void MakeBrushThickerOrThinner(BOOL bThinner); 105 106 BrushStyle GetBrushStyle() const; 107 void SetBrushStyle(BrushStyle nBrushStyle); 108 109 TOOLTYPE GetActiveTool() const; 110 TOOLTYPE GetOldActiveTool() const; 111 void SetActiveTool(TOOLTYPE nActiveTool); 112 113 INT GetAirBrushRadius() const; 114 void SetAirBrushRadius(INT nAirBrushRadius); 115 void MakeAirBrushThickerOrThinner(BOOL bThinner); 116 117 int GetRubberRadius() const; 118 void SetRubberRadius(int nRubberRadius); 119 void MakeRubberThickerOrThinner(BOOL bThinner); 120 121 SIZE GetToolSize() const; 122 123 BOOL IsBackgroundTransparent() const; 124 void SetBackgroundTransparent(BOOL bTransparent); 125 126 int GetZoom() const; 127 void SetZoom(int nZoom); 128 129 void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick); 130 void OnMouseMove(BOOL bLeftButton, LONG x, LONG y); 131 void OnButtonUp(BOOL bLeftButton, LONG x, LONG y); 132 void OnEndDraw(BOOL bCancel); 133 void OnDrawOverlayOnImage(HDC hdc); 134 void OnDrawOverlayOnCanvas(HDC hdc); 135 136 void resetTool(); 137 void selectAll(); 138 139 void NotifyToolChanged(); 140 void NotifyToolSettingsChanged(); 141 void NotifyZoomChanged(); 142 143 void SpecialTweak(BOOL bMinus); 144 145 void DrawWithMouseTool(POINT pt, WPARAM wParam); 146 }; 147 148 extern ToolsModel toolsModel; 149 150 static inline int Zoomed(int xy) 151 { 152 return xy * toolsModel.GetZoom() / 1000; 153 } 154 155 static inline int UnZoomed(int xy) 156 { 157 return xy * 1000 / toolsModel.GetZoom(); 158 } 159 160 static inline void Zoomed(POINT& pt) 161 { 162 pt = { Zoomed(pt.x), Zoomed(pt.y) }; 163 } 164 165 static inline void Zoomed(RECT& rc) 166 { 167 rc = { Zoomed(rc.left), Zoomed(rc.top), Zoomed(rc.right), Zoomed(rc.bottom) }; 168 } 169 170 static inline void UnZoomed(POINT& pt) 171 { 172 pt = { UnZoomed(pt.x), UnZoomed(pt.y) }; 173 } 174 175 static inline void UnZoomed(RECT& rc) 176 { 177 rc = { UnZoomed(rc.left), UnZoomed(rc.top), UnZoomed(rc.right), UnZoomed(rc.bottom) }; 178 } 179