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

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