]> 4ch.mooo.com Git - 16.git/blob - 16/PCX_LIB/PCX_COMM.C
Merge branch 'master' of github.com:sparky4/16
[16.git] / 16 / PCX_LIB / PCX_COMM.C
1 /*\r
2  *************************************************************************\r
3  *\r
4  *  PCX_COMM.C - PCX_LIB Library Common Functions\r
5  *\r
6  *  Version:    1.00B\r
7  *\r
8  *  History:    91/02/14 - Created\r
9  *              91/04/01 - Release 1.00A\r
10  *              91/04/03 - fixed "segread" call.\r
11  *              91/04/07 - Release 1.00B\r
12  *\r
13  *  Compiler:   Microsoft C V6.0\r
14  *\r
15  *  Author:     Ian Ashdown, P.Eng.\r
16  *              byHeart Software\r
17  *              620 Ballantree Road\r
18  *              West Vancouver, B.C.\r
19  *              Canada V7S 1W3\r
20  *              Tel. (604) 922-6148\r
21  *              Fax. (604) 987-7621\r
22  *\r
23  *  Copyright:  Public Domain\r
24  *\r
25  *************************************************************************\r
26  */\r
27 \f\r
28 /*\r
29  *************************************************************************\r
30  *\r
31  *  PORTABILITY NOTES\r
32  *\r
33  *  1.  While this program is written in ANSI C, it uses a number of \r
34  *      function calls that are specific to the Microsoft C V6.0 library.\r
35  *      These are documented as follows for the purposes of porting this\r
36  *      program to other compilers and/or processors: \r
37  *\r
38  *          int86x      - execute 80x86 interrupt routine (far data)\r
39  *          segread     - get current 80x86 segment register values\r
40  *\r
41  *************************************************************************\r
42  */\r
43 \f\r
44 /*      INCLUDE FILES                                                   */\r
45 \r
46 #include <stdio.h>\r
47 #include <stdlib.h>\r
48 #include <dos.h>\r
49 #include "pcx_int.h"\r
50 \f\r
51 /*      FORWARD REFERENCES                                              */\r
52 \f\r
53 /*      GLOBALS                                                         */\r
54 \f\r
55 /*      PUBLIC FUNCTIONS                                                */\r
56 \r
57 /*\r
58  *************************************************************************\r
59  *\r
60  *  PCX_OPEN - Open PCX Workblock\r
61  *\r
62  *  Purpose:    To allocate and initialize a PCX image file workblock.\r
63  *\r
64  *  Setup:      PCX_WORKBLK *pcx_open\r
65  *              (\r
66  *                char *fname,\r
67  *                BOOL wrt_flag\r
68  *              )\r
69  *\r
70  *  Where:      fname is a PCX image file name.\r
71  *              wrt_flag is a Boolean flag which if TRUE indicates that\r
72  *                the PCX image file is to be opened for writing;\r
73  *                otherwise it is opened for reading.\r
74  *\r
75  *  Return:     A pointer to a PCX image file workblock if successful;\r
76  *              otherwise NULL.\r
77  *\r
78  *************************************************************************\r
79  */\r
80 \r
81 PCX_WORKBLK *pcx_open\r
82 (\r
83   char *fname,\r
84   BOOL wrt_flag\r
85 )\r
86 {\r
87   PCX_WORKBLK *wbp;     /* PCX image file workblock pointer             */\r
88 \r
89   /* Allocate a workblock                                               */\r
90 \r
91   if ((wbp = (PCX_WORKBLK *) malloc(sizeof(PCX_WORKBLK))) == NULL)\r
92     return (NULL);\r
93 \r
94   /* Open the PCX image file in binary mode                             */\r
95 \r
96   if (wrt_flag == FALSE)\r
97     wbp->fp = fopen(fname, "rb");       /* Open for reading             */\r
98   else\r
99     wbp->fp = fopen(fname, "wb");       /* Open for writing             */\r
100 \r
101   if (wbp->fp == NULL)  /* Check for successful file opening            */\r
102   {\r
103     free(wbp);          /* Free the workblock memory                    */\r
104     return (NULL);\r
105   }\r
106 \r
107   return (wbp);         /* Return the workblock pointer                 */\r
108 }\r
109 \f\r
110 /*\r
111  *************************************************************************\r
112  *\r
113  *  PCX_CLOSE - Close PCX Workblock\r
114  *\r
115  *  Purpose:    To close a PCX image file and release its workblock\r
116  *              memory.\r
117  *\r
118  *  Setup:      BOOL pcx_close\r
119  *              (\r
120  *                PCX_WORKBLK *wbp\r
121  *              )\r
122  *\r
123  *  Where:      wbp is a PCX image file workblock pointer.\r
124  *\r
125  *  Return:     TRUE if successful; otherwise FALSE.\r
126  *\r
127  *************************************************************************\r
128  */\r
129 \r
130 BOOL pcx_close\r
131 (\r
132   PCX_WORKBLK *wbp\r
133 )\r
134 {\r
135   free(wbp->palettep);  /* Free the extended palette (if it exists)     */\r
136 \r
137   free(wbp);            /* Free the PCX image file workblock            */\r
138 \r
139   if (fclose(wbp->fp) == EOF)   /* Close the PCX image file             */\r
140     return (FALSE);\r
141 \r
142   return (TRUE);\r
143 }\r
144 \f\r
145 /*\r
146  *************************************************************************\r
147  *\r
148  *  PCX_ISVGA - Check For VGA Display Adapter\r
149  *\r
150  *  Purpose:    To determine whether a display adapter supports VGA BIOS\r
151  *              service routines.\r
152  *\r
153  *  Setup:      BOOL pcx_isvga(void)\r
154  *\r
155  *  Return:     TRUE if display adapter is VGA-compatible; otherwise\r
156  *              FALSE.\r
157  *\r
158  *************************************************************************\r
159  */\r
160 \r
161 BOOL pcx_isvga(void)\r
162 {\r
163   unsigned char *vinfop;        /* VGA information buffer pointer       */\r
164   union REGS regs;              /* 80x86 register values                */\r
165   struct SREGS sregs;           /* 80x86 segment register values        */\r
166 \r
167   /* Allocate a VGA functionality/state information buffer              */\r
168 \r
169   if ((vinfop = (unsigned char *) malloc(sizeof(unsigned char) * 64)) ==\r
170       NULL)\r
171     return (FALSE);\r
172 \r
173   /* Attempt to read the VGA information                                */\r
174 \r
175   regs.h.ah = 0x1b;     /* Select "Return VGA Info" BIOS routine        */\r
176   regs.x.bx = 0;        /* Implementation type                          */\r
177 \r
178   /* Get the VGA information buffer offset value                        */\r
179 \r
180   regs.x.di = (unsigned int) vinfop;\r
181 \r
182   segread(&sregs);      /* Get the current DS segment register value    */\r
183 \r
184   sregs.es = sregs.ds;\r
185 \r
186   int86x(0x10, &regs, &regs, &sregs);   /* Call BIOS video service      */\r
187 \r
188   free(vinfop);         /* Free the VGA information buffer              */\r
189 \r
190   /* The value 0x1b is returned in register AL only if a VGA display    */\r
191   /* adapter is present                                                 */\r
192 \r
193   if (regs.h.al == 0x1b)\r
194     return (TRUE);\r
195   else\r
196     return (FALSE);\r
197 }\r
198 \r