home *** CD-ROM | disk | FTP | other *** search
- #include "conio.h"
- #include "malloc.h"
- #include "stdio.h"
- #include "stdlib.h"
- #include "graph.h"
-
-
- #define RGB(r,g,b) (( (long)((b)<<8|(g))<<8)|(r))
-
-
- int pcx_show(char *, int, int, int);
- void pcx_header(char *);
- void pcx_write_1(char *, int, int, int);
- void pcx_write_8(char *, int, int, int);
-
-
- unsigned int WIDTH, HIGH, PLANES, BITS_PIXEL, BYTES_LINE,
- SCREEN_X, SCREEN_Y,
- PALETTE_PCX[256][3];
-
-
- int pcx_show(char *PCX_FILE_NAME, int pal_no, int x0, int y0)
- {
- pcx_header(PCX_FILE_NAME);
-
- if (BITS_PIXEL ==1)
- {
- _setvideomode(_MAXRESMODE);
- printf("OPEN pcx file [%s]",PCX_FILE_NAME);
- pcx_write_1(PCX_FILE_NAME, pal_no, x0,y0);
- }
-
- else
- {if (BITS_PIXEL==8)
- {
- _setvideomode(_MAXCOLORMODE);
- pcx_write_8(PCX_FILE_NAME, pal_no, x0,y0);
- }
- else
- {printf("\nCan not creat Microsoft image file for this pcx file !!!");
- getch();
- return(2);
- }
- }
-
- return(0);
- }
-
-
- /**************** READ PCX FILE'S HEADER !!!*****************/
- void pcx_header(char PCX_FILE_NAME[])
- {
- register unsigned int i,j;
- unsigned FA, FB, FC;
-
- FILE *fp_in;
-
-
- if ((fp_in=fopen(PCX_FILE_NAME,"rb"))==NULL)
- { printf("\nCan't open pcx file ...[%s]",PCX_FILE_NAME);
- getch();
- exit(3);
- }
-
- fseek(fp_in,0,SEEK_SET);
- FA= fgetc(fp_in);
- FB= fgetc(fp_in);
- FC= fgetc(fp_in);
-
- if (!(FA==10 && FB==5 && FC==1))
- {
- printf("\nError reading Header of PCX file !!! =%2x%2x%2x",FA,FB,FC);
- getch();
- exit(4);
- }
-
- fseek(fp_in, 3, SEEK_SET); BITS_PIXEL = fgetc(fp_in);
- fseek(fp_in, 8, SEEK_SET); WIDTH = fgetc(fp_in) + fgetc(fp_in)*256 +1 ;
- fseek(fp_in,0x0A, SEEK_SET); HIGH = fgetc(fp_in) + fgetc(fp_in)*256 +1 ;
- fseek(fp_in,0x0C, SEEK_SET); SCREEN_X = fgetc(fp_in) + fgetc(fp_in)*256 ;
- fseek(fp_in,0x0E, SEEK_SET); SCREEN_Y = fgetc(fp_in) + fgetc(fp_in)*256 ;
- fseek(fp_in,0x41, SEEK_SET); PLANES = fgetc(fp_in);
- fseek(fp_in,0x42, SEEK_SET); BYTES_LINE = fgetc(fp_in);
-
-
- fseek(fp_in,0x10, SEEK_SET);
- for (i=0; i<16; ++i)
- {
- for (j=0; j<3; ++j) PALETTE_PCX[i][j]=fgetc(fp_in);
- }
- fclose(fp_in);
-
- }
-
-
- void pcx_write_1(char PCX_FILE_NAME[], int pal_no, int x0, int y0)
- {
- unsigned register int i,j;
-
- unsigned int BYTES_LINE_TC, jn[4]={ 0, 1, 2, 3}, j_p;
-
- int CH, CHi, k, n;
-
- size_t size;
-
- long int palette[256];
-
- char *buf, null_ch, a_line[80];
-
- FILE *fp_in;
-
- struct videoconfig vc;
-
- struct rccoord xy;
-
-
-
- null_ch=0;
-
- _getvideoconfig(&vc);
-
- if (x0+WIDTH>vc.numxpixels) x0=0;
- if (y0+HIGH >vc.numypixels) y0=0;
-
-
- BYTES_LINE_TC=(WIDTH+7)/8;
-
- size = 4*BYTES_LINE_TC+4;
-
- buf = malloc(size);
-
- buf[0]=WIDTH-(WIDTH>>8)*0x100;
- buf[1]= WIDTH>>8;
- buf[2]=1;
- buf[3]=0;
-
-
-
-
- if (pal_no>0)
- {
- if (x0 > 0 || y0 > 0)
- {
- _setcolor(pal_no);
- _rectangle(_GBORDER,x0-1, y0-1, WIDTH+x0, HIGH+y0);
- }
- }
-
- if (PLANES>=3 || BITS_PIXEL==8)
- {
- for (i=0; i<vc.numcolors; i++)
- {
- palette[i]=RGB(PALETTE_PCX[i][0]/4, PALETTE_PCX[i][1]/4, PALETTE_PCX[i][2]/4);
- _remappalette(i,palette[i]);
- }
- if (!_remapallpalette(palette))
- {
- printf("Microsoft C set color palette ERROR !!!");
- getch();
- exit(6);
- }
- }
-
- fp_in = fopen(PCX_FILE_NAME,"rb");
- fseek(fp_in, 0x80, SEEK_SET);
-
- for (i=0; i<HIGH; ++i)
- {
- /*_settextposition(2,1); printf("LINE:[%3d]",i);*/
-
- for (j=0; j<PLANES; ++j)
- {
- k=0;
- do
- {
- CH=fgetc(fp_in);
- if (CH < 0xC1)
- {
- a_line[k]=CH;
- k=k+1;
- }
- else
- {
- n = CH-0xC0;
- CHi = fgetc(fp_in);
- do
- {
- a_line[k]=CHi;
- n=n-1;
- k=k+1;
- }
- while (n>0);
- }
- }
- while (k<BYTES_LINE);
-
- switch (PLANES)
- {
- case 4 : j_p=jn[j] * BYTES_LINE_TC +4 ;
- for(k=0; k<BYTES_LINE_TC; ++k) buf[j_p++]=a_line[k];
- break;
-
- case 3 : j_p=jn[j] * BYTES_LINE_TC +4;
- for(k=0; k<BYTES_LINE_TC; ++k) buf[j_p]=a_line[k];
- if (j==2)
- {j_p=3 * BYTES_LINE_TC +4;
- for(k=0; k<BYTES_LINE_TC; ++k) buf[j_p++]=a_line[k];
- }
- break;
-
- case 2 : for (n=j*2; n<j*2+2; ++n)
- {j_p=n * BYTES_LINE_TC + 4;
- for(k=0; k<BYTES_LINE_TC; ++k) buf[j_p++]=a_line[k];
- }
- break;
-
- case 1 : for (n=j; n<4; ++n)
- {j_p=jn[n] * BYTES_LINE_TC +4;
- for(k=0; k<BYTES_LINE_TC; ++k) buf[j_p++]=a_line[k];
- }
- break;
- }
- }
- _putimage( x0, y0+i, buf, _GPSET);
- }
-
- fclose(fp_in);
- free(buf);
-
-
- }
-
-
-
-
- void pcx_write_8(char PCX_FILE_NAME[], int pal_no, int x0, int y0)
- {
- unsigned register int i,j;
-
- unsigned int BYTES_LINE_TC, j_p;
-
- int CH, CHi, k, n;
-
- size_t size;
-
- long int palette[256];
-
- char *buf, null_ch, a_line[512];
-
- FILE *fp_in;
-
- struct videoconfig vc;
-
- struct rccoord xy;
-
-
-
- null_ch=0;
-
- _getvideoconfig(&vc);
-
- if (x0+WIDTH>vc.numxpixels) x0=0;
- if (y0+HIGH >vc.numypixels) y0=0;
-
- if (pal_no>0)
- {
- if (x0 > 0 || y0 > 0)
- {
- _setcolor(pal_no);
- _rectangle(_GBORDER,x0-1, y0-1, WIDTH+x0, HIGH+y0);
- }
- }
-
- BYTES_LINE_TC=WIDTH;
-
- size = BYTES_LINE_TC+4;
-
- buf= malloc(size);
-
- fp_in = fopen(PCX_FILE_NAME,"rb");
- fseek(fp_in, 0x80, SEEK_SET);
-
- for (i=0; i<HIGH; ++i)
- {
- buf[0]=WIDTH*8-((WIDTH*8)>>8)<<8;
- buf[1]=(WIDTH*8)>>8;
- buf[2]=1;
- buf[3]=0;
- k=0;
- do
- {
- CH=fgetc(fp_in);
- if (CH < 0xC1)
- {
- a_line[k]=CH;
- k=k+1;
- }
- else
- {
- n = CH-0xC0;
- CHi = fgetc(fp_in);
- do
- {
- a_line[k]=CHi;
- n=n-1;
- k=k+1;
- }
- while (n>0);
- }
- }
- while (k<BYTES_LINE_TC);
-
- for(k=0,j_p=4; k<BYTES_LINE_TC; ++k) buf[j_p++]=a_line[k];
- _putimage( x0, y0+i, buf, _GPSET);
- }
-
- free(buf);
-
- do {} while (fgetc(fp_in)!=0xC);
- for (i=0; i<256; i++)
- {
- for (j=0; j<3; ++j) PALETTE_PCX[i][j]=fgetc(fp_in);
- }
- fclose(fp_in);
-
- if (PLANES>=3 || BITS_PIXEL==8)
- {
- for (i=0; i<vc.numcolors; i++)
- {
- palette[i]=RGB(PALETTE_PCX[i][0]/4, PALETTE_PCX[i][1]/4, PALETTE_PCX[i][2]/4);
- _remappalette(i,palette[i]);
- }
- if (!_remapallpalette(palette))
- {
- printf("Microsoft C set color palette ERROR !!!");
- getch();
- exit(6);
- }
- }
-
- }
-
-
-
-
-
-
-