Something went wrong. Try again.
Reactos
Something went wrong. Try again.
4.3 kB · 178 lines
C
at listview
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179/* * PROJECT: PAINT for ReactOS * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) * PURPOSE: Keep track of tool parameters, notify listeners * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> */
#pragma once
enum TOOLTYPE{ TOOL_FREESEL = 1, TOOL_RECTSEL = 2, TOOL_RUBBER = 3, TOOL_FILL = 4, TOOL_COLOR = 5, TOOL_ZOOM = 6, TOOL_PEN = 7, TOOL_BRUSH = 8, TOOL_AIRBRUSH = 9, TOOL_TEXT = 10, TOOL_LINE = 11, TOOL_BEZIER = 12, TOOL_RECT = 13, TOOL_SHAPE = 14, TOOL_ELLIPSE = 15, TOOL_RRECT = 16, TOOL_MAX = TOOL_RRECT,};
enum BrushStyle{ BrushStyleRound, BrushStyleSquare, BrushStyleForeSlash, BrushStyleBackSlash,};
/* CLASSES **********************************************************/
struct ToolBase{ HDC m_hdc; COLORREF m_fg, m_bg;
ToolBase() : m_hdc(NULL) { } virtual ~ToolBase() { }
virtual void OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) { } virtual BOOL OnMouseMove(BOOL bLeftButton, LONG& x, LONG& y) { return TRUE; } virtual BOOL OnButtonUp(BOOL bLeftButton, LONG& x, LONG& y) { return TRUE; }
virtual void OnDrawOverlayOnImage(HDC hdc) { } virtual void OnDrawOverlayOnCanvas(HDC hdc) { }
virtual void OnSpecialTweak(BOOL bMinus) { }
virtual void OnEndDraw(BOOL bCancel);
void beginEvent(); void endEvent(); void reset();
static ToolBase* createToolObject(TOOLTYPE type);};
class ToolsModel{private: int m_lineWidth; INT m_penWidth; INT m_brushWidth; int m_shapeStyle; BrushStyle m_brushStyle; TOOLTYPE m_activeTool; TOOLTYPE m_oldActiveTool; INT m_airBrushRadius; int m_rubberRadius; BOOL m_transpBg; int m_zoom; ToolBase *m_pToolObject;
ToolBase *GetOrCreateTool(TOOLTYPE nTool);
public: ToolsModel(); ~ToolsModel();
BOOL IsSelection() const;
int GetLineWidth() const; void SetLineWidth(int nLineWidth); void MakeLineThickerOrThinner(BOOL bThinner);
INT GetPenWidth() const; void SetPenWidth(INT nPenWidth); void MakePenThickerOrThinner(BOOL bThinner);
int GetShapeStyle() const; void SetShapeStyle(int nShapeStyle);
INT GetBrushWidth() const; void SetBrushWidth(INT nBrushWidth); void MakeBrushThickerOrThinner(BOOL bThinner);
BrushStyle GetBrushStyle() const; void SetBrushStyle(BrushStyle nBrushStyle);
TOOLTYPE GetActiveTool() const; TOOLTYPE GetOldActiveTool() const; void SetActiveTool(TOOLTYPE nActiveTool);
INT GetAirBrushRadius() const; void SetAirBrushRadius(INT nAirBrushRadius); void MakeAirBrushThickerOrThinner(BOOL bThinner);
int GetRubberRadius() const; void SetRubberRadius(int nRubberRadius); void MakeRubberThickerOrThinner(BOOL bThinner);
SIZE GetToolSize() const;
BOOL IsBackgroundTransparent() const; 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 OnEndDraw(BOOL bCancel); void OnDrawOverlayOnImage(HDC hdc); void OnDrawOverlayOnCanvas(HDC hdc);
void resetTool(); void selectAll();
void NotifyToolChanged(); void NotifyToolSettingsChanged(); void NotifyZoomChanged();
void SpecialTweak(BOOL bMinus);
void DrawWithMouseTool(POINT pt, WPARAM wParam);};
extern ToolsModel toolsModel;
static inline int Zoomed(int xy){ return xy * toolsModel.GetZoom() / 1000;}
static inline int UnZoomed(int xy){ return xy * 1000 / toolsModel.GetZoom();}
static inline void Zoomed(POINT& pt){ pt = { Zoomed(pt.x), Zoomed(pt.y) };}
static inline void Zoomed(RECT& rc){ rc = { Zoomed(rc.left), Zoomed(rc.top), Zoomed(rc.right), Zoomed(rc.bottom) };}
static inline void UnZoomed(POINT& pt){ pt = { UnZoomed(pt.x), UnZoomed(pt.y) };}
static inline void UnZoomed(RECT& rc){ rc = { UnZoomed(rc.left), UnZoomed(rc.top), UnZoomed(rc.right), UnZoomed(rc.bottom) };}