mirror of
https://github.com/minexew/Shrine.git
synced 2026-05-26 05:48:36 +00:00
240 lines
5.6 KiB
HolyC
240 lines
5.6 KiB
HolyC
#help_index "Misc/TOS"
|
|
|
|
#define VIDEO_FRAME_RATE 29.97
|
|
|
|
#define FG_JUST_AUDIO 0
|
|
#define FG_BOOT_DRV 1
|
|
#define FG_RAM_DRV 2
|
|
I64 fg_mode=FG_RAM_DRV;
|
|
Bool fg_on =FALSE;
|
|
|
|
U0 FrameGrabberTask(I64)
|
|
{//#!/bin/bash
|
|
//for f in ./ScrnShots/*.Z; do ./Bin/TOSZ $$f; done
|
|
//ffmpeg -r 8 -i VID%05d.BMP -y Movie.avi
|
|
I64 frame_num=0;
|
|
U8 buf[STR_LEN],buf2[STR_LEN],*st_dir;
|
|
F64 end_time=tS;
|
|
Silent; //no output to scrn
|
|
if (fg_mode==FG_RAM_DRV)
|
|
st_dir="B:/Tmp/ScrnShots";
|
|
else
|
|
st_dir="::/Tmp/ScrnShots";
|
|
DirMk(st_dir);
|
|
while (fg_on) {
|
|
StrPrint(buf,"%s/VID%05d.BMP.Z",st_dir,frame_num++);
|
|
StrCpy(buf2,buf);
|
|
BMPScrnCapture(buf);
|
|
while (TRUE) {
|
|
end_time+=1.0/VIDEO_FRAME_RATE;
|
|
if (end_time<tS) {
|
|
StrPrint(buf,"%s/VID%05d.BMP.Z",st_dir,frame_num++);
|
|
Copy(buf2,buf);
|
|
} else
|
|
break;
|
|
}
|
|
SleepUntil(cnts.jiffies+(end_time-tS)*JIFFY_FREQ);
|
|
}
|
|
}
|
|
|
|
I64 CopyVideo()
|
|
{
|
|
I64 res=0;
|
|
Del("D:/Tmp/*.SND");
|
|
if (fg_mode==FG_JUST_AUDIO)
|
|
SndFileCreate("D:/Tmp/Audio",0.115,0.0,WF_SQUARE,0.45,0.35,2.5);
|
|
else {
|
|
SndFileCreate("D:/Tmp/Audio",0.115,0.0,WF_SQUARE,0.45,0.35);
|
|
DelTree("D:/Tmp/ScrnShots");
|
|
if (fg_mode==FG_RAM_DRV) {
|
|
res=CopyTree("B:/Tmp/ScrnShots","D:/Tmp/ScrnShots");
|
|
"Unused Space: %12.6fMeg\n",DrvUnused('B')/1024.0/1024.0;
|
|
} else
|
|
res=CopyTree("::/Tmp/ScrnShots","D:/Tmp/ScrnShots");
|
|
"$$BK,1$$Files Copied:%d$$BK,0$$ Time:%8.3fm\n",
|
|
res,res/60.0/VIDEO_FRAME_RATE;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public U0 FrameGrabberToggle()
|
|
{//The frame grabber saves BMP files to D:/Tmp/ScrnShots.
|
|
static F64 last_time=0;
|
|
if (tS-last_time>3.0) {
|
|
last_time=tS;
|
|
if (fg_on) {
|
|
fg_on=FALSE;
|
|
Snd;
|
|
wall->record=snd.record=FALSE;
|
|
Sleep(1000);
|
|
User("CopyVideo;Exit;\n");
|
|
} else {
|
|
fg_on=TRUE;
|
|
if (fg_mode!=FG_JUST_AUDIO)
|
|
Spawn(&FrameGrabberTask,NULL,"Frame Grabber");
|
|
wall->record=snd.record=TRUE;
|
|
Snd;
|
|
}
|
|
}
|
|
}
|
|
|
|
public U0 JukeSong(I64 num)
|
|
{//Make movie of one song.
|
|
if (!fg_on)
|
|
FrameGrabberToggle;
|
|
JukeSongsPuppet("~/Sup1/Sup1Hymns",,num,num+1);
|
|
if (fg_on)
|
|
FrameGrabberToggle;
|
|
}
|
|
|
|
public U0 JukeLines(I64 start_line,I64 end_line)
|
|
{//Make movie of many lines of songs.
|
|
if (!fg_on)
|
|
FrameGrabberToggle;
|
|
JukeSongsPuppet("~/Sup1/Sup1Hymns",,start_line*5,end_line*5);
|
|
if (fg_on)
|
|
FrameGrabberToggle;
|
|
}
|
|
|
|
public U0 DskChkAll()
|
|
{//DskChk on C & D.
|
|
U8 *ptr=TOS_HDS;
|
|
while (*ptr)
|
|
DskChk(*ptr++);
|
|
}
|
|
|
|
public CDoc *DC2Doc(CDC *dc,I64 dx=0,I64 dy=0,I64 *_total_score=NULL)
|
|
{//Use OCR to make a text DolDoc from CDC.
|
|
U8 byte_bit_cnts[256];
|
|
I64 i,j,*ptr,row,col,ch,best_ch,score,best_score,
|
|
cur_char_image,diff_image,total_score=0;
|
|
CDoc *doc=DocNew;
|
|
|
|
MemSet(byte_bit_cnts,0,sizeof(byte_bit_cnts));
|
|
for (i=0;i<256;i++)
|
|
for (j=0;j<7;j++)
|
|
if (Bt(&i,j))
|
|
byte_bit_cnts[i]++;
|
|
|
|
for (row=0;row<dc->height/FONT_HEIGHT;row++) {
|
|
for (col=0;col<dc->width/FONT_WIDTH;col++) {
|
|
|
|
cur_char_image=0;
|
|
for (i=0;i<FONT_HEIGHT;i++)
|
|
for (j=0;j<FONT_WIDTH;j++)
|
|
if (GrPeek(dc,col*FONT_WIDTH+j+dx,row*FONT_HEIGHT+i+dy)!=WHITE)
|
|
LBts(&cur_char_image,i*8+j);
|
|
|
|
best_score=I64_MAX;
|
|
best_ch=0;
|
|
ptr=&text.font[32];
|
|
for (ch=32;ch<127;ch++) {
|
|
diff_image=*ptr++ ^ cur_char_image;
|
|
score=0;
|
|
for (i=0;i<8;i++)
|
|
score+=byte_bit_cnts[diff_image.u8[i]];
|
|
if (score<best_score) {
|
|
best_score=score;
|
|
best_ch=ch;
|
|
}
|
|
}
|
|
if (best_ch=='$$')
|
|
DocPrint(doc,"$$$$");
|
|
else
|
|
DocPrint(doc,"%c",best_ch);
|
|
total_score+=best_score;
|
|
}
|
|
DocPrint(doc,"\n");
|
|
}
|
|
if (_total_score) *_total_score=total_score;
|
|
return doc;
|
|
}
|
|
|
|
public U0 BMP2Doc(U8 *_in_name,U8 *_out_name=NULL)
|
|
{//Use OCR to make a text DolDoc from BMP file.
|
|
U8 *in_name,*out_name;
|
|
I64 dx,dy,score,best_score=I64_MAX;
|
|
CDC *dc;
|
|
CDoc *doc;
|
|
in_name=ExtDft(_in_name,"BMP");
|
|
if (_out_name)
|
|
out_name=ExtDft(_out_name,"DD.Z");
|
|
else
|
|
out_name=ExtChg(_in_name,"DD.Z");
|
|
if (dc=BMPRead(in_name)) {
|
|
for (dy=-3;dy<=4;dy++)
|
|
for (dx=-3;dx<=4;dx++) {
|
|
doc=DC2Doc(dc,dx,dy,&score);
|
|
if (score<best_score) {
|
|
best_score=score;
|
|
StrCpy(&doc->filename.name,out_name);
|
|
DocWrite(doc);
|
|
}
|
|
DocDel(doc);
|
|
}
|
|
}
|
|
Free(in_name);
|
|
Free(out_name);
|
|
}
|
|
|
|
U0 TOSTheme()
|
|
{
|
|
if (!fg_on)
|
|
PopUp("Sleep(50);FrameGrabberToggle;");
|
|
ExeFile("~/Sup1/Sup1Graphics/TOS/TOSTheme.HC");
|
|
DocClear;
|
|
}
|
|
|
|
#define MEM_TEST_SIZE 1024*1024
|
|
U0 MemTest()
|
|
{
|
|
U8 *b;
|
|
while (sys_data_bp->alloced_u8s-sys_data_bp->used_u8s>0x1000000) {
|
|
b=MAlloc(MEM_TEST_SIZE,Fs->data_heap);
|
|
MemSet(b,0x88,MSize(b));
|
|
"Data:%X\n",sys_data_bp->alloced_u8s-sys_data_bp->used_u8s;
|
|
Yield;
|
|
}
|
|
while (sys_code_bp->alloced_u8s-sys_code_bp->used_u8s>0x1000000) {
|
|
b=MAlloc(MEM_TEST_SIZE,Fs->code_heap);
|
|
MemSet(b,0x88,MSize(b));
|
|
"Code:%X\n",sys_code_bp->alloced_u8s-sys_code_bp->used_u8s;
|
|
Yield;
|
|
}
|
|
}
|
|
|
|
public I64 Profanity(
|
|
U8 *needle_filename="~/Sup1/Sup1Blog/Profanity.DD.Z",
|
|
U8 *files_find_mask="/*",U8 *fu_flags=NULL)
|
|
{//Scan for profanity.
|
|
CCmpCtrl *cc;
|
|
I64 res=0;
|
|
if (FileFind(needle_filename)) {
|
|
cc=CmpCtrlNew(MStrPrint("#include \"%s\"",needle_filename));
|
|
while (Lex(cc))
|
|
if (cc->token==TK_IDENT)
|
|
res+=Find(cc->cur_str,files_find_mask,fu_flags);
|
|
CmpCtrlDel(cc);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
U0 TOSChgLog2()
|
|
{
|
|
InStr("\"Ed(\\\"::/Doc/ChgLog.DD.Z\\\");\n\";
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_UP|SCF_CTRL);
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN);
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN);
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN);
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN);
|
|
Msg(MSG_KEY_DOWN_UP,CH_CTRLY,0);
|
|
Msg(MSG_KEY_DOWN_UP,0,SC_F6|SCF_ALT);
|
|
Msg(MSG_KEY_DOWN_UP,CH_ESC,0);"
|
|
"\"Exit;\n\";");
|
|
}
|
|
|
|
public U0 TOSChgLog()
|
|
{//Opdate ChgLog file.
|
|
User("TOSChgLog2;\n");
|
|
}
|