www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1994/09/23/07:55:56

Date: Fri, 23 Sep 94 13:15:00 +0200
From: ctil AT zentrum DOT phys DOT chemie DOT tu-muenchen DOT de (Tilmann Haeberle)
To: David van Senden <ese AT perth DOT dialix DOT oz DOT au>
Subject: Re: We also want 256-color dumps!
Cc: djgpp AT sun DOT soe DOT clarkson DOT edu

I sent to Piet Mertens the following mail, which will
now be placed on the list (despite of it's length)
Hi,

might be the following routine solves your problem.
It lacks error handling, but you might easily drop it in.

With kind regards,
Tilmann Haeberle
/* --- BEGINNING OF FILE -------------------------------------------- */
/*      pcx.h
*
* Headerfile zur Verarbeitung von PCX-Dateien
*
* LANGUAGE:     Microsoft C 6.0
* AUTHOR:       Tilmann Hberle
* CREATED:      03-Nov-1991
* MODIFIED:     (date) (who) (what)
*/

#ifndef PCX_H
#define PCX_H

#ifdef _MSC_VER
#pragma pack(1)
#endif

typedef struct
   {
   unsigned char file_id;
   unsigned char version;
   unsigned char encoding;
   unsigned char bits_per_pixel;
   unsigned short window_left;
   unsigned short window_top;
   unsigned short window_right;
   unsigned short window_bottom;
   unsigned short hres;
   unsigned short vres;
   unsigned char pad1[16*3+1];
   unsigned char nplanes;
   unsigned short bytes_per_line;
   unsigned short palette_info;
   unsigned char fill[58];
   } PCXHEADER;

unsigned char get_pcx_byte(FILE *fp);

void make_pcx_header(FILE *fp, unsigned short xsize, unsigned short ysize);
void write_pcx_palette(FILE *fp);
void screen_copy(void);
void write_pcx_line(FILE *fp, unsigned char *p, int n);

#endif
/* --- END OF FILE -------------------------------------------------- */
/* --- BEGINNING OF FILE -------------------------------------------- */
/*      gnugraph.h
*
* Header-File fuer GNUGRAPH
* Mein Interface zur Gnu-Graphic-Bibliothek
*
* LANGUAGE:     Ansi C
* AUTHOR:       Tilmann Haeberle
* CREATED:      25-Jun-1992
* MODIFIED:     (date) (who) (what) 
*  26-Nov-1993 TH Verwendung Grx-Libraries falls GRX definiert
*/

#ifdef GRX
#include <grx.h>
#else
#include <graphics.h>
#endif

#ifndef __GNUC__
#pragma message("gnugraph.h is intended for GNU-C exclusively")
#endif

#define GRAPHBASE ((unsigned char*) 0xd0000000)

void GrSetClip(int x1, int y1, int x2, int y2);
void GrClippedLine(int x1, int y1, int x2, int y2, int c);

void GrFillArea(short xleft, short ytop, short xsize, short ysize,short color);

void set_standard_palette(void);
void get_std_pal_RGB(int i, unsigned char *r, unsigned char *g, unsigned char *b);

/* Quick-C-Graphic-Imitate: */

#ifndef _XYCOORD_DEFINED
/* return value of _setvieworg(), etc. */
struct xycoord {
        short xcoord;
        short ycoord;
};
#define _XYCOORD_DEFINED
#endif

extern int _gnu_pen;
extern struct xycoord _gnu_current;

short _setpixel(short x, short y);
struct xycoord _moveto(short x, short y);
short _lineto(short, short);
struct xycoord _getcurrentposition(void);

short _setcolor(short n);
short _getcolor(void);

void screen_copy(void);                  
/* --- END OF FILE -------------------------------------------------- */
/* --- BEGINNING OF FILE -------------------------------------------- */
/*      scrtopcx.c
*
* Modul zum Schreiben einer Bildschirmkopie als PCX-DAtei
*
* LANGUAGE:     ANSI-C; Getestet mit Microsoft C 6.0a und GNU C-386
* AUTHOR:       Tilmann Haeberle
* CREATED:      31-Mar-1993
* MODIFIED:     (date) (who) (what)
*/

#include <stdio.h>

#include <string.h>    /* memset() */
#include "gnugraph.h"
#include "pcx.h"

#define wp(x) fwrite(&h->x,sizeof(h->x),1,fp)

void write_pcx_header(FILE *fp, PCXHEADER *h)
   {
   wp(file_id);
   wp(version);
   wp(encoding);
   wp(bits_per_pixel);
   wp(window_left);
   wp(window_top);
   wp(window_right);
   wp(window_bottom);
   wp(hres);
   wp(vres);
   wp(pad1);
   wp(nplanes);
   wp(bytes_per_line);
   wp(palette_info);
   wp(fill);
   }

void write_pcx_palette(FILE *fp)
   {
   int i;
   int r,g,b;
   char rc,gc,bc;
   unsigned char magic_byte = 12;
   fwrite(&magic_byte,1,1,fp);
   for (i=0; i<=255; i++)
      {
      GrQueryColor(i,&r,&g,&b);
      rc = r;
      gc = g;
      bc = b;
      fwrite(&rc,1,1,fp);
      fwrite(&gc,1,1,fp);
      fwrite(&bc,1,1,fp);
      }
   }

void write_pcx_line(FILE *fp, unsigned char *p, int n)
   {
   int i;
   unsigned char byte;
   unsigned char samect;
   unsigned char repcode;
   i = 0;
   do {
      byte = p[i++];
      samect = 1;
      while (samect < (unsigned) 63 && i<n && byte == p[i])
         {
         samect++;
         i++;
         }
      if (samect > 1 || (byte & 0xC0) != 0)
         {
         repcode = 0xC0 | samect;
         fwrite(&repcode,1,1,fp);
         }
      fwrite(&byte,1,1,fp);
      } while (i<n);
   }

void write_pcx_bytes(FILE *fp)
   {
   int line;
   for (line = 0; line<=GrMaxY(); line ++)
      write_pcx_line(fp, GRAPHBASE + line * GrSizeX(), GrSizeX());
   }

void make_pcx_header(FILE *fp, unsigned short xsize, unsigned short ysize)
   {
   PCXHEADER h;
   h.file_id = 0xA;
   h.version = 5;    /* Version 3.0 */
   h.encoding = 1;   /* komprimiert */
   h.bits_per_pixel = 8;
   h.window_left = 0;
   h.window_top = 0;
   h.window_right = xsize-1;
   h.window_bottom = ysize-1;
   h.hres = 96;
   h.vres = 96;
   memset(h.pad1,0, sizeof(h.pad1));
   h.nplanes = 1;
   h.bytes_per_line = xsize;
   h.palette_info = 2;  /* Farbbild */
   memset(h.fill,0,sizeof(h.fill));
   write_pcx_header(fp,&h);
   }
   
void write_screen_to_pcx(FILE *fp)
   {
   make_pcx_header(fp,GrSizeX(),GrSizeY());
   write_pcx_bytes(fp);
   write_pcx_palette(fp);
   }

void screen_copy(void)
   {
   static unsigned short count = 0;
   FILE *fp;
   char fname[100];

   sprintf(fname, "/scr%u.pcx", count);
   fp = fopen(fname, "wb");
   if (fp == NULL)
      return;
   count ++;
   write_screen_to_pcx(fp);
   fclose(fp);
   }
/* --- END OF FILE -------------------------------------------------- */
May it be useful,
Tilmann Haeberle


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019