How to make a color transparent

Search this archive.

From: halfwolf (halfwolf@imneverwrong.com)
Date: Thu 14 Dec 2000 - 16:52:18 IST


Hey !

I have a program that draws pcx files on
the screen
(With svgalib -> svgalib.org).I want to
make a color transparent.Is this possible ?
Are there any tutorials/examples for this ?
Well , here is the source code of the
program that loads pcx files.

    #include <stdio.h>
          #include <unistd.h>
          #include <vga.h>
          #include <vgagl.h>
          #include <vgakeyboard.h>
          #include <stdlib.h>
          #include <string.h>


      // Structures
         typedef struct
          {
              char signature;
              char version;
              char encoding;
              char bytes_per_pixel;
              unsigned short int xmin;


              unsigned short int ymin;
              unsigned short int xmax;
              unsigned short int ymax;
              unsigned short int vres;
              unsigned short int hres;
              char palette[48];
              char reserved;
              char color_layers;
              unsigned short int
bytes_per_line;
              unsigned short int palette_type;
              char unused[58];
          } PCX_Header;
          // Prototyping

          void *readpcx (FILE *file,char
*palette,unsigned short int
*length,unsigned short int *height);
          void init_svgalib
(GraphicsContext *gc);
          void init_svgalib
(GraphicsContext *physicalscreen);
          void init_svgalib
(GraphicsContext *virtualscreen);
          void exit_svgalib();
          void prepare_font(void);


          // Globals
          GraphicsContext *physicalscreen;
          GraphicsContext *virtualscreen;
          int main(void)
          {
              FILE *file;

              void *image;

              int i;
              char ch;
              unsigned short int length,
height;
              unsigned char palette[768];
              int x;
              char *keymap;
              int i2,
              j,
              b,
              y,
              c;

    if
((file=fopen("thepcxfile.pcx","r"))==NULL)
    {
    printf("Can't open file! frank\n");
    }

    if
((image=readpcx(file,palette,&length,&height))==NULL)
    {
     printf ("File load failure.\n");
    }


              fclose (file);


              vga_init();
              vga_setmode(5);
              gl_setcontextvga(5);
              physicalscreen =
gl_allocatecontext();
              gl_setcontextvgavirtual(5);
              virtualscreen =
gl_allocatecontext();
              init_svgalib (virtualscreen);

              printf("Image is %dx%d
sized.\n",length,height);
              if ((length>320) || (height>200))
              {
                  printf ("Image is too
big!\n");
                  exit (1);
              }

              keyboard_init();

              // Enter main loop
              while( 1 )
              {
                  keyboard_update();




if(keyboard_keypressed(SCANCODE_ESCAPE))
          {
           vga_setmode(0);
           exit_svgalib();
           keyboard_close();
           return(0);
          }


     gl_putbox(0,0,40,30,image);
      gl_copyscreen(virtualscreen);
      vga_waitretrace();


    }
   return (0);
  }

          void readpcximage(FILE *
file,void * target,int size)
          {
              unsigned char buf;
              unsigned int counter;
              int i=1;
              while (i <= size)
              {
                  fread(&buf,1,1,file);
                  if ((buf&192)==192)
                  {
                      counter=(buf&63);
                      fread(&buf,1,1,file);
                      for(;counter>0;counter--)
                      {

((char*)target)[i]=buf;
                          i++;
                          if (i >= size)
                              break;
                      }
                  }
                  else
                  {
                      ((char*)target)[i]=buf;
                      i++;
                  }
              }
          }
          void *readpcx(FILE *file, char
*palette,unsigned short int *length,
unsigned short int *height)
          {
              PCX_Header header;
              void *target;
              fseek(file,0,SEEK_SET);

fread(&header,sizeof(PCX_Header),1,file);

*length=header.xmax+1-header.xmin;

*height=header.ymax+1-header.ymin;

if((header.signature!=0x0a)||(header.version!=5))
                  return(NULL);
              else
              {
                  target=(void
*)malloc((*length)*(*height));

readpcximage(file,target,(*length)*(*height));
                  fseek(file,-768,SEEK_END);
                  fread(palette,6,768,file);
                  return(target);
              }
          }
          void init_svgalib
(GraphicsContext *gc)
          {
              if (vga_init()!=0)
              {
                  printf("Error
initialising svgalib!\n");
                  exit(1);
              }
              if (vga_setmode(G320x200x256)!=0)
              {
                  printf("Can't set mode
320x200x256!\n");
                  exit(1);
              }

              if
(gl_setcontextvga(G320x200x256)!=0)
              {
                  printf("Error setting
context!\n");
                  exit(1);
              }
              gl_getcontext(gc);
              if
(gl_setcontextvgavirtual(G320x200x256)!=0)
              {
                  printf("Error setting
virtual context!\n");
                  exit(1);
              }

          }
          void exit_svgalib()
          {
              vga_setmode(TEXT);
          }


_____________________________________________
Free email with personality! Over 200 domains!
http://www.MyOwnEmail.com


------------------------------------------------------------------
Unsubscribe:  To:   listbot@svgalib.org
              Body: unsubscribe linux-svgalib


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST