]> 4ch.mooo.com Git - 16.git/blobdiff - 16/PCX_LIB/PCX_COMM.C
refresh wwww
[16.git] / 16 / PCX_LIB / PCX_COMM.C
diff --git a/16/PCX_LIB/PCX_COMM.C b/16/PCX_LIB/PCX_COMM.C
new file mode 100755 (executable)
index 0000000..4252056
--- /dev/null
@@ -0,0 +1,198 @@
+/*\r
+ *************************************************************************\r
+ *\r
+ *  PCX_COMM.C - PCX_LIB Library Common Functions\r
+ *\r
+ *  Version:    1.00B\r
+ *\r
+ *  History:    91/02/14 - Created\r
+ *              91/04/01 - Release 1.00A\r
+ *              91/04/03 - fixed "segread" call.\r
+ *              91/04/07 - Release 1.00B\r
+ *\r
+ *  Compiler:   Microsoft C V6.0\r
+ *\r
+ *  Author:     Ian Ashdown, P.Eng.\r
+ *              byHeart Software\r
+ *              620 Ballantree Road\r
+ *              West Vancouver, B.C.\r
+ *              Canada V7S 1W3\r
+ *              Tel. (604) 922-6148\r
+ *              Fax. (604) 987-7621\r
+ *\r
+ *  Copyright:  Public Domain\r
+ *\r
+ *************************************************************************\r
+ */\r
+\f\r
+/*\r
+ *************************************************************************\r
+ *\r
+ *  PORTABILITY NOTES\r
+ *\r
+ *  1.  While this program is written in ANSI C, it uses a number of \r
+ *      function calls that are specific to the Microsoft C V6.0 library.\r
+ *      These are documented as follows for the purposes of porting this\r
+ *      program to other compilers and/or processors: \r
+ *\r
+ *          int86x      - execute 80x86 interrupt routine (far data)\r
+ *          segread     - get current 80x86 segment register values\r
+ *\r
+ *************************************************************************\r
+ */\r
+\f\r
+/*      INCLUDE FILES                                                   */\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <dos.h>\r
+#include "pcx_int.h"\r
+\f\r
+/*      FORWARD REFERENCES                                              */\r
+\f\r
+/*      GLOBALS                                                         */\r
+\f\r
+/*      PUBLIC FUNCTIONS                                                */\r
+\r
+/*\r
+ *************************************************************************\r
+ *\r
+ *  PCX_OPEN - Open PCX Workblock\r
+ *\r
+ *  Purpose:    To allocate and initialize a PCX image file workblock.\r
+ *\r
+ *  Setup:      PCX_WORKBLK *pcx_open\r
+ *              (\r
+ *                char *fname,\r
+ *                BOOL wrt_flag\r
+ *              )\r
+ *\r
+ *  Where:      fname is a PCX image file name.\r
+ *              wrt_flag is a Boolean flag which if TRUE indicates that\r
+ *                the PCX image file is to be opened for writing;\r
+ *                otherwise it is opened for reading.\r
+ *\r
+ *  Return:     A pointer to a PCX image file workblock if successful;\r
+ *              otherwise NULL.\r
+ *\r
+ *************************************************************************\r
+ */\r
+\r
+PCX_WORKBLK *pcx_open\r
+(\r
+  char *fname,\r
+  BOOL wrt_flag\r
+)\r
+{\r
+  PCX_WORKBLK *wbp;     /* PCX image file workblock pointer             */\r
+\r
+  /* Allocate a workblock                                               */\r
+\r
+  if ((wbp = (PCX_WORKBLK *) malloc(sizeof(PCX_WORKBLK))) == NULL)\r
+    return (NULL);\r
+\r
+  /* Open the PCX image file in binary mode                             */\r
+\r
+  if (wrt_flag == FALSE)\r
+    wbp->fp = fopen(fname, "rb");       /* Open for reading             */\r
+  else\r
+    wbp->fp = fopen(fname, "wb");       /* Open for writing             */\r
+\r
+  if (wbp->fp == NULL)  /* Check for successful file opening            */\r
+  {\r
+    free(wbp);          /* Free the workblock memory                    */\r
+    return (NULL);\r
+  }\r
+\r
+  return (wbp);         /* Return the workblock pointer                 */\r
+}\r
+\f\r
+/*\r
+ *************************************************************************\r
+ *\r
+ *  PCX_CLOSE - Close PCX Workblock\r
+ *\r
+ *  Purpose:    To close a PCX image file and release its workblock\r
+ *              memory.\r
+ *\r
+ *  Setup:      BOOL pcx_close\r
+ *              (\r
+ *                PCX_WORKBLK *wbp\r
+ *              )\r
+ *\r
+ *  Where:      wbp is a PCX image file workblock pointer.\r
+ *\r
+ *  Return:     TRUE if successful; otherwise FALSE.\r
+ *\r
+ *************************************************************************\r
+ */\r
+\r
+BOOL pcx_close\r
+(\r
+  PCX_WORKBLK *wbp\r
+)\r
+{\r
+  free(wbp->palettep);  /* Free the extended palette (if it exists)     */\r
+\r
+  free(wbp);            /* Free the PCX image file workblock            */\r
+\r
+  if (fclose(wbp->fp) == EOF)   /* Close the PCX image file             */\r
+    return (FALSE);\r
+\r
+  return (TRUE);\r
+}\r
+\f\r
+/*\r
+ *************************************************************************\r
+ *\r
+ *  PCX_ISVGA - Check For VGA Display Adapter\r
+ *\r
+ *  Purpose:    To determine whether a display adapter supports VGA BIOS\r
+ *              service routines.\r
+ *\r
+ *  Setup:      BOOL pcx_isvga(void)\r
+ *\r
+ *  Return:     TRUE if display adapter is VGA-compatible; otherwise\r
+ *              FALSE.\r
+ *\r
+ *************************************************************************\r
+ */\r
+\r
+BOOL pcx_isvga(void)\r
+{\r
+  unsigned char *vinfop;        /* VGA information buffer pointer       */\r
+  union REGS regs;              /* 80x86 register values                */\r
+  struct SREGS sregs;           /* 80x86 segment register values        */\r
+\r
+  /* Allocate a VGA functionality/state information buffer              */\r
+\r
+  if ((vinfop = (unsigned char *) malloc(sizeof(unsigned char) * 64)) ==\r
+      NULL)\r
+    return (FALSE);\r
+\r
+  /* Attempt to read the VGA information                                */\r
+\r
+  regs.h.ah = 0x1b;     /* Select "Return VGA Info" BIOS routine        */\r
+  regs.x.bx = 0;        /* Implementation type                          */\r
+\r
+  /* Get the VGA information buffer offset value                        */\r
+\r
+  regs.x.di = (unsigned int) vinfop;\r
+\r
+  segread(&sregs);      /* Get the current DS segment register value    */\r
+\r
+  sregs.es = sregs.ds;\r
+\r
+  int86x(0x10, &regs, &regs, &sregs);   /* Call BIOS video service      */\r
+\r
+  free(vinfop);         /* Free the VGA information buffer              */\r
+\r
+  /* The value 0x1b is returned in register AL only if a VGA display    */\r
+  /* adapter is present                                                 */\r
+\r
+  if (regs.h.al == 0x1b)\r
+    return (TRUE);\r
+  else\r
+    return (FALSE);\r
+}\r
+\r