ref: 4c670f454f76120455674cd064d3f9bbb2e0d2aa
dir: /rend.c/
#include <u.h> #include <libc.h> #include "dat.h" #include "fns.h" Fnt fnts[2], *fnt; Pic *pics, *pice; Dat *exts, *exte; Dat *dems, *deme, *epis; Dat *wals, *sprs, *spre; int scale, npx; uchar *px; static uchar pxb[Va]; static void modpal(u32int *d, u32int *s, u32int c, int n, int steps) { int r, g, b, u, v, w; u32int p, *e; b = (c&0xff) * 255 / 63; g = (c>>8&0xff) * 255 / 63; r = (c>>16&0xff) * 255 / 63; e = d+nelem(pals[0]); while(d < e){ p = *s++; u = p & 0xff; v = p>>8 & 0xff; w = p>>16 & 0xff; u = u + (b-u) * n/steps; v = v + (g-v) * n/steps; w = w + (r-w) * n/steps; *d++ = w<<16 | v<<8 | u; } } void palpic(uchar *s) { u32int *p, *e; p = pals[Csod]; e = p + nelem(pals[Csod]); while(p < e){ *p++ = s[0]*255/63<<16 | s[1]*255/63<<8 | s[2]*255/63; s += 3; } pal = pals[Csod]; } void fadeout(int steps) { int i; u32int *o; o = pal; pal = pals[Caux]; vbl(1); for(i=0; i<steps; i++){ modpal(pals[Caux], pal, 0, i, steps); vbl(1); out(); } pal = o; } void fadein(int steps) { int i, u, v, w; u32int *o, p, *s, *d, *e; o = pal; pal = pals[Caux]; vbl(1); for(i=0; i<steps; i++){ s = o; d = pal; e = d+nelem(pals[Caux]); while(d < e){ p = *s++; u = (p & 0xff) * i/steps; v = (p>>8 & 0xff) * i/steps; w = (p>>16 & 0xff) * i/steps; *d++ = w<<16 | v<<8 | u; } vbl(1); out(); } pal = o; } void out(void) { int n; u32int c; uchar *s, *e, *d, *w; d = px; s = pxb; e = s + sizeof pxb; n = scale * 3; while(s < e){ c = pal[*s++]; w = d + n; while(d < w){ *d++ = c; *d++ = c>>8; *d++ = c>>16; } } flush(); } void put(int x, int y, int dx, int dy, uchar *s, int c) { uchar *d; d = pxb + x + y*Vw; if(s != nil) while(dy-- > 0){ memcpy(d, s, dx); s += dx; d += Vw; } else while(dy-- > 0){ memset(d, c, dx); d += Vw; } } int txt(int x, int y, char *t, int col) { int h, w; uchar c, *d, *s, *p, *e, *q; h = fnt->h; p = fnt->p; c = *t++; d = pxb + x + y*Vw; x = 0; while(c != 0){ w = fnt->w[c]; s = p + fnt->ofs[c]; e = s + w*h; while(s < e){ q = s + w; while(s < q){ c = *s++; if(c != 0) *d = col; d++; } d += Vw-w; } d -= Vw*h - w; x += w; c = *t++; } return x; } int txtnl(int x, int y, char *t, int col) { int n; char *s; n = 0; s = strtok(t, "\n"); while(s != nil){ n += txt(x, y, s, col); s = strtok(nil, "\n"); y += fnt->h; } return n; } int txtw(char *t) { int n; n = 0; while(*t != 0) n += fnt->w[(uchar)*t++]; return n; } void fill(int c) { memset(pxb, c, sizeof pxb); } void pic(int x, int y, int n) { Pic *p; p = pics+n; put(x, y, p->x, p->y, p->p, 0); }