gates_of_skeldal/libs/bgraph2a.cpp
2025-01-25 13:08:41 +01:00

206 lines
6.3 KiB
C++

#include <skeldal_win.h>
#include "types.h"
#include "bgraph.h"
#include <debug.h>
void bar32(int x1,int y1, int x2, int y2)
{
word *begline;
int i,j;
if (x1>x2) swap_int(x1,x2);
if (y1>y2) swap_int(y1,y2);
if (x1<0) x1=0;
if (y1<0) y1=0;
if (x2>639) x2=639;
if (y2>479) y2=479;
for (i=y1,begline=screen+scr_linelen2*y1;i<=y2;i++,begline+=scr_linelen2)
{
for (j=x1;j<=x2;j++) begline[j]=curcolor;
}
}
void hor_line32(int x1,int y1,int x2)
{
word *begline;
int i;
unsigned long curcolor2=curcolor | (curcolor<<16);
if (y1<0 || y1>479) return;
if (x1>x2) swap_int(x1,x2);
if (x1<0) x1=0;
if (x2>639) x2=639;
begline=screen+scr_linelen2*y1;
for (i=x1;i<x2;i+=2) *(unsigned long *)(begline+i)=curcolor2;
if (i==x2) begline[i]=curcolor;
}
void ver_line32(int x1,int y1,int y2)
{
word *begline;
int i;
if (y1>y2) swap_int(y1,y2);
if (x1<0 || x1>639) return;
if (y1<0) y1=0;
if (y2>479) y2=479;
begline=screen+scr_linelen2*y1+x1;
for (i=y1;i<=y2;i++,begline+=scr_linelen2) *begline=curcolor;
}
void hor_line_xor(int x1,int y1,int x2)
{
word *begline;
int i;
unsigned long curcolor2=curcolor | (curcolor<<16);
if (y1<0 || y1>479) return;
if (x1>x2) swap_int(x1,x2);
if (x1<0) x1=0;
if (x2>639) x2=639;
begline=screen+scr_linelen2*y1;
for (i=x1;i<x2;i+=2) *(unsigned long *)(begline+i)^=curcolor2;
if (i==x2) begline[i]^=curcolor;
}
void ver_line_xor(int x1,int y1,int y2)
{
word *begline;
int i;
if (y1>y2) swap_int(y1,y2);
if (x1<0 || x1>639) return;
if (y1<0) y1=0;
if (y2>479) y2=479;
begline=screen+scr_linelen2*y1+x1;
for (i=y1;i<=y2;i++,begline+=scr_linelen2) *begline^=curcolor;
}
void line_32(int x,int y,int xs,int ys)
{
if (xs==0) {ver_line32(x,y,y+ys);return;}
if (ys==0) {hor_line32(x,y,x+xs);return;}
STOP();
}
void char_32(word *posit,word *font,char znak)
//#pragma aux char_32 parm [edi] [esi] [eax] modify [eax ebx ecx edx]
{
__asm
{
mov edi,posit;
mov esi,font;
mov al,znak
;edi - pozice na obrazovce
;esi - ukazatel na font
;al - znak
and eax,0ffh
mov ax,[esi][eax*2]
or ax,ax
jz chrend
add esi,eax
lodsw
xor dl,dl ;dl - je citac transparetnich pozic
mov cx,ax ;cl - XRES, ch - YRES
chr6: mov ebx,edi ;ebx - ukazuje po radcich v jednom sloupci
mov dh,ch ;dh - bude citac radku
chr5: or dl,dl ;pokud je dl = 0 pak se cte dalsi bajt
jnz chr1 ;jinak je dalsi bod jenom transparetni
lodsb ;cti barvu
or al,al ;pokud je 0 pak je transparetni
jz chr2 ;preskoc kresleni
cmp al,8 ;8 a vice jsou informace o opakovanych transparetnich bodech
jnc chr3 ;(viz FONTEDIT.DOC). Pak se podle toho zarid
and eax,0ffh;v eax jen dolnich 8 bitu
dec al
mov ax,short ptr charcolors[EAX*2] ;vyjmi barvu
cmp ax,0xffff ;0xffff je barva ktera se nekresli;
jz chr4 ;
mov [ebx],ax;zobraz ji na obrazovce
jmp chr4 ;a skoc na konec smycky
chr3: cmp al,0ffh ;pokud je al=255 pak jsme narazily na terminator.
jz chrend ;V tom pripade KONEC
sub al,6 ;odecti do al 6. Ziskas pocet transparetnich pozic
mov dl,al ;uloz je do citace
chr1: dec dl ;pro kazdou pozici to dl odecti dokud neni 0
chr2:
chr4: add ebx,scr_linelen;dalsi radka
dec dh ;odecti citac radek
jnz chr5 ;dokud neni nula
add edi,2 ;dalsi sloupec
dec cl ;odecti citac sloupcu
jnz chr6 ;dokud neni nula
chrend: ;konec
}
}
void char2_32(word *posit,word *font,char znak)
//#pragma aux char2_32 parm [edi] [esi] [eax] modify [eax ebx ecx edx]
{
__asm
{
mov edi,posit
mov esi,font
mov al,znak
;edi - pozice na obrazovce
;esi - ukazatel na font
;al - znak
and eax,0ffh
mov ax,[esi][eax*2]
or ax,ax
jz chr2end
add esi,eax
lodsw
xor dl,dl ;dl - je citac transparetnich pozic
mov cx,ax ;cl - XRES, ch - YRES
chr26: mov ebx,edi ;ebx - ukazuje po radcich v jednom sloupci
mov dh,ch ;dh - bude citac radku
chr25: or dl,dl ;pokud je dl = 0 pak se cte dalsi bajt
jnz chr21 ;jinak je dalsi bod jenom transparetni
lodsb ;cti barvu
or al,al ;pokud je 0 pak je transparetni
jz chr22 ;preskoc kresleni
cmp al,8 ;8 a vice jsou informace o opakovanych transparetnich bodech
jnc chr23 ;(viz FONTEDIT.DOC). Pak se podle toho zarid
and eax,0ffh;v eax jen dolnich 8 bitu
dec al
mov ax,charcolors[EAX*2] ;vyjmi barvu
push ebx
mov [ebx],ax;zobraz ji na obrazovce
mov [ebx+2],ax;zobraz ji na obrazovce
add ebx,scr_linelen
mov [ebx],ax;zobraz ji na obrazovce
mov [ebx+2],ax;zobraz ji na obrazovce
pop ebx
jmp chr24 ;a skoc na konec smycky
chr23: cmp al,0ffh ;pokud je al=255 pak jsme narazily na terminator.
jz chr2end ;V tom pripade KONEC
sub al,6 ;odecti do al 6. Ziskas pocet transparetnich pozic
mov dl,al ;uloz je do citace
chr21: dec dl ;pro kazdou pozici to dl odecti dokud neni 0
chr22:
chr24: add ebx,scr_linelen;dalsi radka
add ebx,scr_linelen
dec dh ;odecti citac radek
jnz chr25 ;dokud neni nula
add edi,4 ;dalsi sloupec
dec cl ;odecti citac sloupcu
jnz chr26 ;dokud neni nula
chr2end: ;konec
}
}
/* public charsize_
charsize_: ;esi - ukazatel na font
;al - znak
and eax,0ffh
mov ax,[esi][eax*2]
or ax,ax
jz chsend
add esi,eax
lodsw
chsend: and eax,0ffffh
ret*/