home *** CD-ROM | disk | FTP | other *** search
/ Creative Computers / CreativeComputers.iso / shareware / text / dvi_3.62 / source / dvisrc.lha / dvipkch.c < prev    next >
C/C++ Source or Header  |  1993-10-26  |  5KB  |  232 lines

  1. /*
  2. ** Datei: DVIPKCH.C (Version DVI)
  3. ** Autor: Ingo Eichenseher
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdarg.h>
  8. #include "dvi.h"
  9. #include "dviframe.h"
  10. #include "dvidvi.h"
  11.  
  12. static int repeat_count;
  13. static int q;
  14. static byte *p;
  15.  
  16. #define get_pk_nyb(p,q) ( ((q)=!(q))==0 ? *(p)++&15 : *(p)>>4)
  17.  
  18. static int pk_pnum(int dyn_f)
  19. {
  20.     int i;
  21.     if ( (i=get_pk_nyb(p,q))==0 )
  22.     {
  23.     int j; i++;
  24.     while ( (j=get_pk_nyb(p,q))==0 ) i++;
  25.     while ( i-- ) j = (j<<4)+get_pk_nyb(p,q);
  26.     return j-15+((13-dyn_f)<<4)+dyn_f;
  27.     }
  28.     if (i<=dyn_f) return i;
  29.     if (i<14) return ((i-dyn_f-1)<<4) + get_pk_nyb(p,q) + dyn_f +1;
  30.     if (i==14) repeat_count=pk_pnum(dyn_f);
  31.     else repeat_count=1;
  32.     return pk_pnum(dyn_f);
  33. }
  34.  
  35. #ifndef IBMPC
  36. void draw_char(pk_char *c, int x ,int y)
  37. {
  38.     long    da;
  39.     int     db;
  40.     byte    dm;
  41.     int     dyn_f   = c->dyn_f;
  42.     int     state   = !c->state;
  43.     int     h       = (int)c->h;
  44.     int     w       = (int)c->w;
  45.     int     xx;
  46.  
  47.     x  -= (int)c->hoff;
  48.     y  -= (int)c->voff;
  49.     p  =  (byte far*)(byte huge*)c->data;
  50.     q  =  0;
  51.     db =  x%8<0 ? -(x%8):7-x%8;
  52.     dm =  128 >> (7-db);
  53.     x  =  x<0 ? (x-7)/8 : x/8;
  54.     da =  x+(long)y*frame_width;
  55.  
  56.     if (w==0 || h==0 || y>=frame_height) return;
  57.     repeat_count=0;
  58.  
  59.     if (dyn_f==14)
  60.     {
  61.     register byte *pa = c->data;
  62.     register byte  pm = 128;
  63.     register int   pb = 7;
  64.     register int   ww;
  65.     register byte  lm;
  66.     register int   lb;
  67.     register long  la;
  68.     while(h--)
  69.     {
  70.         la=da; lb=db; lm=dm;
  71.         for (ww=w,xx=x; ww--;)
  72.         {
  73.         if (pm & *pa)
  74.             if (y>=0 && xx>=0 && xx<frame_width)
  75.             frame_or(la,lm);
  76.         if (lb--) lm >>= 1;
  77.         else { lb=7; lm=128; la++; xx++; }
  78.         if (pb--) pm >>= 1;
  79.         else { pb=7; pm=128; pa++; }
  80.         }
  81.         da += frame_width;
  82.         if (++y>=frame_height) break;
  83.     }
  84.     }
  85.     else
  86.     {
  87.     register int    r=0;
  88.     int    rep_mode=0;
  89.  
  90.     while(h>0)
  91.     {
  92.         register byte  lm;
  93.         register long  la;
  94.         register int   lb,ww;
  95.         register byte *rp;
  96.         register int   rq,rstate,rr;
  97.  
  98.         la=da; lb=db; lm=dm;
  99.         rp=p; rq=q; rstate=state; rr=r;
  100.         for(ww=w,xx=x; ww--;)
  101.         {
  102.         if (r==0) { state=!state; r=pk_pnum(dyn_f); }
  103.         r--;
  104.         if (state)
  105.             if (y>=0 && xx>=0 && xx<frame_width)
  106.             frame_or(la,lm);
  107.         if (lb--) lm>>=1;
  108.         else { lb=7; lm=128; la++; xx++; }
  109.         }
  110.         da += frame_width; h--;
  111.         if (++y>=frame_height) break;
  112.  
  113.         if (rep_mode==0 && repeat_count) rep_mode=repeat_count+1;
  114.         repeat_count=0;
  115.         if (rep_mode)
  116.         {
  117.         if (--rep_mode==0) continue;
  118.         p=rp; q=rq; state=rstate; r=rr;
  119.         }
  120.     }
  121.     }
  122. }
  123. #endif
  124.  
  125. void draw_rule(int x, int y, int w, int h)
  126. {
  127.     register int db, dm, ww, xx, lb, lm;
  128.     register long da;
  129.     register long la;
  130.  
  131.     db =  x%8<0 ? -(x%8):7-x%8;
  132.     dm =  128 >> (7-db);
  133.     x  =  x<0 ? (x-7)/8 : x/8;
  134.     da =  x+(long)y*frame_width;
  135.  
  136.     if (y>=frame_height) return;
  137.     if (w<=0 || h<=0) return;
  138.  
  139.     while(h--)
  140.     {
  141.     la=da; lb=db; lm=dm;
  142.     for (ww=w, xx=x; ww--;)
  143.     {
  144.         if (y>=0 && xx>=0 && xx<frame_width) frame_or(la,lm);
  145.         if (lb--) lm>>=1;
  146.         else { lb=7; lm=128; la++; xx++; }
  147.     }
  148.     da += frame_width;
  149.     if (++y>=frame_height) break;
  150.     }
  151. }
  152.  
  153. void ldraw_char(pk_char *c, int x, int y)
  154. {
  155.     long    da;
  156.     int     db;
  157.     byte    dm;
  158.     int     dyn_f   = c->dyn_f;
  159.     int     state   = !c->state;
  160.     int     h       = (int)c->h;
  161.     int     w       = (int)c->w;
  162.  
  163.     x  += (int)c->voff;
  164.     y  -= (int)c->hoff;
  165.     p  =  (byte far*)(byte huge*)c->data;
  166.     q  =  0;
  167.     db =  x%8<0 ? -(x%8):7-x%8;
  168.     dm =  128 >> (7-db);
  169.     x  =  x<0 ? (x-7)/8 : x/8;
  170.     da =  x+(long)y*frame_width;
  171.  
  172.     if (w==0 || h==0 || x<0) return;
  173.     repeat_count=0;
  174.  
  175.     if (dyn_f==14)
  176.     {
  177.     register byte huge *pa = c->data;
  178.     register byte  pm = 128;
  179.     register int   pb = 7;
  180.     register long  la;
  181.  
  182.     while(h--)
  183.     {
  184.         register int ww,yy;
  185.         la=da; yy=y;
  186.         for (ww=w; ww--;)
  187.         {
  188.         if (pm & *pa)
  189.             if (yy>=0 && yy<frame_height && x<frame_width)
  190.             frame_or(la,dm);
  191.         la += frame_width; yy++;
  192.         if (pb--) pm >>= 1;
  193.         else { pb=7; pm=128; pa++; }
  194.         }
  195.         if (++db==8) { db=0; dm=1; da--; x--; if (x<0) break; }
  196.         else dm<<=1;
  197.     }
  198.     }
  199.     else
  200.     {
  201.     register int r=0; int rep_mode=0;
  202.     while(h>0)
  203.     {
  204.         register long  la;
  205.         register int   ww,yy;
  206.         register byte *rp;
  207.         register int   rq,rstate,rr;
  208.         la = da;
  209.         rp=p; rq=q; rstate=state; rr=r; yy=y;
  210.         for (ww=w; ww--; )
  211.         {
  212.         if (r==0) { state=!state; r=pk_pnum(dyn_f); }
  213.         r--;
  214.         if (state)
  215.             if (yy>=0 && yy<frame_height && x<frame_width)
  216.             frame_or(la,dm);
  217.         la += frame_width; yy++;
  218.         }
  219.         if (++db==8) { db=0; dm=1; da--; x--; if (x<0) break; }
  220.         else dm<<=1;
  221.         h--;
  222.         if (rep_mode==0 && repeat_count) rep_mode=repeat_count+1;
  223.         repeat_count=0;
  224.         if (rep_mode)
  225.         {
  226.         if (--rep_mode==0) continue;
  227.         p=rp; q=rq; state=rstate; r=rr;
  228.         }
  229.     }
  230.     }
  231. }
  232.