home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / PIC1600 / F_25_7.C < prev    next >
C/C++ Source or Header  |  1996-06-27  |  7KB  |  218 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    "piclib.h"
  5. #ifndef SEEK_SET
  6.     #define SEEK_SET 0
  7. #endif
  8.  
  9. typedef struct {
  10.     FILE *fp;
  11.     unsigned long buffer[BUFFERSIZE];
  12.     unsigned long seek;
  13.     unsigned long totallength;
  14.     unsigned int nowpoint;
  15.     unsigned long nowcolor;
  16.     unsigned short nowlength;
  17. }    PicWork;
  18.  
  19. #ifdef LittleEndian
  20. #define r_short(p)        (((unsigned long)(((unsigned char*)(p))[0])) * 256L + ((unsigned char*)(p))[1])
  21. #define w_short(p,n)    ((((unsigned char*)(p))[0] = (unsigned char)(n/256)),\
  22.                          (((unsigned char*)(p))[1] = (unsigned char)(n%256)))
  23. #define r_long(p)        ((((unsigned long)(((unsigned char*)(p))[0])) << 24L) |\
  24.                          (((unsigned long)(((unsigned char*)(p))[1])) << 16L) |\
  25.                          (((unsigned long)(((unsigned char*)(p))[2])) <<  8L) |\
  26.                          (((unsigned long)(((unsigned char*)(p))[3]))      ))
  27. #define w_long(p,n)        ((((unsigned char*)(p))[0] = (unsigned char)((n) >> 24)),\
  28.                          (((unsigned char*)(p))[1] = (unsigned char)((n) >> 16)),\
  29.                          (((unsigned char*)(p))[2] = (unsigned char)((n) >>  8)),\
  30.                          (((unsigned char*)(p))[3] = (unsigned char) (n)       ))
  31. #if 0
  32. #define r_long(p)        (r_short(p) * 65536 + r_short(((unsigned char*)p)+2))
  33. #define w_long(p,n)        (w_short(p, n/65536), w_short(((unsigned char*)p)+2, n%65536))
  34. #endif
  35. #else
  36. #define r_short(p)         (*((unsigned short *)(p)))
  37. #define w_short(p,n)    ((*((unsigned short *)(p))) = (n))
  38. #define r_long(p)        (*((unsigned long *)(p)))
  39. #define w_long(p,n)        ((*((unsigned long *)(p))) = (n))
  40. #endif
  41.  
  42. int        PicReadHeader_25_7(PicData *pd, FILE *fp, unsigned char *magic)
  43. {
  44.     extern PicFunction PicFunction_16_16;
  45.     return PicFunction_16_16.PicReadHeader(pd, fp, magic);
  46. }
  47.  
  48. static inline Pixel Convert_25_32(unsigned long color)
  49. {
  50.     return (color & 0xffffff00UL) | ((color & 0x80) ? 0xff : 0);
  51. }
  52.  
  53. static inline unsigned long Convert_32_25(Pixel p)
  54. {
  55.     return p & 0xffffff80UL;
  56. }
  57.  
  58. extern int    WritePicHeader_DPIC(PicHeader *ph, FILE *fp);
  59.  
  60. int        PicOpen_25_7(PicData *pd, FILE *fp, int flag)
  61. {
  62.     unsigned long c;
  63.     PicWork *work;
  64.     if ((work = malloc(sizeof(PicWork))) == NULL) {
  65.         return FALSE;
  66.     }
  67.     pd->work = work;
  68.     work->fp = fp;
  69.     if (pd->flag == PIC_READ) {
  70.         fread(work->buffer, 1, BUFFERSIZE*sizeof(long), work->fp);
  71.         if (ferror(work->fp)) return FALSE;
  72.         work->nowpoint = 0;
  73.         c = r_long(work->buffer + work->nowpoint); work->nowpoint++;
  74.         work->nowcolor = Convert_25_32(c);
  75.         work->nowlength = c & 0x7f;
  76.     } else {
  77.         PicHeader ph;
  78.         ph.pixelX = pd->pixelX;
  79.         ph.pixelY = pd->pixelY;
  80.         ph.screenX = 4;
  81.         ph.screenY = 3;
  82.         ph.positionX = 0;
  83.         ph.positionY = 0;
  84.         ph.frame = 1;
  85.         ph.storecolor[0] = GRN;    ph.storecolorbit[0] = 8;
  86.         ph.storecolor[1] = RED;    ph.storecolorbit[1] = 8;
  87.         ph.storecolor[2] = BLU;    ph.storecolorbit[2] = 8;
  88.         ph.storecolor[3] = TRP;    ph.storecolorbit[3] = 1;
  89.         ph.storecolor[4] = 0;    ph.storecolorbit[4] = 0;
  90.         ph.mode = RLN;
  91.         ph.storedata[0] = COL;    ph.storedatabit[0] = 25;
  92.         ph.storedata[1] = LEN;    ph.storedatabit[1] = 7;
  93.         ph.storedata[2] = 0;        ph.storedatabit[2] = 0;
  94.  
  95.         if (WritePicHeader_DPIC(&ph, fp) == FALSE) return FALSE;
  96.  
  97.         work->seek = ftell(work->fp);
  98.         if (ferror(work->fp)) return FALSE;
  99.         work->nowpoint = 0;
  100.         w_long(work->buffer+work->nowpoint,0);work->nowpoint++;
  101.         work->nowcolor = 0;
  102.         work->nowlength = 0;
  103.         work->totallength = 0;
  104.     }
  105.     return TRUE;
  106. }
  107.  
  108. int        PicOutput_25_7(PicData *pd, Pixel *pixel)
  109. {
  110.     int pixels = pd->pixelX;
  111.     PicWork *work = pd->work;
  112.     unsigned short nowlength = work->nowlength;
  113.     unsigned long nowcolor = work->nowcolor;
  114.     unsigned long color;
  115.     for (; pixels > 0; --pixels) {
  116.         color = Convert_32_25(*pixel++);
  117.         if (color == nowcolor) {
  118.             if (nowlength == 127) {
  119.                 w_long(work->buffer+work->nowpoint, nowcolor | 127L);work->nowpoint++;
  120.                 if (work->nowpoint == BUFFERSIZE) {
  121.                     fwrite(work->buffer, 1, BUFFERSIZE * sizeof(long), work->fp);
  122.                     if (ferror(work->fp)) return FALSE;
  123.                     work->totallength += BUFFERSIZE * sizeof(long);
  124.                     work->nowpoint = 0;
  125.                 }
  126.                 nowlength = 0;
  127.             }
  128.             nowlength++;
  129.         } else {
  130.             if (nowlength > 0) {
  131.                 w_long(work->buffer+work->nowpoint, nowcolor | nowlength);work->nowpoint++;
  132.                 if (work->nowpoint == BUFFERSIZE) {
  133.                     fwrite(work->buffer, 1, BUFFERSIZE * sizeof(long), work->fp);
  134.                     if (ferror(work->fp)) return FALSE;
  135.                     work->totallength += BUFFERSIZE * sizeof(long);
  136.                     work->nowpoint = 0;
  137.                 }
  138.             }
  139.             nowlength = 1;
  140.             nowcolor = color;
  141.         }
  142.     }
  143.     work->nowcolor = nowcolor;
  144.     work->nowlength = nowlength;
  145.     return TRUE;
  146. }
  147.  
  148. int        PicInput_25_7(PicData *pd, Pixel *pixel)
  149. {
  150.     int pixels = pd->pixelX;
  151.     PicWork *work = pd->work;
  152.     Pixel nowpixel;
  153.     unsigned long c;
  154.     unsigned short nowlength = work->nowlength;
  155.     unsigned long nowcolor = work->nowcolor;
  156.     nowpixel = Convert_25_32(nowcolor);
  157.     while (nowlength <= pixels) {
  158.         pixels -= nowlength;
  159.         for (; nowlength > 0; --nowlength) {
  160.             *pixel++ = nowpixel;
  161.         }
  162.         c = r_long(work->buffer + work->nowpoint); work->nowpoint++;
  163.         nowcolor = Convert_25_32(c);
  164.         nowlength = c & 0x7f;
  165.         nowpixel = Convert_25_32(nowcolor);
  166.         if (work->nowpoint == BUFFERSIZE) {
  167.             fread(work->buffer, 1, BUFFERSIZE*sizeof(unsigned long), work->fp);
  168.             if (ferror(work->fp)) return FALSE;
  169.             work->nowpoint = 0;
  170.         }
  171.     }
  172.     nowlength -= pixels;
  173.     for (;pixels > 0; --pixels) {
  174.         *pixel++ = nowpixel;
  175.     }
  176.     work->nowlength = nowlength;
  177.     work->nowcolor = nowcolor;
  178.     return TRUE;
  179. }
  180.  
  181. int        PicClose_25_7(PicData *pd)
  182. {
  183.     PicWork *work = pd->work;
  184.     if (pd->flag == PIC_WRITE) {
  185.         if (work->nowlength > 0) {
  186.             w_long(work->buffer+work->nowpoint, work->nowcolor | work->nowlength);
  187.             work->nowpoint++;
  188.         }
  189.         if (work->nowpoint > 0) {
  190.             fwrite(work->buffer, 1, work->nowpoint * sizeof(unsigned long), work->fp);
  191.             if (ferror(work->fp)) return FALSE;
  192.             work->totallength += work->nowpoint * sizeof(unsigned long);
  193.         }
  194.         work->totallength -= 4;
  195.         fseek(work->fp, work->seek, SEEK_SET);
  196.         if (ferror(work->fp)) return FALSE;
  197.         fputc((int)( work->totallength >> 24L        ), work->fp);
  198.         fputc((int)((work->totallength >> 16L) & 0xffL), work->fp);
  199.         fputc((int)((work->totallength >>  8L) & 0xffL), work->fp);
  200.         fputc((int)((work->totallength       ) & 0xffL), work->fp);
  201.         if (ferror(work->fp)) return FALSE;
  202.     }
  203.     fclose(work->fp);
  204.     free(work);
  205.     return TRUE;
  206. }
  207.  
  208. PicFunction PicFunction_25_7 = {
  209.     "",
  210.     PicReadHeader_25_7,
  211.     PicOpen_25_7,
  212.     PicOutput_25_7,
  213.     PicInput_25_7,
  214.     PicClose_25_7
  215. };
  216.  
  217.  
  218.