home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Creative Computers
/
CreativeComputers.iso
/
shareware
/
text
/
dvi_3.62
/
source
/
dvisrc.lha
/
dvipkch2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-26
|
5KB
|
262 lines
/*
** Datei: DVIPKCH2.C
** Autor: Ingo Eichenseher
*/
#include <stdio.h>
#include <stdarg.h>
#include "dvi.h"
#include "dvidvi.h"
#include "dviframe.h"
#include "dvisplin.h"
#include "dvidraw.h"
static int repeat_count;
static int q;
static byte huge *p;
#define get_pk_nyb(p,q) ( ((q)=!(q))==0 ? *(p)++&15 : *(p)>>4)
static int pk_pnum(int dyn_f)
{
int i;
if ( (i=get_pk_nyb(p,q))==0 )
{
int j; i++;
while ( (j=get_pk_nyb(p,q))==0 ) i++;
while ( i-- ) j = (j<<4)+get_pk_nyb(p,q);
return j-15+((13-dyn_f)<<4)+dyn_f;
}
if (i<=dyn_f) return i;
if (i<14) return ((i-dyn_f-1)<<4) + get_pk_nyb(p,q) + dyn_f +1;
if (i==14) repeat_count=pk_pnum(dyn_f);
else repeat_count=1;
return pk_pnum(dyn_f);
}
void draw2_char(pk_char *c, int x ,int y)
{
long da;
int db;
byte dm;
int dyn_f = c->dyn_f;
int state = !c->state;
int h = (int)c->h;
int w = (int)c->w;
int xx, real_x, real_xx;
int sw, *swp;
x -= (int)c->hoff;
y -= (int)c->voff;
real_x = x;
p = c->data;
q = 0;
db = x%8<0 ? -(x%8):7-x%8;
dm = 128 >> (7-db);
x = x<0 ? (x-7)/8 : x/8;
da = x+(long)y*frame_width;
if (w==0 || h==0 || y>=frame_height) return;
if (y>=clip_ymax) return;
repeat_count=0;
if (dyn_f==14)
{
register byte *pa = c->data;
register byte pm = 128;
register int pb = 7;
register int ww;
register byte lm;
register long la;
register int lb;
while(h--)
{
la=da; lb=db; lm=dm;
if (y>clip_ymax) break;
SW_Y(y);
SW_X(real_x);
for (ww=w,xx=x,real_xx=real_x; ww--;)
{
if (SW && (pm & *pa) && y>=0 && xx>=0 && xx<frame_width)
frame_or(la,lm);
if (lb--) lm >>= 1;
else { lb=7; lm=128; la++; xx++; }
if (pb--) pm >>= 1;
else { pb=7; pm=128; pa++; }
++real_xx;
SW_X(real_xx);
}
da += frame_width;
if (++y>=frame_height) break;
}
}
else
{
register int r=0;
int rep_mode=0;
while( h > 0)
{
register byte lm;
register int lb,ww;
register byte huge *rp;
register int rq,rstate,rr;
register long la;
la=da; lb=db; lm=dm;
rp=p; rq=q; rstate=state; rr=r;
if (y>clip_ymax) break;
SW_Y(y);
SW_X(real_x);
for(ww=w,xx=x,real_xx=real_x; ww--;)
{
if (r==0) { state=!state; r=pk_pnum(dyn_f); }
r--;
if (SW && state && y>=0 && xx>=0 && xx<frame_width)
frame_or(la,lm);
if (lb--) lm>>=1;
else { lb=7; lm=128; la++; xx++; }
real_xx++;
SW_X(real_xx);
}
da += frame_width; h--;
if (++y>=frame_height) break;
if (rep_mode==0 && repeat_count) rep_mode=repeat_count+1;
repeat_count=0;
if (rep_mode)
{
if (--rep_mode==0) continue;
p=rp; q=rq; state=rstate; r=rr;
}
}
}
}
void ldraw2_char(pk_char *c, int x, int y)
{
long da;
int db;
byte dm;
int dyn_f = c->dyn_f;
int state = !c->state;
int h = (int)c->h;
int w = (int)c->w;
int real_x;
x += (int)c->voff;
y -= (int)c->hoff;
real_x = x;
p = c->data;
q = 0;
db = x%8<0 ? -(x%8):7-x%8;
dm = 128 >> (7-db);
x = x<0 ? (x-7)/8 : x/8;
da = x+(long)y*frame_width;
if (w==0 || h==0 || x<0) return;
repeat_count=0;
if (dyn_f==14)
{
register byte *pa = c->data;
register byte pm = 128;
register int pb = 7;
register long la;
while(h--)
{
register int ww,yy;
la=da; yy=y;
for (ww=w; ww--;)
{
SW_Y(yy);
SW_X(real_x);
if (SW && (pm & *pa))
if (yy>=0 && yy<frame_height && x<frame_width)
frame_or(la,dm);
la += frame_width; yy++;
if (pb--) pm >>= 1;
else { pb=7; pm=128; pa++; }
}
if (++db==8) { db=0; dm=1; da--; x--; if (x<0) break; }
else dm<<=1;
real_x--;
}
}
else
{
register int r=0; int rep_mode=0;
while(h>0)
{
register long la;
register int ww,yy;
register byte huge *rp;
register int rq,rstate,rr;
la = da;
rp=p; rq=q; rstate=state; rr=r; yy=y;
for (ww=w; ww--; )
{
SW_Y(yy);
SW_X(real_x);
if (r==0) { state=!state; r=pk_pnum(dyn_f); }
r--;
if (SW && state)
if (yy>=0 && yy<frame_height && x<frame_width)
frame_or(la,dm);
la += frame_width; yy++;
}
if (++db==8) { db=0; dm=1; da--; x--; if (x<0) break; }
else dm<<=1;
real_x--;
h--;
if (rep_mode==0 && repeat_count) rep_mode=repeat_count+1;
repeat_count=0;
if (rep_mode)
{
if (--rep_mode==0) continue;
p=rp; q=rq; state=rstate; r=rr;
}
}
}
}
void draw2_rule(int x, int y, int w, int h)
{
register int db, dm, ww, xx, lb, lm, real_x, real_xx;
register long da, la;
real_x = x;
db = x%8<0 ? -(x%8):7-x%8;
dm = 128 >> (7-db);
x = x<0 ? (x-7)/8 : x/8;
da = x+(long)y*frame_width;
if (y>=frame_height) return;
if (w<=0 || h<=0) return;
while(h--)
{
SW_Y(y);
SW_X(real_x);
la=da; lb=db; lm=dm;
for (ww=w, xx=x, real_xx=real_x; ww--;)
{
if (SW && y>=0 && xx>=0 && xx<frame_width) frame_or(la,lm);
if (lb--) lm>>=1;
else { lb=7; lm=128; la++; xx++; }
real_xx++;
SW_X(real_xx);
}
da += frame_width;
if (++y>=frame_height) break;
}
}