|
|
1.1 root 1: /****************************************************************************/
2: /* */
3: /* Microsoft Confidential */
4: /* */
5: /* Copyright (c) Microsoft Corp. 1987, 1991 */
6: /* All Rights Reserved */
7: /* */
8: /****************************************************************************/
9: /****************************** Module Header *******************************
10: * Module Name: imagundo.c
11: *
12: * Contains routines for handling the Undo buffers.
13: *
14: * History:
15: *
16: ****************************************************************************/
17:
18: #include "imagedit.h"
19:
20:
21: STATICFN VOID NEAR ImageAllocUndo(VOID);
22:
23:
24:
25: /************************************************************************
26: * ImageUndo
27: *
28: * Undoes the last editing operation by restoring the image to the
29: * saved undo buffer.
30: *
31: * History:
32: *
33: ************************************************************************/
34:
35: VOID ImageUndo(VOID)
36: {
37: HDC hdcTemp;
38: HBITMAP hbmOld;
39:
40: /*
41: * Is there anything to undo?
42: */
43: if (!ghbmUndo)
44: return;
45:
46: hdcTemp = CreateCompatibleDC(ghdcImage);
47: hbmOld = SelectObject(hdcTemp, ghbmUndo);
48: BitBlt(ghdcImage, 0, 0, gcxImage, gcyImage, hdcTemp, 0, 0, SRCCOPY);
49:
50: /*
51: * For icons and cursors, restore the AND mask also.
52: */
53: if (giType != FT_BITMAP) {
54: SelectObject(hdcTemp, ghbmUndoMask);
55: BitBlt(ghdcANDMask, 0, 0, gcxImage, gcyImage, hdcTemp, 0, 0, SRCCOPY);
56: }
57:
58: SelectObject(hdcTemp, hbmOld);
59: DeleteDC(hdcTemp);
60:
61: fImageDirty = TRUE;
62:
63: /*
64: * Delete the undo buffer, now that it has been used.
65: */
66: ImageFreeUndo();
67:
68: ViewUpdate();
69: }
70:
71:
72:
73: /************************************************************************
74: * ImageUpdateUndo
75: *
76: * Makes a snapshot of the current image and places it in the undo
77: * buffer.
78: *
79: * Arguments:
80: *
81: * History:
82: *
83: ************************************************************************/
84:
85: VOID ImageUpdateUndo(VOID)
86: {
87: HDC hdcTemp;
88: HBITMAP hbmOld;
89:
90: /*
91: * If there are currently no undo buffers, allocate them now.
92: */
93: if (!ghbmUndo)
94: ImageAllocUndo();
95:
96: hdcTemp = CreateCompatibleDC(ghdcImage);
97: hbmOld = SelectObject(hdcTemp, ghbmUndo);
98: BitBlt(hdcTemp, 0, 0, gcxImage, gcyImage, ghdcImage, 0, 0, SRCCOPY);
99:
100: /*
101: * For icons and cursors, update the undo AND mask also.
102: */
103: if (giType != FT_BITMAP) {
104: SelectObject(hdcTemp, ghbmUndoMask);
105: BitBlt(hdcTemp, 0, 0, gcxImage, gcyImage, ghdcANDMask, 0, 0, SRCCOPY);
106: }
107:
108: SelectObject(hdcTemp, hbmOld);
109: DeleteDC(hdcTemp);
110: }
111:
112:
113:
114: /************************************************************************
115: * ImageAllocUndo
116: *
117: * Allocates buffers for an undo operation. For icons and cursors,
118: * this includes an AND mask undo buffer. This function does not
119: * initialize the bits. The function ImageFreeUndo frees the buffers
120: * allocated by this function.
121: *
122: * History:
123: *
124: ************************************************************************/
125:
126: STATICFN VOID NEAR ImageAllocUndo(VOID)
127: {
128: ImageFreeUndo();
129:
130: /*
131: * Allocate an undo bitmap of the specified size.
132: */
133: if (!(ghbmUndo = MyCreateBitmap(ghdcImage, gcxImage, gcyImage, 16))) {
134: Message(MSG_OUTOFMEMORY);
135: return;
136: }
137:
138: /*
139: * For icons and cursors, allocate an undo AND mask also.
140: */
141: if (giType != FT_BITMAP) {
142: if (!(ghbmUndoMask = CreateBitmap(gcxImage, gcyImage,
143: (BYTE)1, (BYTE)1, NULL))) {
144: ImageFreeUndo();
145: Message(MSG_OUTOFMEMORY);
146: return;
147: }
148: }
149: }
150:
151:
152:
153: /************************************************************************
154: * ImageFreeUndo
155: *
156: * Free's the undo buffers.
157: *
158: * History:
159: *
160: ************************************************************************/
161:
162: VOID ImageFreeUndo(VOID)
163: {
164: if (ghbmUndo) {
165: DeleteObject(ghbmUndo);
166: ghbmUndo = NULL;
167: }
168:
169: if (ghbmUndoMask) {
170: DeleteObject(ghbmUndoMask);
171: ghbmUndoMask = NULL;
172: }
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.