hschumann2/TempleOS-Source-Code
0847
1 2#help_index "TextBase Layer;Char/TextBase Layer"3#help_file "::/Doc/TextBase"4 5asm {6//************************************7_TEXT_CHAR::8//Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d);9//Must be called 30fps in Fs->draw_it() callback.10 PUSH RBP11 MOV RBP,RSP12 MOV RCX,U64 SF_ARG1[RBP]13 MOV RBX,U64 CTask.scroll_x[RCX]14 SAR RBX,315 ADD RBX,U64 SF_ARG3[RBP]16 MOV RAX,U64 CTask.scroll_y[RCX]17 SAR RAX,318 ADD RAX,U64 SF_ARG4[RBP]19 20 TEST U8 SF_ARG2[RBP],0xFF21 JNZ @@1022 23//Border not allowed24 TEST RBX,RBX //Check X25 JS @@0526 ADD RBX,U64 CTask.win_left[RCX]27 CMP RBX,U64 CTask.win_right[RCX]28 JG @@0529 TEST RBX,RBX30 JS @@0531 CMP RBX,TEXT_COLS32 JGE @@0533 TEST RAX,RAX //Check Y34 JS @@0535 ADD RAX,U64 CTask.win_top[RCX]36 CMP RAX,U64 CTask.win_bottom[RCX]37 JG @@0538 TEST RAX,RAX39 JS @@0540 CMP RAX,TEXT_ROWS41 JGE @@0542 JMP @@1543 44@@05: XOR RAX,RAX //return FALSE45 POP RBP46 RET1 4047 48//Border allowed49@@10: MOV RDX,-1 //Check X50 CMP RBX,RDX51 JL @@0552 ADD RBX,U64 CTask.win_left[RCX]53 MOV RDX,U64 CTask.win_right[RCX]54 INC RDX55 CMP RBX,RDX56 JG @@0557 TEST RBX,RBX58 JS @@0559 CMP RBX,TEXT_COLS60 JGE @@0561 MOV RDX,-1 //Check Y62 CMP RAX,RDX63 JL @@0564 ADD RAX,U64 CTask.win_top[RCX]65 MOV RDX,U64 CTask.win_bottom[RCX]66 INC RDX67 CMP RAX,RDX68 JG @@0569 TEST RAX,RAX70 JS @@0571 CMP RAX,TEXT_ROWS72 JGE @@0573 74@@15: IMUL2 RAX,TEXT_COLS75 ADD RBX,RAX76 SHL RBX,277 ADD RBX,U64 [&gr.text_base]78 MOV RAX,U64 SF_ARG5[RBP]79 MOV U32 [RBX],EAX80 81 MOV RAX,TRUE82 POP RBP83 RET1 4084//************************************85_TEXT_LEN_STR::86//Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s)87//Must be called 30fps in Fs->draw_it() callback.88 PUSH RBP89 MOV RBP,RSP90 PUSH RSI91 PUSH RDI92 MOV RBX,U64 SF_ARG1[RBP]93 MOV RSI,U64 SF_ARG6[RBP]94 MOV RDI,U64 CTask.scroll_x[RBX]95 SAR RDI,396 ADD RDI,U64 SF_ARG2[RBP]97 MOV RCX,U64 SF_ARG4[RBP]98 99 TEST RDI,RDI100 JNS @@05101 ADD RCX,RDI102 SUB RSI,RDI103 XOR RDI,RDI104@@05: ADD RDI,U64 CTask.win_left[RBX]105 MOV RDX,RCX106 ADD RDX,RDI107 DEC RDX108 CMP RDX,U64 CTask.win_right[RBX]109 JLE @@10110 MOV RAX,RDX111 SUB RAX,U64 CTask.win_right[RBX]112 SUB RDX,RAX113 SUB RCX,RAX114@@10: TEST RDI,RDI115 JNS @@15116 ADD RCX,RDI117 SUB RSI,RDI118 XOR RDI,RDI119@@15: INC RDX120 SUB RDX,TEXT_COLS121 JLE @@20122 SUB RCX,RDX123@@20: CMP RCX,1124 JL @@30125 126 MOV RAX,U64 CTask.scroll_y[RBX]127 SAR RAX,3128 ADD RAX,U64 SF_ARG3[RBP]129 TEST RAX,RAX130 JS @@30131 ADD RAX,U64 CTask.win_top[RBX]132 CMP RAX,U64 CTask.win_bottom[RBX]133 JG @@30134 TEST RAX,RAX135 JS @@30136 CMP RAX,TEXT_ROWS137 JGE @@30138 139 IMUL2 RAX,TEXT_COLS140 ADD RDI,RAX141 SHL RDI,2142 ADD RDI,U64 [&gr.text_base]143 MOV RAX,U64 SF_ARG5[RBP]144@@25: LODSB145 STOSD146 DEC RCX147 JNZ @@25148 149 POP RDI150 POP RSI151 MOV RAX,TRUE152 POP RBP153 RET1 48154 155@@30: POP RDI156 POP RSI157 XOR RAX,RAX158 POP RBP159 RET1 48160//************************************161_TEXT_LEN_ATTR_STR::162//Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr)163//Must be called 30fps in Fs->draw_it() callback.164 PUSH RBP165 MOV RBP,RSP166 PUSH RSI167 PUSH RDI168 MOV RBX,U64 SF_ARG1[RBP]169 MOV RSI,U64 SF_ARG5[RBP]170 MOV RDI,U64 CTask.scroll_x[RBX]171 SAR RDI,3172 ADD RDI,U64 SF_ARG2[RBP]173 MOV RCX,U64 SF_ARG4[RBP]174 175 TEST RDI,RDI176 JNS @@05177 ADD RCX,RDI178 SHL RDI,2179 SUB RSI,RDI180 XOR RDI,RDI181@@05: ADD RDI,U64 CTask.win_left[RBX]182 MOV RDX,RCX183 ADD RDX,RDI184 DEC RDX185 CMP RDX,U64 CTask.win_right[RBX]186 JLE @@10187 MOV RAX,RDX188 SUB RAX,U64 CTask.win_right[RBX]189 SUB RDX,RAX190 SUB RCX,RAX191@@10: TEST RDI,RDI192 JNS @@15193 ADD RCX,RDI194 SHL RDI,2195 SUB RSI,RDI196 XOR RDI,RDI197@@15: INC RDX198 SUB RDX,TEXT_COLS199 JLE @@20200 SUB RCX,RDX201@@20: CMP RCX,1202 JL @@30203 204 MOV RAX,U64 CTask.scroll_y[RBX]205 SAR RAX,3206 ADD RAX,U64 SF_ARG3[RBP]207 TEST RAX,RAX208 JS @@30209 ADD RAX,U64 CTask.win_top[RBX]210 CMP RAX,U64 CTask.win_bottom[RBX]211 JG @@30212 TEST RAX,RAX213 JS @@30214 CMP RAX,TEXT_ROWS215 JGE @@30216 217 IMUL2 RAX,TEXT_COLS218 ADD RDI,RAX219 SHL RDI,2220 ADD RDI,U64 [&gr.text_base]221@@25: MOVSD222 DEC RCX223 JNZ @@25224 225 POP RDI226 POP RSI227 MOV RAX,TRUE228 POP RBP229 RET1 40230 231@@30: POP RDI232 POP RSI233 XOR RAX,RAX234 POP RBP235 RET1 40236//************************************237_TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr)238//Must be called 30fps in Fs->draw_it() callback.239 PUSH RBP240 MOV RBP,RSP241 PUSH RSI242 PUSH RDI243 MOV RBX,U64 SF_ARG1[RBP]244 MOV RDI,U64 CTask.scroll_x[RBX]245 SAR RDI,3246 ADD RDI,U64 SF_ARG2[RBP]247 MOV RCX,U64 SF_ARG4[RBP]248 249 TEST RDI,RDI250 JNS @@05251 ADD RCX,RDI252 XOR RDI,RDI253@@05: ADD RDI,U64 CTask.win_left[RBX]254 MOV RDX,RCX255 ADD RDX,RDI256 DEC RDX257 CMP RDX,U64 CTask.win_right[RBX]258 JLE @@10259 MOV RAX,RDX260 SUB RAX,U64 CTask.win_right[RBX]261 SUB RDX,RAX262 SUB RCX,RAX263@@10: TEST RDI,RDI264 JNS @@15265 ADD RCX,RDI266 XOR RDI,RDI267@@15: INC RDX268 SUB RDX,TEXT_COLS269 JLE @@20270 SUB RCX,RDX271@@20: CMP RCX,1272 JL @@35273 274 MOV RAX,U64 CTask.scroll_y[RBX]275 SAR RAX,3276 ADD RAX,U64 SF_ARG3[RBP]277 TEST RAX,RAX278 JS @@35279 ADD RAX,U64 CTask.win_top[RBX]280 CMP RAX,U64 CTask.win_bottom[RBX]281 JG @@35282 TEST RAX,RAX283 JS @@35284 CMP RAX,TEXT_ROWS285 JGE @@35286 287 IMUL2 RAX,TEXT_COLS288 ADD RDI,RAX289 SHL RDI,2290 ADD RDI,U64 [&gr.text_base]291 MOV RBX,U64 SF_ARG5[RBP]292 MOV RSI,RDI293@@25: LODSD294 TEST AL,AL295 JNZ @@30296 MOV RAX,RBX297 STOSD298 DEC RCX299 JNZ @@25300 301@@30: POP RDI302 POP RSI303 MOV RAX,TRUE304 POP RBP305 RET1 40306 307@@35: POP RDI308 POP RSI309 XOR RAX,RAX310 POP RBP311 RET1 40312}313public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,314I64 x,I64 y,I64 d); //Plot char. 30fps in Fs->draw_it() callback.315public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,316I64 attr,U8 *s); //Plot str with len. 30fps in Fs->draw_it() callback.317public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,318I64 len,U32 *_attr); //Plot attr str with len. 30fps in Fs->draw_it() callback.319public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,320I64 attr); //Plot attrs with len. 30fps in Fs->draw_it() callback.321 322public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...)323{//Plot chars. 30fps in Fs->draw_it() callback.324//You probably want GrPrint() or just Print().325 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);326 TextLenStr(task,x,y,StrLen(buf),attr<<8,buf);327 Free(buf);328}329 330public U0 TextBorder(CTask *task=NULL,331 I64 l,I64 r,I64 t,I64 b,I64 attr,Bool solid)332{//Plot border square. 30fps in Fs->draw_it() callback.333//Draws window borders or DolDoc text bttn borders.334 //Set task=sys_winmgr_task for no clipping.335 I64 i;336 if (!task) task=Fs;337 attr<<=8;338 TextChar(task,,l-1,t-1,text.border_chars[6+solid]+attr);339 TextChar(task,,r+1,t-1,text.border_chars[8+solid]+attr);340 TextChar(task,,l-1,b+1,text.border_chars[10+solid]+attr);341 TextChar(task,,r+1,b+1,text.border_chars[12+solid]+attr);342 for (i=l;i<=r;i++) {343 TextChar(task,,i,t-1,text.border_chars[2+solid]+attr);344 TextChar(task,,i,b+1,text.border_chars[2+solid]+attr);345 }346 for (i=t;i<=b;i++) {347 TextChar(task,,l-1,i,text.border_chars[4+solid]+attr);348 TextChar(task,,r+1,i,text.border_chars[4+solid]+attr);349 }350}351 352public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d)353{//Fill text rect. 30fps in Fs->draw_it() callback.354 I64 y,w;355 if (l>r || t>b) return;356 if (t<0) t=0;357 if (b>=TEXT_ROWS) b=TEXT_ROWS-1;358 if (l<0) l=0;359 if (r>=TEXT_COLS) r=TEXT_COLS-1;360 if (w=r-l+1)361 for (y=t;y<=b;y++)362 MemSetU32(gr.text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),d,w);363}364 365 