|
|
1.1 root 1: /*----------------------------------
2: PMCAP2.C -- Routines for PMCAP.C
3: ----------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #define INCL_BITMAPFILEFORMAT
8: #include <os2.h>
9: #include <ctype.h>
10: #include <stdlib.h>
11: #include <stdio.h>
12: #include <string.h>
13: #include "pmcap.h"
14:
15: extern CHAR szClientClass [] ;
16: extern HAB hab ;
17:
18: VOID CheckMenuItem (HWND hwndMenu, SHORT idItem, BOOL fCheck)
19: {
20: WinSendMsg (hwndMenu, MM_SETITEMATTR,
21: MPFROM2SHORT (idItem, TRUE),
22: MPFROM2SHORT (MIA_CHECKED, fCheck ? MIA_CHECKED : 0)) ;
23: }
24:
25: VOID EnableMenuItem (HWND hwndMenu, SHORT idItem, BOOL fEnable)
26: {
27: WinSendMsg (hwndMenu, MM_SETITEMATTR,
28: MPFROM2SHORT (idItem, TRUE),
29: MPFROM2SHORT (MIA_DISABLED, fEnable ? 0 : MIA_DISABLED)) ;
30: }
31:
32: VOID ErrorMessage (HWND hwnd, SHORT idError)
33: {
34: CHAR achString [80] ;
35:
36: WinLoadString (hab, NULL, idError, sizeof achString, achString) ;
37:
38: WinMessageBox (HWND_DESKTOP, hwnd, achString, szClientClass, 0,
39: MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE) ;
40: }
41:
42: VOID AddItemToSysMenu (HWND hwndFrame)
43: {
44: static CHAR *szMenuText [2] = { NULL, "~Begin countdown" } ;
45: static MENUITEM mi [2] = {
46: MIT_END, MIS_SEPARATOR, 0, 0, NULL, NULL,
47: MIT_END, MIS_TEXT, 0, IDM_BEGIN, NULL, NULL
48: } ;
49: HWND hwndSysMenu, hwndSysSubMenu ;
50: MENUITEM miSysMenu ;
51: SHORT idSysMenu, sItem ;
52:
53: hwndSysMenu = WinWindowFromID (hwndFrame, FID_SYSMENU) ;
54: idSysMenu = SHORT1FROMMR (WinSendMsg (hwndSysMenu,
55: MM_ITEMIDFROMPOSITION,
56: NULL, NULL)) ;
57:
58: WinSendMsg (hwndSysMenu, MM_QUERYITEM,
59: MPFROM2SHORT (idSysMenu, FALSE),
60: MPFROMP (&miSysMenu)) ;
61:
62: hwndSysSubMenu = miSysMenu.hwndSubMenu ;
63:
64: for (sItem = 0 ; sItem < 2 ; sItem++)
65: WinSendMsg (hwndSysSubMenu, MM_INSERTITEM,
66: MPFROMP (mi + sItem),
67: MPFROMP (szMenuText [sItem])) ;
68: return ;
69: }
70:
71: VOID SaveColorSettings (BOOL fSave, BOOL fSetMono)
72: {
73: static LONG clrTableDef [2 * SYSCLR_CSYSCOLORS] ;
74: static LONG clrTable [] = { SYSCLR_WINDOWSTATICTEXT, 0x000000,
75: SYSCLR_SCROLLBAR, 0xC0C0C0,
76: SYSCLR_BACKGROUND, 0xFFFFFF,
77: SYSCLR_ACTIVETITLE, 0x000000,
78: SYSCLR_INACTIVETITLE, 0xFFFFFF,
79: SYSCLR_MENU, 0xFFFFFF,
80: SYSCLR_WINDOW, 0xFFFFFF,
81: SYSCLR_WINDOWFRAME, 0x000000,
82: SYSCLR_MENUTEXT, 0x000000,
83: SYSCLR_WINDOWTEXT, 0x000000,
84: SYSCLR_TITLETEXT, 0xFFFFFF,
85: SYSCLR_ACTIVEBORDER, 0xA0A0A0,
86: SYSCLR_INACTIVEBORDER, 0xFFFFFF,
87: SYSCLR_APPWORKSPACE, 0xE0E0E0,
88: SYSCLR_HELPBACKGROUND, 0xFFFFFF,
89: SYSCLR_HELPTEXT, 0x000000,
90: SYSCLR_HELPHILITE, 0x000000 } ;
91: SHORT i ;
92:
93: if (fSave)
94: for (i = 0 ; i < SYSCLR_CSYSCOLORS ; i++)
95: clrTableDef[2*i+1] = WinQuerySysColor (HWND_DESKTOP,
96: clrTableDef[2*i] = clrTable[2*i], 0L);
97:
98: if (fSetMono)
99: WinSetSysColors (HWND_DESKTOP, 0L, LCOLF_INDRGB,
100: 0L, 2 * SYSCLR_CSYSCOLORS, clrTable) ;
101: else
102: WinSetSysColors (HWND_DESKTOP, 0L, LCOLF_INDRGB,
103: 0L, 2 * SYSCLR_CSYSCOLORS, clrTableDef) ;
104: return ;
105: }
106:
107: VOID IncrementFilename (CHAR *pchName)
108: {
109: SHORT sIndex ;
110:
111: for (sIndex = strlen (pchName) - 1 ; sIndex >= 0 ; sIndex--)
112: {
113: if (pchName [sIndex] == '\\') // past filename
114: return ;
115:
116: if (isdigit (pchName [sIndex]))
117: break ;
118: }
119:
120: for ( ; sIndex >= 0 ; sIndex--)
121: {
122: if (!isdigit (pchName [sIndex]))
123: return ;
124:
125: if (pchName [sIndex] == '9')
126: pchName [sIndex] = '0' ;
127: else
128: {
129: pchName [sIndex] += '\001' ;
130: return ;
131: }
132: }
133: return ;
134: }
135:
136: HBITMAP CopyBitmap (HBITMAP hbmSrc)
137: {
138: BITMAPINFOHEADER bmp ;
139: HBITMAP hbmDst ;
140: HDC hdcSrc, hdcDst ;
141: HPS hpsSrc, hpsDst ;
142: POINTL aptl[3] ;
143: SIZEL sizl ;
144:
145: hdcSrc = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
146: hdcDst = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
147:
148: sizl.cx = sizl.cy = 0 ;
149: hpsSrc = GpiCreatePS (hab, hdcSrc, &sizl, PU_PELS | GPIF_DEFAULT |
150: GPIT_MICRO | GPIA_ASSOC) ;
151:
152: hpsDst = GpiCreatePS (hab, hdcDst, &sizl, PU_PELS | GPIF_DEFAULT |
153: GPIT_MICRO | GPIA_ASSOC) ;
154:
155: GpiQueryBitmapParameters (hbmSrc, &bmp) ;
156: hbmDst = GpiCreateBitmap (hpsDst, &bmp, 0L, NULL, NULL) ;
157:
158: if (hbmDst != NULL)
159: {
160: GpiSetBitmap (hpsSrc, hbmSrc) ;
161: GpiSetBitmap (hpsDst, hbmDst) ;
162:
163: aptl[0].x = aptl[0].y = 0 ;
164: aptl[1].x = bmp.cx ;
165: aptl[1].y = bmp.cy ;
166: aptl[2] = aptl[0] ;
167:
168: GpiBitBlt (hpsDst, hpsSrc, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
169: }
170: GpiDestroyPS (hpsSrc) ;
171: GpiDestroyPS (hpsDst) ;
172: DevCloseDC (hdcSrc) ;
173: DevCloseDC (hdcDst) ;
174:
175: return hbmDst ;
176: }
177:
178: VOID CopyPointerToScreen (HPS hpsScreen, LONG alBitmapFormats[], BOOL fCopy)
179: {
180: static HBITMAP hbm ;
181: static HDC hdcMemory ;
182: static HPS hpsMemory ;
183: static POINTERINFO ptri ;
184: static POINTL ptlPointer, aptl[3] ;
185: static SHORT cxPointer, cyPointer ;
186: BITMAPINFOHEADER bmp ;
187: HPOINTER hptr ;
188: SIZEL sizl ;
189:
190: if (WinQuerySysValue (HWND_DESKTOP, SV_MOUSEPRESENT) == 0L)
191: return ;
192:
193: if (fCopy)
194: {
195: // Get Pointer Information
196:
197: cxPointer = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CXPOINTER) ;
198: cyPointer = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CYPOINTER) ;
199:
200: hptr = WinQueryPointer (HWND_DESKTOP) ;
201: WinQueryPointerInfo (hptr, &ptri) ;
202: WinQueryPointerPos (HWND_DESKTOP, &ptlPointer) ;
203:
204: // Create memory DC and PS
205:
206: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
207:
208: sizl.cx = sizl.cy = 0 ;
209: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
210: PU_PELS | GPIF_DEFAULT |
211: GPIT_MICRO | GPIA_ASSOC) ;
212:
213: // Create bitmap for destination
214:
215: bmp.cbFix = sizeof bmp ;
216: bmp.cx = cxPointer ;
217: bmp.cy = cyPointer ;
218: bmp.cPlanes = (USHORT) alBitmapFormats[0] ;
219: bmp.cBitCount = (USHORT) alBitmapFormats[1] ;
220:
221: hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, NULL, NULL) ;
222:
223: // Copy from screen to bitmap
224:
225: GpiSetBitmap (hpsMemory, hbm) ;
226:
227: aptl[0].x = 0 ;
228: aptl[0].y = 0 ;
229: aptl[1].x = cxPointer ;
230: aptl[1].y = cyPointer ;
231: aptl[2].x = ptlPointer.x - ptri.xHotspot ;
232: aptl[2].y = ptlPointer.y - ptri.yHotspot ;
233:
234: GpiBitBlt (hpsMemory, hpsScreen, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
235:
236: // Draw pointer on screen
237:
238: WinDrawPointer (hpsScreen, (SHORT) aptl[2].x, (SHORT) aptl[2].y,
239: hptr, DP_NORMAL) ;
240: }
241: else
242: {
243: // Copy from bitmap to screen
244:
245: aptl[0].x = ptlPointer.x - ptri.xHotspot ;
246: aptl[0].y = ptlPointer.y - ptri.yHotspot ;
247: aptl[1].x = aptl[0].x + cxPointer ;
248: aptl[1].y = aptl[0].y + cyPointer ;
249: aptl[2].x = 0 ;
250: aptl[2].y = 0 ;
251:
252: GpiBitBlt (hpsScreen, hpsMemory, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE) ;
253:
254: // Clean up
255:
256: GpiSetBitmap (hpsMemory, NULL) ;
257: GpiDestroyPS (hpsMemory) ;
258: DevCloseDC (hdcMemory) ;
259: GpiDeleteBitmap (hbm) ;
260: }
261: }
262:
263: HBITMAP ScreenToBitmap (SHORT cxScreen, SHORT cyScreen, BOOL fIncludePtr,
264: BOOL fMonochrome)
265: {
266: BITMAPINFOHEADER bmp ;
267: HBITMAP hbm ;
268: HDC hdcMemory ;
269: HPS hpsScreen, hpsMemory ;
270: LONG alBitmapFormats [2] ;
271: POINTL aptl[3] ;
272: SIZEL sizl ;
273:
274: // Create memory DC and PS
275:
276: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
277:
278: sizl.cx = sizl.cy = 0 ;
279: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl,
280: PU_PELS | GPIF_DEFAULT |
281: GPIT_MICRO | GPIA_ASSOC) ;
282:
283: // Create bitmap for destination
284:
285:
286: bmp.cbFix = sizeof bmp ;
287: bmp.cx = cxScreen ;
288: bmp.cy = cyScreen ;
289:
290: if (fMonochrome)
291: {
292: bmp.cPlanes = 1 ;
293: bmp.cBitCount = 1 ;
294: }
295: else
296: {
297: GpiQueryDeviceBitmapFormats (hpsMemory, 2L, alBitmapFormats) ;
298:
299: bmp.cPlanes = (USHORT) alBitmapFormats[0] ;
300: bmp.cBitCount = (USHORT) alBitmapFormats[1] ;
301: }
302:
303: hbm = GpiCreateBitmap (hpsMemory, &bmp, 0L, NULL, NULL) ;
304:
305: // Copy from screen to bitmap
306:
307: if (hbm != NULL)
308: {
309: GpiSetBitmap (hpsMemory, hbm) ;
310: hpsScreen = WinGetScreenPS (HWND_DESKTOP) ;
311:
312: aptl[0].x = 0 ;
313: aptl[0].y = 0 ;
314: aptl[1].x = cxScreen ;
315: aptl[1].y = cyScreen ;
316: aptl[2].x = 0 ;
317: aptl[2].y = 0 ;
318:
319: if (fIncludePtr)
320: CopyPointerToScreen (hpsScreen, alBitmapFormats, TRUE) ;
321:
322: WinLockVisRegions (HWND_DESKTOP, TRUE) ;
323:
324: GpiBitBlt (hpsMemory, hpsScreen, 3L, aptl,
325: fMonochrome ? ROP_NOTSRCCOPY : ROP_SRCCOPY, BBO_IGNORE) ;
326:
327: WinLockVisRegions (HWND_DESKTOP, FALSE) ;
328:
329: if (fIncludePtr)
330: CopyPointerToScreen (hpsScreen, alBitmapFormats, FALSE) ;
331:
332: WinReleasePS (hpsScreen) ;
333: GpiDestroyPS (hpsMemory) ;
334: DevCloseDC (hdcMemory) ;
335: }
336:
337: return hbm ;
338: }
339:
340: BOOL IsBitmapMonoEGA (HBITMAP hbm)
341: {
342: BITMAPINFOHEADER bmp ;
343:
344: if (hbm != NULL)
345: {
346: GpiQueryBitmapParameters (hbm, &bmp) ;
347:
348: if (bmp.cx == 640 &&
349: bmp.cy == 350 &&
350: bmp.cPlanes == 1 &&
351: bmp.cBitCount == 1)
352:
353: return TRUE ;
354: }
355: return FALSE ;
356: }
357:
358: SHORT SaveBitmap (HBITMAP hbm, CHAR *szFilename)
359: {
360: BITMAPFILEHEADER bfh ;
361: BITMAPINFO *pbmi ;
362: BYTE *pbScan ;
363: FILE *file ;
364: HDC hdcMemory ;
365: HPS hpsMemory ;
366: LONG lBmpDataSize ;
367: SHORT sRgbTableSize, sScanLineSize, sScan ;
368: SIZEL sizl ;
369:
370: // Get bitmap information
371:
372: bfh.bmp.cbFix = sizeof (BITMAPINFOHEADER) ;
373: GpiQueryBitmapParameters (hbm, &bfh.bmp) ;
374:
375: if (bfh.bmp.cPlanes != 1)
376: return IDS_MULTIPLANE ;
377:
378: sRgbTableSize = (1 << bfh.bmp.cPlanes * bfh.bmp.cBitCount) * sizeof (RGB);
379: sScanLineSize = ((bfh.bmp.cBitCount * bfh.bmp.cx + 31) / 32) * 4 *
380: bfh.bmp.cPlanes ;
381: lBmpDataSize = (LONG) sScanLineSize * bfh.bmp.cy ;
382:
383: // Open file
384:
385: if (NULL == (file = fopen (szFilename, "wb")))
386: return IDS_FILEOPEN ;
387:
388: // Set up file header and write it to file
389:
390: bfh.usType = BFT_BMAP ;
391: bfh.cbSize = sizeof (BITMAPFILEHEADER) + sRgbTableSize + lBmpDataSize ;
392: bfh.xHotspot = 0 ;
393: bfh.yHotspot = 0 ;
394: bfh.offBits = sizeof (BITMAPFILEHEADER) + sRgbTableSize ;
395:
396: fwrite (&bfh, sizeof bfh, 1, file) ;
397:
398: // Create memory DC and PS, and set bitmap in it
399:
400: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
401:
402: sizl.cx = sizl.cy = 0 ;
403: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl, PU_PELS | GPIF_DEFAULT |
404: GPIT_MICRO | GPIA_ASSOC) ;
405:
406: GpiSetBitmap (hpsMemory, hbm) ;
407:
408: // Allocate memory for BITMAPINFO table & scans
409:
410: pbmi = malloc (sizeof (BITMAPINFOHEADER) + sRgbTableSize) ;
411:
412: pbmi->cbFix = sizeof (BITMAPINFOHEADER) ;
413: pbmi->cPlanes = bfh.bmp.cPlanes ;
414: pbmi->cBitCount = bfh.bmp.cBitCount ;
415:
416: pbScan = malloc (sScanLineSize) ;
417:
418: // Loop through scan lines
419:
420: for (sScan = 0 ; sScan < bfh.bmp.cy ; sScan++)
421: {
422: GpiQueryBitmapBits (hpsMemory, (LONG) sScan, 1L, pbScan, pbmi) ;
423:
424: if (sScan == 0)
425: fwrite (&pbmi->argbColor[0], sRgbTableSize, 1, file) ;
426:
427: if (fwrite (pbScan, sScanLineSize, 1, file) == 0)
428: break ;
429: }
430: // Cleanup after completion
431:
432: fclose (file) ;
433: free (pbmi) ;
434: free (pbScan) ;
435: GpiDestroyPS (hpsMemory) ;
436: DevCloseDC (hdcMemory) ;
437:
438: if (sScan != bfh.bmp.cy)
439: {
440: unlink (szFilename) ;
441: return IDS_DISKFULL ;
442: }
443:
444: return 0 ;
445: }
446:
447: typedef struct
448: {
449: SHORT key1 ;
450: SHORT key2 ;
451: SHORT dxFile ;
452: SHORT dyFile ;
453: SHORT ScrAspectX ;
454: SHORT ScrAspectY ;
455: SHORT PrnAspectX ;
456: SHORT PrnAspectY ;
457: SHORT dxPrinter ;
458: SHORT dyPrinter ;
459: SHORT AspCorX ;
460: SHORT AspCorY ;
461: SHORT wCheck ;
462: SHORT res1 ;
463: SHORT res2 ;
464: SHORT res3 ;
465: SHORT bitmap[350][40] ;
466: }
467: PAINT ;
468:
469: SHORT SavePaintFormat (HBITMAP hbm, CHAR *szFilename)
470: {
471: BITMAPINFO *pbmi ;
472: FILE *file ;
473: HDC hdcMemory ;
474: HPS hpsMemory ;
475: PAINT *ppaint ;
476: SHORT i, j, sHold, sWrite ;
477: SIZEL sizl ;
478: // Allocate memory and open file
479:
480: if (!IsBitmapMonoEGA (hbm))
481: return IDS_MONOEGA ;
482:
483: if (NULL == (ppaint = malloc (sizeof (PAINT))))
484: return IDS_MEMORY ;
485:
486: if (NULL == (file = fopen (szFilename, "wb")))
487: {
488: free (ppaint) ;
489: return IDS_FILEOPEN ;
490: }
491: // Set up Paint header for EGA
492:
493: ppaint->key1 = 0x6144 ;
494: ppaint->key2 = 0x4D6E ;
495: ppaint->dxFile = 0x0280 ;
496: ppaint->dyFile = 0x015E ;
497: ppaint->ScrAspectX = 0x0026 ;
498: ppaint->ScrAspectY = 0x0030 ;
499: ppaint->PrnAspectX = 0x0026 ;
500: ppaint->PrnAspectY = 0x0030 ;
501: ppaint->dxPrinter = 0x0280 ;
502: ppaint->dyPrinter = 0x015E ;
503: ppaint->AspCorX = 0x0000 ;
504: ppaint->AspCorY = 0x0000 ;
505: ppaint->wCheck = 0x2C2A ;
506: ppaint->res1 = 0xB80E ;
507: ppaint->res2 = 0x0050 ;
508: ppaint->res3 = 0x8D50 ;
509:
510: // Create memory DC and PS, and set bitmap in it
511:
512: hdcMemory = DevOpenDC (hab, OD_MEMORY, "*", 0L, NULL, NULL) ;
513:
514: sizl.cx = sizl.cy = 0 ;
515: hpsMemory = GpiCreatePS (hab, hdcMemory, &sizl, PU_PELS | GPIF_DEFAULT |
516: GPIT_MICRO | GPIA_ASSOC) ;
517:
518: GpiSetBitmap (hpsMemory, hbm) ;
519:
520: // Allocate memory for bitmap header info
521:
522: pbmi = malloc (sizeof (BITMAPINFO) + sizeof (RGB)) ;
523:
524: pbmi->cbFix = sizeof (BITMAPINFOHEADER) ;
525: pbmi->cx = 640 ;
526: pbmi->cy = 350 ;
527: pbmi->cPlanes = 1 ;
528: pbmi->cBitCount = 1 ;
529: // Get bitmap bits
530:
531: GpiQueryBitmapBits (hpsMemory, 0L, 350L, (PBYTE) ppaint->bitmap, pbmi) ;
532:
533: free (pbmi) ;
534: // Convert to paint format and write
535:
536: for (i = 0 ; i < 350 / 2 ; i++)
537: for (j = 0 ; j < 40 ; j++)
538: {
539: sHold = ~ppaint->bitmap[i][j] ;
540: ppaint->bitmap[i][j] = ~ppaint->bitmap[350-i-1][j] ;
541: ppaint->bitmap[350-i-1][j] = sHold ;
542: }
543:
544: sWrite = fwrite (ppaint, sizeof (PAINT), 1, file) ;
545:
546: // Clean up after completion
547: fclose (file) ;
548: free (ppaint) ;
549: GpiDestroyPS (hpsMemory) ;
550: DevCloseDC (hdcMemory) ;
551:
552: if (sWrite == 0)
553: {
554: unlink (szFilename) ;
555: return IDS_DISKFULL ;
556: }
557: return 0 ;
558: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.