364 lines
7.1 KiB
HolyC
364 lines
7.1 KiB
HolyC
|
#help_index "TextBase Layer;Char/TextBase Layer"
|
||
|
#help_file "::/Doc/TextBase"
|
||
|
|
||
|
asm {
|
||
|
//************************************
|
||
|
_TEXT_CHAR::
|
||
|
//Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d);
|
||
|
//Must be called 30fps in Fs->draw_it() callback.
|
||
|
PUSH RBP
|
||
|
MOV RBP,RSP
|
||
|
MOV RCX,U64 SF_ARG1[RBP]
|
||
|
MOV RBX,U64 CTask.scroll_x[RCX]
|
||
|
SAR RBX,3
|
||
|
ADD RBX,U64 SF_ARG3[RBP]
|
||
|
MOV RAX,U64 CTask.scroll_y[RCX]
|
||
|
SAR RAX,3
|
||
|
ADD RAX,U64 SF_ARG4[RBP]
|
||
|
|
||
|
TEST U8 SF_ARG2[RBP],0xFF
|
||
|
JNZ @@10
|
||
|
|
||
|
//Border not allowed
|
||
|
TEST RBX,RBX //Check X
|
||
|
JS @@05
|
||
|
ADD RBX,U64 CTask.win_left[RCX]
|
||
|
CMP RBX,U64 CTask.win_right[RCX]
|
||
|
JG @@05
|
||
|
TEST RBX,RBX
|
||
|
JS @@05
|
||
|
CMP RBX,TEXT_COLS
|
||
|
JGE @@05
|
||
|
TEST RAX,RAX //Check Y
|
||
|
JS @@05
|
||
|
ADD RAX,U64 CTask.win_top[RCX]
|
||
|
CMP RAX,U64 CTask.win_bottom[RCX]
|
||
|
JG @@05
|
||
|
TEST RAX,RAX
|
||
|
JS @@05
|
||
|
CMP RAX,TEXT_ROWS
|
||
|
JGE @@05
|
||
|
JMP @@15
|
||
|
|
||
|
@@05: XOR RAX,RAX //return FALSE
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
|
||
|
//Border allowed
|
||
|
@@10: MOV RDX,-1 //Check X
|
||
|
CMP RBX,RDX
|
||
|
JL @@05
|
||
|
ADD RBX,U64 CTask.win_left[RCX]
|
||
|
MOV RDX,U64 CTask.win_right[RCX]
|
||
|
INC RDX
|
||
|
CMP RBX,RDX
|
||
|
JG @@05
|
||
|
TEST RBX,RBX
|
||
|
JS @@05
|
||
|
CMP RBX,TEXT_COLS
|
||
|
JGE @@05
|
||
|
MOV RDX,-1 //Check Y
|
||
|
CMP RAX,RDX
|
||
|
JL @@05
|
||
|
ADD RAX,U64 CTask.win_top[RCX]
|
||
|
MOV RDX,U64 CTask.win_bottom[RCX]
|
||
|
INC RDX
|
||
|
CMP RAX,RDX
|
||
|
JG @@05
|
||
|
TEST RAX,RAX
|
||
|
JS @@05
|
||
|
CMP RAX,TEXT_ROWS
|
||
|
JGE @@05
|
||
|
|
||
|
@@15: IMUL2 RAX,TEXT_COLS
|
||
|
ADD RBX,RAX
|
||
|
SHL RBX,2
|
||
|
ADD RBX,U64 [&gr.text_base]
|
||
|
MOV RAX,U64 SF_ARG5[RBP]
|
||
|
MOV U32 [RBX],EAX
|
||
|
|
||
|
MOV RAX,TRUE
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
//************************************
|
||
|
_TEXT_LEN_STR::
|
||
|
//Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s)
|
||
|
//Must be called 30fps in Fs->draw_it() callback.
|
||
|
PUSH RBP
|
||
|
MOV RBP,RSP
|
||
|
PUSH RSI
|
||
|
PUSH RDI
|
||
|
MOV RBX,U64 SF_ARG1[RBP]
|
||
|
MOV RSI,U64 SF_ARG6[RBP]
|
||
|
MOV RDI,U64 CTask.scroll_x[RBX]
|
||
|
SAR RDI,3
|
||
|
ADD RDI,U64 SF_ARG2[RBP]
|
||
|
MOV RCX,U64 SF_ARG4[RBP]
|
||
|
|
||
|
TEST RDI,RDI
|
||
|
JNS @@05
|
||
|
ADD RCX,RDI
|
||
|
SUB RSI,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||
|
MOV RDX,RCX
|
||
|
ADD RDX,RDI
|
||
|
DEC RDX
|
||
|
CMP RDX,U64 CTask.win_right[RBX]
|
||
|
JLE @@10
|
||
|
MOV RAX,RDX
|
||
|
SUB RAX,U64 CTask.win_right[RBX]
|
||
|
SUB RDX,RAX
|
||
|
SUB RCX,RAX
|
||
|
@@10: TEST RDI,RDI
|
||
|
JNS @@15
|
||
|
ADD RCX,RDI
|
||
|
SUB RSI,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@15: INC RDX
|
||
|
SUB RDX,TEXT_COLS
|
||
|
JLE @@20
|
||
|
SUB RCX,RDX
|
||
|
@@20: CMP RCX,1
|
||
|
JL @@30
|
||
|
|
||
|
MOV RAX,U64 CTask.scroll_y[RBX]
|
||
|
SAR RAX,3
|
||
|
ADD RAX,U64 SF_ARG3[RBP]
|
||
|
TEST RAX,RAX
|
||
|
JS @@30
|
||
|
ADD RAX,U64 CTask.win_top[RBX]
|
||
|
CMP RAX,U64 CTask.win_bottom[RBX]
|
||
|
JG @@30
|
||
|
TEST RAX,RAX
|
||
|
JS @@30
|
||
|
CMP RAX,TEXT_ROWS
|
||
|
JGE @@30
|
||
|
|
||
|
IMUL2 RAX,TEXT_COLS
|
||
|
ADD RDI,RAX
|
||
|
SHL RDI,2
|
||
|
ADD RDI,U64 [&gr.text_base]
|
||
|
MOV RAX,U64 SF_ARG5[RBP]
|
||
|
@@25: LODSB
|
||
|
STOSD
|
||
|
DEC RCX
|
||
|
JNZ @@25
|
||
|
|
||
|
POP RDI
|
||
|
POP RSI
|
||
|
MOV RAX,TRUE
|
||
|
POP RBP
|
||
|
RET1 48
|
||
|
|
||
|
@@30: POP RDI
|
||
|
POP RSI
|
||
|
XOR RAX,RAX
|
||
|
POP RBP
|
||
|
RET1 48
|
||
|
//************************************
|
||
|
_TEXT_LEN_ATTR_STR::
|
||
|
//Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr)
|
||
|
//Must be called 30fps in Fs->draw_it() callback.
|
||
|
PUSH RBP
|
||
|
MOV RBP,RSP
|
||
|
PUSH RSI
|
||
|
PUSH RDI
|
||
|
MOV RBX,U64 SF_ARG1[RBP]
|
||
|
MOV RSI,U64 SF_ARG5[RBP]
|
||
|
MOV RDI,U64 CTask.scroll_x[RBX]
|
||
|
SAR RDI,3
|
||
|
ADD RDI,U64 SF_ARG2[RBP]
|
||
|
MOV RCX,U64 SF_ARG4[RBP]
|
||
|
|
||
|
TEST RDI,RDI
|
||
|
JNS @@05
|
||
|
ADD RCX,RDI
|
||
|
SHL RDI,2
|
||
|
SUB RSI,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||
|
MOV RDX,RCX
|
||
|
ADD RDX,RDI
|
||
|
DEC RDX
|
||
|
CMP RDX,U64 CTask.win_right[RBX]
|
||
|
JLE @@10
|
||
|
MOV RAX,RDX
|
||
|
SUB RAX,U64 CTask.win_right[RBX]
|
||
|
SUB RDX,RAX
|
||
|
SUB RCX,RAX
|
||
|
@@10: TEST RDI,RDI
|
||
|
JNS @@15
|
||
|
ADD RCX,RDI
|
||
|
SHL RDI,2
|
||
|
SUB RSI,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@15: INC RDX
|
||
|
SUB RDX,TEXT_COLS
|
||
|
JLE @@20
|
||
|
SUB RCX,RDX
|
||
|
@@20: CMP RCX,1
|
||
|
JL @@30
|
||
|
|
||
|
MOV RAX,U64 CTask.scroll_y[RBX]
|
||
|
SAR RAX,3
|
||
|
ADD RAX,U64 SF_ARG3[RBP]
|
||
|
TEST RAX,RAX
|
||
|
JS @@30
|
||
|
ADD RAX,U64 CTask.win_top[RBX]
|
||
|
CMP RAX,U64 CTask.win_bottom[RBX]
|
||
|
JG @@30
|
||
|
TEST RAX,RAX
|
||
|
JS @@30
|
||
|
CMP RAX,TEXT_ROWS
|
||
|
JGE @@30
|
||
|
|
||
|
IMUL2 RAX,TEXT_COLS
|
||
|
ADD RDI,RAX
|
||
|
SHL RDI,2
|
||
|
ADD RDI,U64 [&gr.text_base]
|
||
|
@@25: MOVSD
|
||
|
DEC RCX
|
||
|
JNZ @@25
|
||
|
|
||
|
POP RDI
|
||
|
POP RSI
|
||
|
MOV RAX,TRUE
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
|
||
|
@@30: POP RDI
|
||
|
POP RSI
|
||
|
XOR RAX,RAX
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
//************************************
|
||
|
_TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr)
|
||
|
//Must be called 30fps in Fs->draw_it() callback.
|
||
|
PUSH RBP
|
||
|
MOV RBP,RSP
|
||
|
PUSH RSI
|
||
|
PUSH RDI
|
||
|
MOV RBX,U64 SF_ARG1[RBP]
|
||
|
MOV RDI,U64 CTask.scroll_x[RBX]
|
||
|
SAR RDI,3
|
||
|
ADD RDI,U64 SF_ARG2[RBP]
|
||
|
MOV RCX,U64 SF_ARG4[RBP]
|
||
|
|
||
|
TEST RDI,RDI
|
||
|
JNS @@05
|
||
|
ADD RCX,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@05: ADD RDI,U64 CTask.win_left[RBX]
|
||
|
MOV RDX,RCX
|
||
|
ADD RDX,RDI
|
||
|
DEC RDX
|
||
|
CMP RDX,U64 CTask.win_right[RBX]
|
||
|
JLE @@10
|
||
|
MOV RAX,RDX
|
||
|
SUB RAX,U64 CTask.win_right[RBX]
|
||
|
SUB RDX,RAX
|
||
|
SUB RCX,RAX
|
||
|
@@10: TEST RDI,RDI
|
||
|
JNS @@15
|
||
|
ADD RCX,RDI
|
||
|
XOR RDI,RDI
|
||
|
@@15: INC RDX
|
||
|
SUB RDX,TEXT_COLS
|
||
|
JLE @@20
|
||
|
SUB RCX,RDX
|
||
|
@@20: CMP RCX,1
|
||
|
JL @@35
|
||
|
|
||
|
MOV RAX,U64 CTask.scroll_y[RBX]
|
||
|
SAR RAX,3
|
||
|
ADD RAX,U64 SF_ARG3[RBP]
|
||
|
TEST RAX,RAX
|
||
|
JS @@35
|
||
|
ADD RAX,U64 CTask.win_top[RBX]
|
||
|
CMP RAX,U64 CTask.win_bottom[RBX]
|
||
|
JG @@35
|
||
|
TEST RAX,RAX
|
||
|
JS @@35
|
||
|
CMP RAX,TEXT_ROWS
|
||
|
JGE @@35
|
||
|
|
||
|
IMUL2 RAX,TEXT_COLS
|
||
|
ADD RDI,RAX
|
||
|
SHL RDI,2
|
||
|
ADD RDI,U64 [&gr.text_base]
|
||
|
MOV RBX,U64 SF_ARG5[RBP]
|
||
|
MOV RSI,RDI
|
||
|
@@25: LODSD
|
||
|
TEST AL,AL
|
||
|
JNZ @@30
|
||
|
MOV RAX,RBX
|
||
|
STOSD
|
||
|
DEC RCX
|
||
|
JNZ @@25
|
||
|
|
||
|
@@30: POP RDI
|
||
|
POP RSI
|
||
|
MOV RAX,TRUE
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
|
||
|
@@35: POP RDI
|
||
|
POP RSI
|
||
|
XOR RAX,RAX
|
||
|
POP RBP
|
||
|
RET1 40
|
||
|
}
|
||
|
public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,
|
||
|
I64 x,I64 y,I64 d); //Plot char. 30fps in Fs->draw_it() callback.
|
||
|
public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,
|
||
|
I64 attr,U8 *s); //Plot str with len. 30fps in Fs->draw_it() callback.
|
||
|
public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,
|
||
|
I64 len,U32 *_attr); //Plot attr str with len. 30fps in Fs->draw_it() callback.
|
||
|
public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,
|
||
|
I64 attr); //Plot attrs with len. 30fps in Fs->draw_it() callback.
|
||
|
|
||
|
public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...)
|
||
|
{//Plot chars. 30fps in Fs->draw_it() callback.
|
||
|
//You probably want $LK,"GrPrint",A="MN:GrPrint"$() or just $LK,"Print",A="MN:Print"$().
|
||
|
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
|
||
|
TextLenStr(task,x,y,StrLen(buf),attr<<8,buf);
|
||
|
Free(buf);
|
||
|
}
|
||
|
|
||
|
public U0 TextBorder(CTask *task=NULL,
|
||
|
I64 l,I64 r,I64 t,I64 b,I64 attr,Bool solid)
|
||
|
{//Plot border square. 30fps in Fs->draw_it() callback.
|
||
|
//Draws window borders or DolDoc text bttn borders.
|
||
|
//Set task=sys_winmgr_task for no clipping.
|
||
|
I64 i;
|
||
|
if (!task) task=Fs;
|
||
|
attr<<=8;
|
||
|
TextChar(task,,l-1,t-1,text.border_chars[6+solid]+attr);
|
||
|
TextChar(task,,r+1,t-1,text.border_chars[8+solid]+attr);
|
||
|
TextChar(task,,l-1,b+1,text.border_chars[10+solid]+attr);
|
||
|
TextChar(task,,r+1,b+1,text.border_chars[12+solid]+attr);
|
||
|
for (i=l;i<=r;i++) {
|
||
|
TextChar(task,,i,t-1,text.border_chars[2+solid]+attr);
|
||
|
TextChar(task,,i,b+1,text.border_chars[2+solid]+attr);
|
||
|
}
|
||
|
for (i=t;i<=b;i++) {
|
||
|
TextChar(task,,l-1,i,text.border_chars[4+solid]+attr);
|
||
|
TextChar(task,,r+1,i,text.border_chars[4+solid]+attr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d)
|
||
|
{//Fill text rect. 30fps in Fs->draw_it() callback.
|
||
|
I64 y,w;
|
||
|
if (l>r || t>b) return;
|
||
|
if (t<0) t=0;
|
||
|
if (b>=TEXT_ROWS) b=TEXT_ROWS-1;
|
||
|
if (l<0) l=0;
|
||
|
if (r>=TEXT_COLS) r=TEXT_COLS-1;
|
||
|
if (w=r-l+1)
|
||
|
for (y=t;y<=b;y++)
|
||
|
MemSetU32(gr.text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),d,w);
|
||
|
}
|
||
|
|