ref: 306bd81b628115bc2167ae40793b1c45365195ee
dir: /vh.c/
#define PIXTOBLOCK 4 // 16 pixels to an update block u8int update[UPDATEHIGH][UPDATEWIDE]; //========================================================================== pictabletype _seg *pictable; s16int px,py; u8int fontcolor,backcolor; s16int fontnumber; s16int bufferwidth,bufferheight; /* ============================================================================= Double buffer management routines ============================================================================= */ /* ======================= = = VW_MarkUpdateBlock = = Takes a pixel bounded block and marks the tiles in bufferblocks = Returns 0 if the entire block is off the buffer screen = ======================= */ s16int VW_MarkUpdateBlock (s16int x1, s16int y1, s16int x2, s16int y2) { s16int x,y,xt1,yt1,xt2,yt2,nextline; u8int *mark; xt1 = x1>>PIXTOBLOCK; yt1 = y1>>PIXTOBLOCK; xt2 = x2>>PIXTOBLOCK; yt2 = y2>>PIXTOBLOCK; if (xt1<0) xt1=0; else if (xt1>=UPDATEWIDE) return 0; if (yt1<0) yt1=0; else if (yt1>UPDATEHIGH) return 0; if (xt2<0) return 0; else if (xt2>=UPDATEWIDE) xt2 = UPDATEWIDE-1; if (yt2<0) return 0; else if (yt2>=UPDATEHIGH) yt2 = UPDATEHIGH-1; mark = updateptr + uwidthtable[yt1] + xt1; nextline = UPDATEWIDE - (xt2-xt1) - 1; for (y=yt1;y<=yt2;y++) { for (x=xt1;x<=xt2;x++) *mark++ = 1; // this tile will need to be updated mark += nextline; } return 1; } void VWB_DrawTile8 (s16int x, s16int y, s16int tile) { if (VW_MarkUpdateBlock (x,y,x+7,y+7)) LatchDrawChar(x,y,tile); } void VWB_Plot (s16int x, s16int y, s16int color) { if (VW_MarkUpdateBlock (x,y,x,y)) VW_Plot(x,y,color); } void VWB_Vlin (s16int y1, s16int y2, s16int x, s16int color) { if (VW_MarkUpdateBlock (x,y1,x,y2)) VW_Vlin(y1,y2,x,color); } void VW_UpdateScreen (void) { VH_UpdateScreen (); } /* ============================================================================= WOLFENSTEIN STUFF ============================================================================= */ /* ===================== = = LatchDrawPic = ===================== */ void LatchDrawPic (u16int x, u16int y, u16int picnum) { u16int wide, height, source; wide = pictable[picnum-STARTPICS].width; height = pictable[picnum-STARTPICS].height; source = latchpics[2+picnum-LATCHPICS_LUMP_START]; VL_LatchToScreen (source,wide/4,height,x*8,y); } //========================================================================== /* =================== = = LoadLatchMem = =================== */ void LoadLatchMem (void) { s16int i,j,p,m,width,height,start,end; u8int far *src; u16int destoff; // // tile 8s // FIXME: fuck this latchpics[0] = freelatch; src = (u8int _seg *)grsegs[STARTTILE8]; destoff = freelatch; for (i=0;i<NUMTILE8;i++) { VL_MemToLatch (src,8,8,destoff); src += 64; destoff +=16; } // // pics // start = LATCHPICS_LUMP_START; end = LATCHPICS_LUMP_END; for (i=start;i<=end;i++) { latchpics[2+i-start] = destoff; width = pictable[i-STARTPICS].width; height = pictable[i-STARTPICS].height; VL_MemToLatch (grsegs[i],width,height,destoff); destoff += width/4 *height; } EGAMAPMASK(15); } //========================================================================== /* =================== = = FizzleFade = = returns true if aborted = =================== */ extern ControlInfo c; int FizzleFade (u16int source, u16int dest, u16int width,u16int height, u16int frames, int abortable) { s16int pixperframe; u16int drawofs,pagedelta; u8int mask,maskb[8] = {1,2,4,8}; u16int x,y,p,frame; s32int rndval; pagedelta = dest-source; rndval = 1; y = 0; pixperframe = 64000/frames; IN_StartAck (); TimeCount=frame=0; do // while (1) { if (abortable && IN_CheckAck () ) return true; asm mov es,[screenseg] for (p=0;p<pixperframe;p++) { // // seperate random value into x/y pair // asm mov ax,[WORD PTR rndval] asm mov dx,[WORD PTR rndval+2] asm mov bx,ax asm dec bl asm mov [BYTE PTR y],bl // low 8 bits - 1 = y xoordinate asm mov bx,ax asm mov cx,dx asm mov [BYTE PTR x],ah // next 9 bits = x xoordinate asm mov [BYTE PTR x+1],dl // // advance to next random element // asm shr dx,1 asm rcr ax,1 asm jnc noxor asm xor dx,0x0001 asm xor ax,0x2000 noxor: asm mov [WORD PTR rndval],ax asm mov [WORD PTR rndval+2],dx if (x>width || y>height) continue; drawofs = source+ylookup[y] + (x>>2); // // copy one pixel // mask = x&3; VGAREADMAP(mask); mask = maskb[mask]; VGAMAPMASK(mask); asm mov di,[drawofs] asm mov al,[es:di] asm add di,[pagedelta] asm mov [es:di],al if (rndval == 1) // entire sequence has been completed return false; } frame++; while (TimeCount<frame) // don't go too fast ; } while (1); }