IMAGUNDO.C

/****************************************************************************/ 
/* */
/* Copyright (C) 1987-1996 Microsoft Corp. */
/* All Rights Reserved */
/* */
/****************************************************************************/
/****************************** Module Header *******************************
* Module Name: imagundo.c
*
* Contains routines for handling the Undo buffers.
*
* History:
*
****************************************************************************/

#include "imagedit.h"


STATICFN VOID NEAR ImageAllocUndo(VOID);



/************************************************************************
* ImageUndo
*
* Undoes the last editing operation by restoring the image to the
* saved undo buffer.
*
* History:
*
************************************************************************/

VOID ImageUndo(VOID)
{
HDC hdcTemp;
HBITMAP hbmOld;

/*
* Is there anything to undo?
*/
if (!ghbmUndo)
return;

hdcTemp = CreateCompatibleDC(ghdcImage);
hbmOld = SelectObject(hdcTemp, ghbmUndo);
BitBlt(ghdcImage, 0, 0, gcxImage, gcyImage, hdcTemp, 0, 0, SRCCOPY);

/*
* For icons and cursors, restore the AND mask also.
*/
if (giType != FT_BITMAP) {
SelectObject(hdcTemp, ghbmUndoMask);
BitBlt(ghdcANDMask, 0, 0, gcxImage, gcyImage, hdcTemp, 0, 0, SRCCOPY);
}

SelectObject(hdcTemp, hbmOld);
DeleteDC(hdcTemp);

fImageDirty = TRUE;

/*
* Delete the undo buffer, now that it has been used.
*/
ImageFreeUndo();

ViewUpdate();
}



/************************************************************************
* ImageUpdateUndo
*
* Makes a snapshot of the current image and places it in the undo
* buffer.
*
* Arguments:
*
* History:
*
************************************************************************/

VOID ImageUpdateUndo(VOID)
{
HDC hdcTemp;
HBITMAP hbmOld;

/*
* If there are currently no undo buffers, allocate them now.
*/
if (!ghbmUndo)
ImageAllocUndo();

hdcTemp = CreateCompatibleDC(ghdcImage);
hbmOld = SelectObject(hdcTemp, ghbmUndo);
BitBlt(hdcTemp, 0, 0, gcxImage, gcyImage, ghdcImage, 0, 0, SRCCOPY);

/*
* For icons and cursors, update the undo AND mask also.
*/
if (giType != FT_BITMAP) {
SelectObject(hdcTemp, ghbmUndoMask);
BitBlt(hdcTemp, 0, 0, gcxImage, gcyImage, ghdcANDMask, 0, 0, SRCCOPY);
}

SelectObject(hdcTemp, hbmOld);
DeleteDC(hdcTemp);
}



/************************************************************************
* ImageAllocUndo
*
* Allocates buffers for an undo operation. For icons and cursors,
* this includes an AND mask undo buffer. This function does not
* initialize the bits. The function ImageFreeUndo frees the buffers
* allocated by this function.
*
* History:
*
************************************************************************/

STATICFN VOID NEAR ImageAllocUndo(VOID)
{
ImageFreeUndo();

/*
* Allocate an undo bitmap of the specified size.
*/
if (!(ghbmUndo = MyCreateBitmap(ghdcImage, gcxImage, gcyImage, 16))) {
Message(MSG_OUTOFMEMORY);
return;
}

/*
* For icons and cursors, allocate an undo AND mask also.
*/
if (giType != FT_BITMAP) {
if (!(ghbmUndoMask = CreateBitmap(gcxImage, gcyImage,
(BYTE)1, (BYTE)1, NULL))) {
ImageFreeUndo();
Message(MSG_OUTOFMEMORY);
return;
}
}
}



/************************************************************************
* ImageFreeUndo
*
* Free's the undo buffers.
*
* History:
*
************************************************************************/

VOID ImageFreeUndo(VOID)
{
if (ghbmUndo) {
DeleteObject(ghbmUndo);
ghbmUndo = NULL;
}

if (ghbmUndoMask) {
DeleteObject(ghbmUndoMask);
ghbmUndoMask = NULL;
}
}