rnd-20100313-1-src
[rocksndiamonds.git] / src / game_sp / Capture.c
1 // ----------------------------------------------------------------------------
2 // Capture.c
3 // ----------------------------------------------------------------------------
4
5 #include "Capture.h"
6
7 #if 0
8
9 // static char *VB_Name = "CaptureModule";
10
11 // --------------------------------------------------------------------
12 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
13 //
14 // Visual Basic 4.0 16/32 Capture Routines
15 //
16 // This module contains several routines for capturing windows into a
17 // picture.  All the routines work on both 16 and 32 bit Windows
18 // platforms.
19 // The routines also have palette support.
20 //
21 // CreateBitmapPicture - Creates a picture object from a bitmap and
22 // palette.
23 // CaptureWindow - Captures any window given a window handle.
24 // CaptureActiveWindow - Captures the active window on the desktop.
25 // CaptureForm - Captures the entire form.
26 // CaptureClient - Captures the client area of a form.
27 // CaptureScreen - Captures the entire screen.
28 // PrintPictureToFitPage - prints any picture as big as possible on
29 // the page.
30 //
31 // NOTES
32 //    - No error trapping is included in these routines.
33 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
34 //
35 // --- Option Explicit
36 // --- Option Base 0
37
38 // ::: #ifndef HAS_PALETTEENTRY
39 // ::: typedef struct
40 // ::: {
41 // :::   byte peRed;
42 // :::   byte peGreen;
43 // :::   byte peBlue;
44 // :::   byte peFlags;
45 // ::: } PALETTEENTRY;
46 // ::: #define HAS_PALETTEENTRY
47 // ::: #endif
48
49 // ::: #ifndef HAS_LOGPALETTE
50 // ::: typedef struct
51 // ::: {
52 // :::   int palVersion;
53 // :::   int palNumEntries;
54 // :::   PALETTEENTRY palPalEntry[255];  // Enough for 256 colors.
55 // ::: } LOGPALETTE;
56 // ::: #define HAS_LOGPALETTE
57 // ::: #endif
58
59 // ::: #ifndef HAS_GUID
60 // ::: typedef struct
61 // ::: {
62 // :::   long Data1;
63 // :::   int Data2;
64 // :::   int Data3;
65 // :::   byte Data4[7];
66 // ::: } GUID;
67 // ::: #define HAS_GUID
68 // ::: #endif
69
70 #if Win32
71
72 #define RASTERCAPS                      (38)
73 #define RC_PALETTE                      (0x100)
74 #define SIZEPALETTE                     (104)
75
76 // ::: #ifndef HAS_RECT
77 // ::: typedef struct
78 // ::: {
79 // :::   long left;
80 // :::   long top;
81 // :::   long right;
82 // :::   long bottom;
83 // ::: } RECT;
84 // ::: #define HAS_RECT
85 // ::: #endif
86
87 long CreateCompatibleDC(long hDC);
88 long CreateCompatibleBitmap(long hDC, long nWidth, long nHeight);
89 long GetDeviceCaps(long hDC, long iCapabilitiy);
90 long GetSystemPaletteEntries(long hDC, long wStartIndex, long wNumEntries, PALETTEENTRY lpPaletteEntries);
91 long CreatePalette(LOGPALETTE lpLogPalette);
92 long SelectObject(long hDC, long hObject);
93 long BitBlt(long hDCDest, long XDest, long YDest, long nWidth, long nHeight, long hDCSrc, long XSrc, long YSrc, long dwRop);
94 long DeleteDC(long hDC);
95 long GetForegroundWindow();
96 long SelectPalette(long hDC, long hPalette, long bForceBackground);
97 long RealizePalette(long hDC);
98 long GetWindowDC(long hWnd);
99 long GetDC(long hWnd);
100 #if 0
101 long GetWindowRect(long hWnd, RECT lpRect);
102 #endif
103 long ReleaseDC(long hWnd, long hDC);
104 long GetDesktopWindow();
105
106 // ::: #ifndef HAS_PicBmp
107 // ::: typedef struct
108 // ::: {
109 // :::   long Size;
110 // :::   long Type;
111 // :::   long hBmp;
112 // :::   long hPal;
113 // :::   long Reserved;
114 // ::: } PicBmp;
115 // ::: #define HAS_PicBmp
116 // ::: #endif
117
118 long OleCreatePictureIndirect(PicBmp PicDesc, GUID RefIID, long fPictureOwnsHandle, IPicture IPic);
119
120 #elif Win16
121
122 #define RASTERCAPS                      (38)
123 #define RC_PALETTE                      (0x100)
124 #define SIZEPALETTE                     (104)
125
126 // ::: #ifndef HAS_RECT
127 // ::: typedef struct
128 // ::: {
129 // :::   int left;
130 // :::   int top;
131 // :::   int right;
132 // :::   int bottom;
133 // ::: } RECT;
134 // ::: #define HAS_RECT
135 // ::: #endif
136
137 int CreateCompatibleDC(int hDC);
138 int CreateCompatibleBitmap(int hDC, int nWidth, int nHeight);
139 int GetDeviceCaps(int hDC, int iCapabilitiy);
140 int GetSystemPaletteEntries(int hDC, int wStartIndex, int wNumEntries, PALETTEENTRY lpPaletteEntries);
141 int CreatePalette(LOGPALETTE lpLogPalette);
142 int SelectObject(int hDC, int hObject);
143 int BitBlt(int hDCDest, int XDest, int YDest, int nWidth, int nHeight, int hDCSrc, int XSrc, int YSrc, long dwRop);
144 int DeleteDC(int hDC);
145 int GetForegroundWindow();
146 int SelectPalette(int hDC, int hPalette, int bForceBackground);
147 int RealizePalette(int hDC);
148 int GetWindowDC(int hWnd);
149 int GetDC(int hWnd);
150 #if 0
151 int GetWindowRect(int hWnd, RECT lpRect);
152 #endif
153 int ReleaseDC(int hWnd, int hDC);
154 int GetDesktopWindow();
155
156 // ::: #ifndef HAS_PicBmp
157 // ::: typedef struct
158 // ::: {
159 // :::   int Size;
160 // :::   int Type;
161 // :::   int hBmp;
162 // :::   int hPal;
163 // :::   int Reserved;
164 // ::: } PicBmp;
165 // ::: #define HAS_PicBmp
166 // ::: #endif
167
168 int OleCreatePictureIndirect(PicBmp PictDesc, GUID RefIID, int fPictureOwnsHandle, IPicture IPic);
169
170 #endif
171
172 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
173 //
174 // CreateBitmapPicture
175 //    - Creates a bitmap type Picture object from a bitmap and
176 //      palette.
177 //
178 // hBmp
179 //    - Handle to a bitmap.
180 //
181 // hPal
182 //    - Handle to a Palette.
183 //    - Can be null if the bitmap doesn't use a palette.
184 //
185 // Returns
186 //    - Returns a Picture object containing the bitmap.
187 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
188 //
189 #if Win32
190 Picture CreateBitmapPicture(long hBmp, long hPal)
191 {
192   Picture CreateBitmapPicture;
193
194   long r;
195
196 #elif Win16
197 Picture CreateBitmapPicture(int hBmp, int hPal)
198 {
199   Picture CreateBitmapPicture;
200
201   int r;
202
203 #endif
204   PicBmp pic;
205
206   // IPicture requires a reference to "Standard OLE Types."
207   IPicture IPic;
208   GUID IID_IDispatch;
209
210   // Fill in with IDispatch Interface ID.
211   {
212     IID_IDispatch.Data1 = 0x20400;
213     IID_IDispatch.Data4[0] = 0xC0;
214     IID_IDispatch.Data4[7] = 0x46;
215   }
216
217   // Fill Pic with necessary parts.
218   {
219     pic.Size = sizeof(pic);       // Length of structure.
220     pic.Type = vbPicTypeBitmap;   // Type of Picture (bitmap).
221     pic.hBmp = hBmp;              // Handle to bitmap.
222     pic.hPal = hPal;              // Handle to palette (may be null).
223   }
224
225   // Create Picture object.
226   r = OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic);
227
228   // Return the new Picture object.
229   CreateBitmapPicture = IPic;
230
231   return CreateBitmapPicture;
232 }
233
234 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
235 //
236 // CaptureWindow
237 //    - Captures any portion of a window.
238 //
239 // hWndSrc
240 //    - Handle to the window to be captured.
241 //
242 // Client
243 //    - If True CaptureWindow captures from the client area of the
244 //      window.
245 //    - If False CaptureWindow captures from the entire window.
246 //
247 // LeftSrc, TopSrc, WidthSrc, HeightSrc
248 //    - Specify the portion of the window to capture.
249 //    - Dimensions need to be specified in pixels.
250 //
251 // Returns
252 //    - Returns a Picture object containing a bitmap of the specified
253 //      portion of the window that was captured.
254 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
255 // '''''
256 //
257 #if Win32
258 Picture CaptureWindow(long hWndSrc, boolean Client, long LeftSrc, long TopSrc, long WidthSrc, long HeightSrc)
259 {
260   Picture CaptureWindow;
261
262   long hDCMemory;
263   long hBmp;
264   long hBmpPrev;
265   long r;
266   long hDCSrc;
267   long hPal;
268   long hPalPrev;
269   long RasterCapsScrn;
270   long HasPaletteScrn;
271   long PaletteSizeScrn;
272
273 #elif Win16
274 Picture CaptureWindow(int hWndSrc, boolean Client, int LeftSrc, int TopSrc, long WidthSrc, long HeightSrc)
275 {
276   Picture CaptureWindow;
277
278   int hDCMemory;
279   int hBmp;
280   int hBmpPrev;
281   int r;
282   int hDCSrc;
283   int hPal;
284   int hPalPrev;
285   int RasterCapsScrn;
286   int HasPaletteScrn;
287   int PaletteSizeScrn;
288
289 #endif
290   LOGPALETTE LogPal;
291
292   // Depending on the value of Client get the proper device context.
293   if (Client)
294   {
295     hDCSrc = GetDC(hWndSrc); // Get device context for client area.
296   }
297   else
298   {
299     hDCSrc = GetWindowDC(hWndSrc); // Get device context for entire
300     // window.
301   }
302
303   // Create a memory device context for the copy process.
304   hDCMemory = CreateCompatibleDC(hDCSrc);
305   // Create a bitmap and place it in the memory DC.
306   hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc);
307   hBmpPrev = SelectObject(hDCMemory, hBmp);
308
309   // Get screen properties.
310   RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS); // Raster
311   // capabilities.
312   HasPaletteScrn = RasterCapsScrn & RC_PALETTE;       // Palette
313   // support.
314   PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE); // Size of
315   // palette.
316
317   // If the screen has a palette make a copy and realize it.
318   if (HasPaletteScrn && (PaletteSizeScrn == 256))
319   {
320     // Create a copy of the system palette.
321     LogPal.palVersion = 0x300;
322     LogPal.palNumEntries = 256;
323     r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry[0]);
324     hPal = CreatePalette(LogPal);
325     // Select the new palette into the memory DC and realize it.
326     hPalPrev = SelectPalette(hDCMemory, hPal, 0);
327     r = RealizePalette(hDCMemory);
328   }
329
330   // Copy the on-screen image into the memory DC.
331   r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy);
332
333   // Remove the new copy of the  on-screen image.
334   hBmp = SelectObject(hDCMemory, hBmpPrev);
335
336   // If the screen has a palette get back the palette that was
337   // selected in previously.
338   if (HasPaletteScrn && (PaletteSizeScrn == 256))
339   {
340     hPal = SelectPalette(hDCMemory, hPalPrev, 0);
341   }
342
343   // Release the device context resources back to the system.
344   r = DeleteDC(hDCMemory);
345   r = ReleaseDC(hWndSrc, hDCSrc);
346
347   // Call CreateBitmapPicture to create a picture object from the
348   // bitmap and palette handles. Then return the resulting picture
349   // object.
350
351   CaptureWindow = CreateBitmapPicture(hBmp, hPal);
352
353   return CaptureWindow;
354 }
355
356 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
357 //
358 // CaptureScreen
359 //    - Captures the entire screen.
360 //
361 // Returns
362 //    - Returns a Picture object containing a bitmap of the screen.
363 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
364 //
365 Picture CaptureScreen()
366 {
367   Picture CaptureScreen;
368
369 #if Win32
370   long hWndScreen;
371
372 #elif Win16
373   int hWndScreen;
374
375 #endif
376
377   // Get a handle to the desktop window.
378   hWndScreen = GetDesktopWindow();
379
380   // Call CaptureWindow to capture the entire desktop give the handle
381   // and return the resulting Picture object.
382
383   CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width / Screen.TwipsPerPixelX, Screen.Height / Screen.TwipsPerPixelY);
384
385   return CaptureScreen;
386 }
387
388 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
389 //
390 // CaptureForm
391 //    - Captures an entire form including title bar and border.
392 //
393 // frmSrc
394 //    - The Form object to capture.
395 //
396 // Returns
397 //    - Returns a Picture object containing a bitmap of the entire
398 //      form.
399 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
400 //
401 Picture CaptureForm(Form frmSrc)
402 {
403   Picture CaptureForm;
404
405   // Call CaptureWindow to capture the entire form given its window
406   // handle and then return the resulting Picture object.
407   CaptureForm = CaptureWindow(frmSrc.hWnd, False, 0, 0, frmSrc.ScaleX(frmSrc.Width, vbTwips, vbPixels), frmSrc.ScaleY(frmSrc.Height, vbTwips, vbPixels));
408
409   return CaptureForm;
410 }
411
412 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
413 //
414 // CaptureClient
415 //    - Captures the client area of a form.
416 //
417 // frmSrc
418 //    - The Form object to capture.
419 //
420 // Returns
421 //    - Returns a Picture object containing a bitmap of the form's
422 //      client area.
423 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
424 //
425 Picture CaptureClient(Form frmSrc)
426 {
427   Picture CaptureClient;
428
429   // Call CaptureWindow to capture the client area of the form given
430   // its window handle and return the resulting Picture object.
431   CaptureClient = CaptureWindow(frmSrc.hWnd, True, 0, 0, frmSrc.ScaleX(frmSrc.ScaleWidth, frmSrc.ScaleMode, vbPixels), frmSrc.ScaleY(frmSrc.ScaleHeight, frmSrc.ScaleMode, vbPixels));
432
433   return CaptureClient;
434 }
435
436 #if 0
437
438 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
439 //
440 // CaptureActiveWindow
441 //    - Captures the currently active window on the screen.
442 //
443 // Returns
444 //    - Returns a Picture object containing a bitmap of the active
445 //      window.
446 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
447 //
448 Picture CaptureActiveWindow()
449 {
450   Picture CaptureActiveWindow;
451
452 #if Win32
453   long hWndActive;
454   long r;
455
456 #elif Win16
457   int hWndActive;
458   int r;
459
460 #endif
461   RECT RectActive;
462
463   // Get a handle to the active/foreground window.
464   hWndActive = GetForegroundWindow();
465
466   // Get the dimensions of the window.
467   r = GetWindowRect(hWndActive, RectActive);
468
469   // Call CaptureWindow to capture the active window given its
470   // handle and return the Resulting Picture object.
471   CaptureActiveWindow = CaptureWindow(hWndActive, False, 0, 0, RectActive.right - RectActive.left, RectActive.bottom - RectActive.top);
472
473   return CaptureActiveWindow;
474 }
475
476 #endif
477
478 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
479
480 //
481 // PrintPictureToFitPage
482 //    - Prints a Picture object as big as possible.
483 //
484 // Prn
485 //    - Destination Printer object.
486 //
487 // Pic
488 //    - Source Picture object.
489 // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
490 //
491 void PrintPictureToFitPage(Printer Prn, Picture pic)
492 {
493   #define vbHiMetric                    (8)
494   double PicRatio;
495   double PrnWidth;
496   double PrnHeight;
497   double PrnRatio;
498   double PrnPicWidth;
499   double PrnPicHeight;
500
501   // Determine if picture should be printed in landscape or portrait
502   // and set the orientation.
503   if (pic.Height >= pic.Width)
504   {
505     Prn.Orientation = vbPRORPortrait;   // Taller than wide.
506   }
507   else
508   {
509     Prn.Orientation = vbPRORLandscape;  // Wider than tall.
510   }
511
512   // Calculate device independent Width-to-Height ratio for picture.
513   PicRatio = pic.Width / pic.Height;
514
515   // Calculate the dimentions of the printable area in HiMetric.
516   PrnWidth = Prn.ScaleX(Prn.ScaleWidth, Prn.ScaleMode, vbHiMetric);
517   PrnHeight = Prn.ScaleY(Prn.ScaleHeight, Prn.ScaleMode, vbHiMetric);
518   // Calculate device independent Width to Height ratio for printer.
519   PrnRatio = PrnWidth / PrnHeight;
520
521   // Scale the output to the printable area.
522   if (PicRatio >= PrnRatio)
523   {
524     // Scale picture to fit full width of printable area.
525     PrnPicWidth = Prn.ScaleX(PrnWidth, vbHiMetric, Prn.ScaleMode);
526     PrnPicHeight = Prn.ScaleY(PrnWidth / PicRatio, vbHiMetric, Prn.ScaleMode);
527   }
528   else
529   {
530     // Scale picture to fit full height of printable area.
531     PrnPicHeight = Prn.ScaleY(PrnHeight, vbHiMetric, Prn.ScaleMode);
532     PrnPicWidth = Prn.ScaleX(PrnHeight * PicRatio, vbHiMetric, Prn.ScaleMode);
533   }
534
535   // Print the picture using the PaintPicture method.
536 #if 0
537   Prn.PaintPicture(pic, 0, 0, PrnPicWidth, PrnPicHeight);
538 #endif
539 }
540
541 // --------------------------------------------------------------------
542
543 #endif