Reactos
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
10enum 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
31enum BrushStyle
32{
33 BrushStyleRound,
34 BrushStyleSquare,
35 BrushStyleForeSlash,
36 BrushStyleBackSlash,
37};
38
39/* CLASSES **********************************************************/
40
41struct 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
67class ToolsModel
68{
69private:
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
85public:
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
148extern ToolsModel toolsModel;
149
150static inline int Zoomed(int xy)
151{
152 return xy * toolsModel.GetZoom() / 1000;
153}
154
155static inline int UnZoomed(int xy)
156{
157 return xy * 1000 / toolsModel.GetZoom();
158}
159
160static inline void Zoomed(POINT& pt)
161{
162 pt = { Zoomed(pt.x), Zoomed(pt.y) };
163}
164
165static inline void Zoomed(RECT& rc)
166{
167 rc = { Zoomed(rc.left), Zoomed(rc.top), Zoomed(rc.right), Zoomed(rc.bottom) };
168}
169
170static inline void UnZoomed(POINT& pt)
171{
172 pt = { UnZoomed(pt.x), UnZoomed(pt.y) };
173}
174
175static inline void UnZoomed(RECT& rc)
176{
177 rc = { UnZoomed(rc.left), UnZoomed(rc.top), UnZoomed(rc.right), UnZoomed(rc.bottom) };
178}