ReactOS 0.4.16-dev-2491-g3dc6630
ImageModel Class Reference

#include <history.h>

Collaboration diagram for ImageModel:

Public Member Functions

 ImageModel ()
 
virtual ~ImageModel ()
 
HDC GetDC ()
 
BOOL CanUndo () const
 
BOOL CanRedo () const
 
void PushImageForUndo ()
 
void PushImageForUndo (HBITMAP hbm)
 
void PushImageForUndo (const RECT &rcPartial)
 
void Undo (BOOL bClearRedo=FALSE)
 
void Redo (void)
 
void ClearHistory (void)
 
void Crop (int nWidth, int nHeight, int nOffsetX=0, int nOffsetY=0)
 
void SaveImage (LPCWSTR lpFileName)
 
BOOL IsImageSaved () const
 
void StretchSkew (int nStretchPercentX, int nStretchPercentY, int nSkewDegX=0, int nSkewDegY=0)
 
int GetWidth () const
 
int GetHeight () const
 
HBITMAP CopyBitmap ()
 
HBITMAP LockBitmap ()
 
void UnlockBitmap (HBITMAP hbmLocked)
 
void InvertColors ()
 
void FlipHorizontally ()
 
void FlipVertically ()
 
void RotateNTimes90Degrees (int iN)
 
void Clamp (POINT &pt) const
 
void NotifyImageChanged ()
 
BOOL IsBlackAndWhite ()
 
void PushBlackAndWhite ()
 

Protected Member Functions

void SwapPart ()
 
void PushDone ()
 

Protected Attributes

HDC m_hDrawingDC
 
HBITMAP m_hbmMaster
 
int m_currInd
 
int m_undoSteps
 
int m_redoSteps
 
IMAGE_PART m_historyItems [HISTORYSIZE]
 
HGDIOBJ m_hbmOld
 

Detailed Description

Definition at line 22 of file history.h.

Constructor & Destructor Documentation

◆ ImageModel()

ImageModel::ImageModel ( )

Definition at line 35 of file history.cpp.

37 , m_currInd(0)
38 , m_undoSteps(0)
39 , m_redoSteps(0)
40{
41 m_hbmMaster = CreateColorDIB(1, 1, RGB(255, 255, 255));
43
45}
BOOL g_imageSaved
Definition: main.cpp:21
int m_undoSteps
Definition: history.h:59
HGDIOBJ m_hbmOld
Definition: history.h:62
int m_redoSteps
Definition: history.h:60
HBITMAP m_hbmMaster
Definition: history.h:57
int m_currInd
Definition: history.h:58
HDC m_hDrawingDC
Definition: history.h:56
HBITMAP CreateColorDIB(int width, int height, COLORREF rgb)
Definition: dib.cpp:65
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define RGB(r, g, b)
Definition: precomp.h:67
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)

◆ ~ImageModel()

ImageModel::~ImageModel ( )
virtual

Definition at line 47 of file history.cpp.

48{
53}
void ClearHistory(void)
Definition: history.cpp:114
pKey DeleteObject()
BOOL WINAPI DeleteDC(_In_ HDC)

Member Function Documentation

◆ CanRedo()

BOOL ImageModel::CanRedo ( ) const
inline

Definition at line 30 of file history.h.

30{ return m_redoSteps > 0; }

Referenced by CMainWindow::CanRedo(), and Redo().

◆ CanUndo()

BOOL ImageModel::CanUndo ( ) const
inline

Definition at line 29 of file history.h.

29{ return m_undoSteps > 0; }

Referenced by CMainWindow::CanUndo(), and Undo().

◆ Clamp()

void ImageModel::Clamp ( POINT pt) const

Definition at line 315 of file history.cpp.

316{
317 pt.x = max(0, min(pt.x, GetWidth()));
318 pt.y = max(0, min(pt.y, GetHeight()));
319}
int GetWidth() const
Definition: history.cpp:254
int GetHeight() const
Definition: history.cpp:259
#define pt(x, y)
Definition: drawing.c:79
#define min(a, b)
Definition: monoChain.cc:55
#define max(a, b)
Definition: svc.c:63

Referenced by SelectionBaseTool::OnButtonDown(), SelectionBaseTool::OnButtonUp(), TextTool::OnButtonUp(), SelectionBaseTool::OnMouseMove(), and TextTool::UpdatePoint().

◆ ClearHistory()

void ImageModel::ClearHistory ( void  )

Definition at line 114 of file history.cpp.

115{
116 for (int i = 0; i < HISTORYSIZE; ++i)
117 {
119 }
120
121 m_undoSteps = 0;
122 m_redoSteps = 0;
123}
#define HISTORYSIZE
Definition: history.h:11
IMAGE_PART m_historyItems[HISTORYSIZE]
Definition: history.h:61
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void clear()
Definition: history.cpp:15

Referenced by Crop(), DoLoadImageFile(), InitializeImage(), CMainWindow::OnCommand(), CCanvasWindow::OnPaint(), PushImageForUndo(), SetBitmapAndInfo(), and ~ImageModel().

◆ CopyBitmap()

HBITMAP ImageModel::CopyBitmap ( )

Definition at line 321 of file history.cpp.

322{
326 return ret;
327}
static HBITMAP CopyDIBImage(HBITMAP hbm, INT cx=0, INT cy=0)
Definition: dib.h:19
HBITMAP LockBitmap()
Definition: history.cpp:346
void UnlockBitmap(HBITMAP hbmLocked)
Definition: history.cpp:355
static HBITMAP hBitmap
Definition: timezone.c:26
return ret
Definition: mutex.c:146
static HBITMAP
Definition: button.c:44

Referenced by PushImageForUndo().

◆ Crop()

void ImageModel::Crop ( int  nWidth,
int  nHeight,
int  nOffsetX = 0,
int  nOffsetY = 0 
)

Definition at line 191 of file history.cpp.

192{
193 // We cannot create bitmaps of size zero
194 if (nWidth <= 0)
195 nWidth = 1;
196 if (nHeight <= 0)
197 nHeight = 1;
198
199 // Create a white HBITMAP
200 HBITMAP hbmNew = CreateColorDIB(nWidth, nHeight, RGB(255, 255, 255));
201 if (!hbmNew)
202 {
204 ClearHistory();
205 return;
206 }
207
208 // Put the master image as a sub-image
209 RECT rcPart = { -nOffsetX, -nOffsetY, GetWidth() - nOffsetX, GetHeight() - nOffsetY };
210 HBITMAP hbmOld = imageModel.LockBitmap();
211 putSubImage(hbmNew, rcPart, hbmOld);
212 imageModel.UnlockBitmap(hbmOld);
213
214 // Push it
215 PushImageForUndo(hbmNew);
216
218}
void ShowOutOfMemory(void)
Definition: main.cpp:34
void PushImageForUndo()
Definition: history.cpp:125
void NotifyImageChanged()
Definition: history.cpp:23
void putSubImage(HBITMAP hbmWhole, const RECT &rcPartial, HBITMAP hbmPart)
Definition: dib.cpp:429
ImageModel imageModel
Definition: history.cpp:11

Referenced by CMainWindow::InsertSelectionFromHBITMAP(), CCanvasWindow::OnButtonUp(), and CMainWindow::OnCommand().

◆ FlipHorizontally()

void ImageModel::FlipHorizontally ( )

Definition at line 277 of file history.cpp.

278{
280 StretchBlt(m_hDrawingDC, GetWidth() - 1, 0, -GetWidth(), GetHeight(), GetDC(), 0, 0,
283}
HDC GetDC()
Definition: history.cpp:272
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333

Referenced by CMainWindow::OnCommand().

◆ FlipVertically()

void ImageModel::FlipVertically ( )

Definition at line 285 of file history.cpp.

286{
288 StretchBlt(m_hDrawingDC, 0, GetHeight() - 1, GetWidth(), -GetHeight(), GetDC(), 0, 0,
291}

Referenced by CMainWindow::OnCommand().

◆ GetDC()

◆ GetHeight()

◆ GetWidth()

◆ InvertColors()

void ImageModel::InvertColors ( )

Definition at line 264 of file history.cpp.

265{
266 RECT rect = {0, 0, GetWidth(), GetHeight()};
270}
& rect
Definition: startmenu.cpp:1413
BOOL WINAPI InvertRect(_In_ HDC, _In_ LPCRECT)

Referenced by CMainWindow::OnCommand().

◆ IsBlackAndWhite()

BOOL ImageModel::IsBlackAndWhite ( )

Definition at line 329 of file history.cpp.

330{
332 BOOL bBlackAndWhite = IsBitmapBlackAndWhite(hBitmap);
334 return bBlackAndWhite;
335}
BOOL IsBitmapBlackAndWhite(HBITMAP hbm)
Definition: dib.cpp:581
unsigned int BOOL
Definition: ntddk_ex.h:94

Referenced by CMainWindow::OnCommand(), and CAttributesDialog::OnInitDialog().

◆ IsImageSaved()

BOOL ImageModel::IsImageSaved ( ) const

Definition at line 225 of file history.cpp.

226{
227 return g_imageSaved;
228}

Referenced by CMainWindow::ConfirmSave(), and OpenMailer().

◆ LockBitmap()

HBITMAP ImageModel::LockBitmap ( )

Definition at line 346 of file history.cpp.

347{
348 // NOTE: An app cannot select a bitmap into more than one device context at a time.
349 ::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
350 HBITMAP hbmLocked = m_hbmMaster;
352 return hbmLocked;
353}

Referenced by CopyBitmap(), Crop(), SelectionModel::GetSelectionContents(), IsBlackAndWhite(), OpenMailer(), PushBlackAndWhite(), PushImageForUndo(), RegistrySettings::SetWallpaper(), and SwapPart().

◆ NotifyImageChanged()

void ImageModel::NotifyImageChanged ( )

◆ PushBlackAndWhite()

void ImageModel::PushBlackAndWhite ( )

Definition at line 337 of file history.cpp.

338{
342
343 PushImageForUndo(hNewBitmap);
344}
HBITMAP ConvertToBlackAndWhite(HBITMAP hbm)
Definition: dib.cpp:632

Referenced by CMainWindow::OnCommand().

◆ PushDone()

void ImageModel::PushDone ( )
protected

Definition at line 179 of file history.cpp.

180{
181 m_currInd = (m_currInd + 1) % HISTORYSIZE; // Go next
182
183 if (m_undoSteps < HISTORYSIZE - 1)
184 m_undoSteps++;
185 m_redoSteps = 0;
186
189}
#define FALSE
Definition: types.h:117

Referenced by PushImageForUndo().

◆ PushImageForUndo() [1/3]

◆ PushImageForUndo() [2/3]

void ImageModel::PushImageForUndo ( const RECT rcPartial)

Definition at line 158 of file history.cpp.

159{
160 ATLTRACE("%s: %d\n", __FUNCTION__, m_currInd);
161
163 part.clear();
164 part.m_bPartial = TRUE;
165 part.m_rcPart = rcPartial;
166
167 CRect rcImage = { 0, 0, GetWidth(), GetHeight() };
168 CRect& rc = part.m_rcPart;
169 if (!rc.IntersectRect(rc, rcImage))
170 rc.SetRect(-1, -1, 0, 0);
171
172 HBITMAP hbmMaster = LockBitmap();
173 part.m_hbmImage = getSubImage(hbmMaster, rc);
174 UnlockBitmap(hbmMaster);
175
176 PushDone();
177}
#define ATLTRACE(format,...)
Definition: atltrace.h:269
BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) noexcept
Definition: atltypes.h:346
void SetRect(int x1, int y1, int x2, int y2) noexcept
Definition: atltypes.h:423
void PushDone()
Definition: history.cpp:179
HBITMAP getSubImage(HBITMAP hbmWhole, const RECT &rcPartial)
Definition: dib.cpp:410
#define __FUNCTION__
Definition: types.h:116
CRect m_rcPart
Definition: history.h:15
HBITMAP m_hbmImage
Definition: history.h:16
BOOL m_bPartial
Definition: history.h:17

◆ PushImageForUndo() [3/3]

void ImageModel::PushImageForUndo ( HBITMAP  hbm)

Definition at line 138 of file history.cpp.

139{
140 ATLTRACE("%s: %d\n", __FUNCTION__, m_currInd);
141
142 if (hbm == NULL)
143 {
145 ClearHistory();
146 return;
147 }
148
150 part.clear();
151 part.m_hbmImage = m_hbmMaster;
154
155 PushDone();
156}

◆ Redo()

void ImageModel::Redo ( void  )

Definition at line 94 of file history.cpp.

95{
96 ATLTRACE("%s: %d\n", __FUNCTION__, m_redoSteps);
97 if (!CanRedo())
98 return;
99
101
103 SwapPart();
104 m_currInd = (m_currInd + 1) % HISTORYSIZE; // Go next
106
107 m_redoSteps--;
108 if (m_undoSteps < HISTORYSIZE - 1)
109 m_undoSteps++;
110
112}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
SelectionModel selectionModel
void SwapPart()
Definition: history.cpp:55
BOOL CanRedo() const
Definition: history.h:30

Referenced by CMainWindow::OnCommand().

◆ RotateNTimes90Degrees()

void ImageModel::RotateNTimes90Degrees ( int  iN)

Definition at line 293 of file history.cpp.

294{
295 switch (iN)
296 {
297 case 1:
298 case 3:
299 {
302 break;
303 }
304 case 2:
305 {
309 break;
310 }
311 }
313}
HBITMAP Rotate90DegreeBlt(HDC hDC1, INT cx, INT cy, BOOL bRight, BOOL bMono)
Definition: dib.cpp:313

Referenced by CMainWindow::OnCommand().

◆ SaveImage()

void ImageModel::SaveImage ( LPCWSTR  lpFileName)

Definition at line 220 of file history.cpp.

221{
223}
BOOL SaveDIBToFile(HBITMAP hBitmap, LPCWSTR FileName, BOOL fIsMainFile, REFGUID guidFileType)
Definition: dib.cpp:151
_In_ LPCSTR lpFileName
Definition: winbase.h:2824

Referenced by CMainWindow::saveImage().

◆ StretchSkew()

void ImageModel::StretchSkew ( int  nStretchPercentX,
int  nStretchPercentY,
int  nSkewDegX = 0,
int  nSkewDegY = 0 
)

Definition at line 230 of file history.cpp.

231{
232 int oldWidth = GetWidth();
233 int oldHeight = GetHeight();
234 INT newWidth = oldWidth * nStretchPercentX / 100;
235 INT newHeight = oldHeight * nStretchPercentY / 100;
236 if (oldWidth != newWidth || oldHeight != newHeight)
237 {
238 HBITMAP hbm0 = CopyDIBImage(m_hbmMaster, newWidth, newHeight);
239 PushImageForUndo(hbm0);
240 }
241 if (nSkewDegX)
242 {
243 HBITMAP hbm1 = SkewDIB(m_hDrawingDC, m_hbmMaster, nSkewDegX, FALSE);
244 PushImageForUndo(hbm1);
245 }
246 if (nSkewDegY)
247 {
248 HBITMAP hbm2 = SkewDIB(m_hDrawingDC, m_hbmMaster, nSkewDegY, TRUE);
249 PushImageForUndo(hbm2);
250 }
252}
HBITMAP SkewDIB(HDC hDC1, HBITMAP hbm, INT nDegree, BOOL bVertical, BOOL bMono)
Definition: dib.cpp:352
int32_t INT
Definition: typedefs.h:58

Referenced by CMainWindow::OnCommand().

◆ SwapPart()

void ImageModel::SwapPart ( )
protected

Definition at line 55 of file history.cpp.

56{
58 if (!part.m_bPartial)
59 {
61 return;
62 }
63
64 HBITMAP hbmMaster = LockBitmap();
65 HBITMAP hbmPart = getSubImage(hbmMaster, part.m_rcPart);
66 putSubImage(hbmMaster, part.m_rcPart, part.m_hbmImage);
68 part.m_hbmImage = hbmPart;
69 UnlockBitmap(hbmMaster);
70}
#define Swap(a, b)
Definition: geom.c:201

Referenced by Redo(), and Undo().

◆ Undo()

void ImageModel::Undo ( BOOL  bClearRedo = FALSE)

Definition at line 72 of file history.cpp.

73{
74 ATLTRACE("%s: %d\n", __FUNCTION__, m_undoSteps);
75 if (!CanUndo())
76 return;
77
79
80 m_currInd = (m_currInd + HISTORYSIZE - 1) % HISTORYSIZE; // Go previous
82 SwapPart();
84
86 if (bClearRedo)
87 m_redoSteps = 0;
88 else if (m_redoSteps < HISTORYSIZE - 1)
90
92}
BOOL CanUndo() const
Definition: history.h:29

Referenced by CMainWindow::OnCommand().

◆ UnlockBitmap()

Member Data Documentation

◆ m_currInd

int ImageModel::m_currInd
protected

Definition at line 58 of file history.h.

Referenced by PushDone(), PushImageForUndo(), Redo(), SwapPart(), and Undo().

◆ m_hbmMaster

HBITMAP ImageModel::m_hbmMaster
protected

◆ m_hbmOld

HGDIOBJ ImageModel::m_hbmOld
protected

Definition at line 62 of file history.h.

Referenced by ImageModel(), LockBitmap(), UnlockBitmap(), and ~ImageModel().

◆ m_hDrawingDC

◆ m_historyItems

IMAGE_PART ImageModel::m_historyItems[HISTORYSIZE]
protected

Definition at line 61 of file history.h.

Referenced by ClearHistory(), PushImageForUndo(), and SwapPart().

◆ m_redoSteps

int ImageModel::m_redoSteps
protected

Definition at line 60 of file history.h.

Referenced by CanRedo(), ClearHistory(), PushDone(), Redo(), and Undo().

◆ m_undoSteps

int ImageModel::m_undoSteps
protected

Definition at line 59 of file history.h.

Referenced by CanUndo(), ClearHistory(), PushDone(), Redo(), and Undo().


The documentation for this class was generated from the following files: