TempleOSTS_130707.ISO
This commit is contained in:
1 parent
17b71f1a2d
commit
1343005a29
617 files changed
+14399
-25130
No files matched your search
@@ -4,7 +4,7 @@
|
||||
|
||||
//Use Dbg("Type 'G;'"); to debug before window mgr is running.
|
||||
|
||||
public F64 os_version=1.00;
|
||||
public F64 os_version=1.04;
|
||||
|
||||
#include "AdamExt.HPP"
|
||||
|
||||
@@ -42,7 +42,6 @@ Cd("::/TempleOS/Adam/WordStat");;
|
||||
#include "WordStat"
|
||||
|
||||
Cd("::/TempleOS/Adam");;
|
||||
#include "Profiler"
|
||||
#include "Hash2a"
|
||||
#include "TaskSettings"
|
||||
#include "DevInfo"
|
||||
|
||||
@@ -21,8 +21,8 @@ extern Bool PopUpNoYes(U8 *header=NULL,U8 *footer=NULL);
|
||||
extern I64 PopUpMenu(CDoc *doc,I64 doc_flags=0);
|
||||
extern I64 PopUpRangeI64(I64 lo,I64 hi,I64 step=1,U8 *header=NULL,U8 *footer=NULL);
|
||||
extern I64 PopUpColor(U8 *header=NULL,Bool allow_transpant=TRUE,Bool allow_dft=TRUE);
|
||||
extern I64 PopUpLightingColor(U8 *header=NULL);
|
||||
extern I64 PopUpDitherColor(U8 *header=NULL);
|
||||
extern I64 PopUpColorLighting(U8 *header=NULL);
|
||||
extern I64 PopUpColorDither(U8 *header=NULL);
|
||||
extern U8 *PopUpMGetS(U8 *header=NULL);
|
||||
extern Bool PopUpTransform(I64 *r);
|
||||
extern U0 PopUpSnap(CSnap *g);
|
||||
@@ -36,6 +36,8 @@ extern U8 *EdSprite(I64 bin_num);
|
||||
extern Bool View();
|
||||
extern Bool DocLock(CDoc *doc);
|
||||
extern Bool DocUnlock(CDoc *doc);
|
||||
extern U0 DocBinDel(CDoc *doc,CDocBin *b);
|
||||
extern U0 DocNewLine(CDoc *doc=NULL,I64 cnt=1);
|
||||
extern U0 DocIns(CDoc *doc,CDocEntry *doc_e);
|
||||
extern U0 DocDataFmt(CDocEntry *doc_e);
|
||||
extern U0 DocLineNumGoTo(CDoc *doc,I64 linenum); //one based
|
||||
@@ -45,16 +47,15 @@ extern U0 DocInsDoc(CDoc *doc,CDoc *doc2);
|
||||
extern U0 DocD(U8 *buf,I64 cnt=0x80);
|
||||
extern Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL);
|
||||
extern Bool DocFormDo(U8 *D,U8 *class_name,I64 doc_flags=0,U8 *header=NULL,U8 *footer=NULL);
|
||||
extern CDoc *DocCur(CTask *task=NULL);
|
||||
extern CDoc *DocPut(CTask *task=NULL);
|
||||
extern CDoc *DocDisplay(CTask *task=NULL);
|
||||
extern U0 DocClear(CDoc *doc=NULL);
|
||||
extern Bool DocCursor(Bool show=OFF,CDoc *doc=NULL);
|
||||
extern U0 DocBottom(CDoc *doc=NULL);
|
||||
extern U0 DocBinsValidate(CDoc *doc);
|
||||
extern U0 DocQueRem(CDoc *doc);
|
||||
extern U0 DocHome(CDoc *doc=NULL);
|
||||
extern U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC_ALL);
|
||||
extern U0 DocRst(CDoc *doc,Bool is_old);
|
||||
extern U0 DocQueIns(CDoc *doc,CDoc *pred);
|
||||
extern U0 DocUpdateTaskDocs(CTask *task);
|
||||
extern I64 PmtI64(U8 *msg,I64 dft,I64 lo=MIN_I64,I64 hi=MAX_I64);
|
||||
extern F64 PmtF64(U8 *msg,F64 dft,F64 lo=MIN_F64,F64 hi=MAX_F64);
|
||||
@@ -62,13 +63,13 @@ extern U0 ClassRep(U8 *class_name,U8 *d,I64 max_depth=2,Bool fun=FALSE,I64 offse
|
||||
extern U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL);
|
||||
extern Bool Ed(U8 *link_st,I64 ed_flags=0);
|
||||
extern Bool Plain(U8 *filename);
|
||||
extern U0 DocPutBMPFile(CDoc *doc=NULL,U8 *fname,Bool use_ms_paint_palette=FALSE);
|
||||
extern U0 DocPutBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE);
|
||||
|
||||
extern U0 WSFillIn(I64 n);
|
||||
extern U0 WSMan(I64 n,CTask *parent=NULL);
|
||||
extern U0 WSDFillin(I64 n);
|
||||
extern U0 WSDDef(I64 n,CTask *parent=NULL);
|
||||
extern Bool WordStat(Bool val=ON);
|
||||
extern Bool WordStat(Bool val=OFF);
|
||||
extern U0 WSDDisplayDefs(CDoc *doc,U8 *st,I64 num=-1);
|
||||
extern U0 WSFindMisspelled(CDoc *doc);
|
||||
|
||||
@@ -88,7 +89,7 @@ extern F64 win_desired_refresh,win_actual_refresh;
|
||||
extern Bool WinBorder(Bool val,CTask *task=NULL);
|
||||
extern U0 WinMgrSync(I64 cnt=1,Bool force=FALSE);
|
||||
extern U0 WinMax(CTask *task=NULL);
|
||||
extern Bool SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE);
|
||||
extern CDoc *SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE);
|
||||
extern F64 refresh_ode_time,last_refresh_ode_time;
|
||||
|
||||
extern CMenuEntry *MenuEntryFind(CMenu *m,U8 *full_name);
|
||||
@@ -96,7 +97,7 @@ extern CMenu *MenuPush(U8 *st);
|
||||
extern U0 MenuPop();
|
||||
extern CMenu *MenuFilePush(U8 *filename);
|
||||
|
||||
extern CTask *Noise(I64 mS,I64 min_freq,I64 max_freq,I64 waveform=WF_NOISE);
|
||||
extern CTask *Noise(I64 mS,I64 min_freq,I64 max_freq);
|
||||
|
||||
extern CCtrl *CtrlFindUnique(CTask *task,I64 type);
|
||||
extern Bool CtrlInside(CCtrl *c,I64 x,I64 y);
|
||||
@@ -107,3 +108,5 @@ extern U0 ViewAnglesDel(CTask *task=NULL);
|
||||
#define FM_PICK_FILE 1
|
||||
#define FM_PICK_DIR 2
|
||||
extern I64 GrepWiz();
|
||||
extern I64 CDFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL,
|
||||
U8 *_stage2_filename=NULL);
|
||||
@@ -105,10 +105,11 @@ public U0 AFUntilChar(I64 ch1,I64 ch2=0)
|
||||
|
||||
I64 af_l,af_r,af_c;
|
||||
|
||||
U0 AFSetIPPlot(I64 mS,I64 x,I64 y,I64 z)
|
||||
Bool AFSetIPPlot(I64 mS,I64 x,I64 y,I64 z)
|
||||
{
|
||||
SetIP(x,y,z,af_l,af_r,af_c);
|
||||
Sleep(mS);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public U0 AFSetIP(I64 mS=7,I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64,I64 c=MAX_I64)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
asm {
|
||||
#define MODULE_SIZE CD_BOOT_LOADER_SIZE
|
||||
#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4)
|
||||
#define CD_BOOT_LOADER_SIZE CD_BLK_SIZE*1 //Max CD_BLK_SIZE*4, I think
|
||||
#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE))>>4)
|
||||
#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT
|
||||
USE16
|
||||
BCD_START::
|
||||
//DL is supposed to have the BIOS drive number
|
||||
@@ -10,7 +11,7 @@ BCD_START::
|
||||
|
||||
CLI
|
||||
MOV SS,AX
|
||||
MOV SP,BOOT_STK_SIZE+MODULE_SIZE
|
||||
MOV SP,BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE
|
||||
STI
|
||||
|
||||
CALL BCD_GET_IP
|
||||
@@ -22,7 +23,7 @@ BCD_GET_IP:
|
||||
MOV AX,CS
|
||||
ADD AX,BX
|
||||
MOV DS,AX
|
||||
MOV CX,MODULE_SIZE
|
||||
MOV CX,CD_BOOT_LOADER_SIZE
|
||||
XOR SI,SI
|
||||
XOR DI,DI
|
||||
REP_MOVSB
|
||||
@@ -47,7 +48,7 @@ BCD_TEMPLEOS_MSG:
|
||||
BCD_NOT64_MSG:
|
||||
DU8 "TempleOS requires a 64-bit capable processor.\n\r",0;
|
||||
|
||||
//These get patched by $LK,"CDBootFileCreate","MN:CDBootFileCreate"$
|
||||
//These get patched.
|
||||
BCD_BLK_LO:: DU16 0;
|
||||
BCD_BLK_HI:: DU16 0;
|
||||
BCD_BLK_CNT:: DU16 0;
|
||||
@@ -144,7 +145,7 @@ BCD_MAIN::
|
||||
LOOP @@20
|
||||
|
||||
//See $LK,"BootCdProbe","MN:BootCdProbe"$().
|
||||
MOV EBX,U32 [BCD_BLK_LO-BCD_START]
|
||||
MOV EBX,U32 [BCD_BLK_LO-BCD_START] //TODO: oops overflow?
|
||||
SHL EBX,16
|
||||
MOV BX,BOOT_CODE_CDROM //$MA+A-X+PU,"See sys_boot_code","Grep(\"sys_boot_code\",\"/TempleOS/\"FILENAME_MASK_TXT);View;\n"$
|
||||
|
||||
@@ -153,5 +154,5 @@ BCD_MAIN::
|
||||
DU16 0,BOOT_RAM_BASE/16;
|
||||
//Continues here $LK,"::/TempleOS/Kernel/KStart.CPP","FL:::/TempleOS/Kernel/KStart.CPP,1"$
|
||||
BCD_END::
|
||||
#assert BCD_END-BCD_START<MODULE_SIZE
|
||||
#assert BCD_END-BCD_START<CD_BOOT_LOADER_SIZE
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
asm {
|
||||
#define MODULE_SIZE 1*BLK_SIZE
|
||||
#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4)
|
||||
#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT
|
||||
|
||||
USE16
|
||||
BHD_START::
|
||||
DU8 0x5A DUP(0); //See $LK,"CFAT32Boot","MN:CFAT32Boot"$.code[]
|
||||
BHD_CODE::
|
||||
|
||||
#define BHD_START (BHD_CODE-offset(CFAT32Boot.code))
|
||||
|
||||
CLD
|
||||
|
||||
MOV AX,VGA_TEXT_MEM_BASE/16
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
asm {
|
||||
#define MODULE_SIZE 1*BLK_SIZE
|
||||
#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4)
|
||||
#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT
|
||||
USE16
|
||||
BMHD_START::
|
||||
BMHD_CODE::
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
asm {
|
||||
#define MODULE_SIZE 2*BLK_SIZE
|
||||
#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4)
|
||||
#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT
|
||||
USE16
|
||||
BMHD2_START::
|
||||
MOV U32 FS:[0],'B'+0x2000+('2'+0x2000)<<16
|
||||
|
||||
@@ -22,7 +22,8 @@ class CCCDUserData //Create CD
|
||||
I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
CISO1DirEntry *tempi,CISO1DirEntry *tempi2,
|
||||
I64 *_cur_blk,
|
||||
CDirEntry *parent,Bool write)
|
||||
CDirEntry *parent,Bool write,
|
||||
U8 *stage2_filename,I64 *_stage2_blk)
|
||||
{
|
||||
CCCDUserData *tempc;
|
||||
CDirEntry *tempm1,*tempm2;
|
||||
@@ -39,7 +40,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
de->len=sizeof(CISO1DirEntry)-1;
|
||||
de->ext_attr_len=0;
|
||||
FillU16Palindrome(&de->vol_seq_num,1);
|
||||
CDate2ISO1(&de->date,tempm->datetime);
|
||||
Date2ISO1(&de->date,tempm->datetime);
|
||||
de->flags=ISO1_ATTR_DIR;
|
||||
de->name_len=1;
|
||||
de->name=0;
|
||||
@@ -51,7 +52,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
FillU32Palindrome(&de->loc,tempc->loc);
|
||||
FillU32Palindrome(&de->size,tempc->short_dir_blks*CD_BLK_SIZE);
|
||||
FillU16Palindrome(&de->vol_seq_num,1);
|
||||
CDate2ISO1(&de->date,parent->datetime);
|
||||
Date2ISO1(&de->date,parent->datetime);
|
||||
de->flags=ISO1_ATTR_DIR;
|
||||
de->name_len=1;
|
||||
de->name=1;
|
||||
@@ -61,7 +62,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
de2->len=sizeof(CISO1DirEntry)-1;
|
||||
de2->ext_attr_len=0;
|
||||
FillU16Palindrome(&de2->vol_seq_num,1);
|
||||
CDate2ISO1(&de2->date,tempm->datetime);
|
||||
Date2ISO1(&de2->date,tempm->datetime);
|
||||
de2->flags=ISO1_ATTR_DIR;
|
||||
de2->name_len=1;
|
||||
de2->name=0;
|
||||
@@ -73,7 +74,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
FillU32Palindrome(&de2->loc,tempc->loc+tempc->short_dir_blks);
|
||||
FillU32Palindrome(&de2->size,tempc->long_dir_blks*CD_BLK_SIZE);
|
||||
FillU16Palindrome(&de2->vol_seq_num,1);
|
||||
CDate2ISO1(&de2->date,parent->datetime);
|
||||
Date2ISO1(&de2->date,parent->datetime);
|
||||
de2->flags=ISO1_ATTR_DIR;
|
||||
de2->name_len=1;
|
||||
de2->name=1;
|
||||
@@ -87,7 +88,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
de1=de;
|
||||
de12=de2;
|
||||
if (tempm1->attr & _ATTR_DIR) {
|
||||
n=CDFileCreate2(out_file,tempm1,de,de2,_cur_blk,tempm,write);
|
||||
n=CDFileCreate2(out_file,tempm1,de,de2,_cur_blk,tempm,write,stage2_filename,_stage2_blk);
|
||||
de(U8 *)+=sizeof(CISO1DirEntry)-1+n;
|
||||
de2(U8 *)+=sizeof(CISO1DirEntry)-1+n<<1;
|
||||
} else {
|
||||
@@ -96,11 +97,16 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
de->ext_attr_len=0;
|
||||
FillU32Palindrome(&de->loc,*_cur_blk);
|
||||
tempc->loc=*_cur_blk;
|
||||
if (write)
|
||||
if (write) {
|
||||
if (stage2_filename && !StrCmp(tempm1->full_name,stage2_filename)) {
|
||||
"$$FG,RED$$!!! Boot Stage 2 !!!$$FG$$\n";
|
||||
if (_stage2_blk) *_stage2_blk=*_cur_blk;
|
||||
}
|
||||
"%X:%s\n",*_cur_blk,tempm1->full_name;
|
||||
}
|
||||
FillU32Palindrome(&de->size,tempm1->size);
|
||||
FillU16Palindrome(&de->vol_seq_num,1);
|
||||
CDate2ISO1(&de->date,tempm1->datetime);
|
||||
Date2ISO1(&de->date,tempm1->datetime);
|
||||
de->flags=0;
|
||||
de->name_len=StrLen(tempm1->name);
|
||||
StrCpy(&de->name,tempm1->name);
|
||||
@@ -112,7 +118,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
FillU32Palindrome(&de2->loc,*_cur_blk);
|
||||
FillU32Palindrome(&de2->size,tempm1->size);
|
||||
FillU16Palindrome(&de2->vol_seq_num,1);
|
||||
CDate2ISO1(&de2->date,tempm1->datetime);
|
||||
Date2ISO1(&de2->date,tempm1->datetime);
|
||||
de2->flags=0;
|
||||
de2->name_len=StrLen(tempm1->name)<<1;
|
||||
ptr1=&de2->name;
|
||||
@@ -183,7 +189,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
FillU32Palindrome(&dir_blk_buf->size,n*CD_BLK_SIZE);
|
||||
FillU32Palindrome(&dir_blk_buf->loc,*_cur_blk);
|
||||
FillU16Palindrome(&tempi->vol_seq_num,1);
|
||||
CDate2ISO1(&tempi->date,tempm->datetime);
|
||||
Date2ISO1(&tempi->date,tempm->datetime);
|
||||
if (write)
|
||||
"%X:%s\n",*_cur_blk,tempm->full_name;
|
||||
if (write)
|
||||
@@ -214,7 +220,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm,
|
||||
FillU32Palindrome(&dir_blk_buf2->size,n*CD_BLK_SIZE);
|
||||
FillU32Palindrome(&dir_blk_buf2->loc,*_cur_blk);
|
||||
FillU16Palindrome(&tempi2->vol_seq_num,1);
|
||||
CDate2ISO1(&tempi2->date,tempm->datetime);
|
||||
Date2ISO1(&tempi2->date,tempm->datetime);
|
||||
if (write)
|
||||
"%X:%s\n",*_cur_blk,tempm->full_name;
|
||||
if (write)
|
||||
@@ -250,8 +256,7 @@ U0 CDFillPathTable(CDirEntry *tempm,
|
||||
{
|
||||
U8 *ptr1,*ptr2;
|
||||
I64 i;
|
||||
CISO1PathEntry *tabbuf =*_itabbuf,
|
||||
*tabbuf2=*_itabbuf2;
|
||||
CISO1PathEntry *tabbuf=*_itabbuf,*tabbuf2=*_itabbuf2;
|
||||
CDirEntry *tempm1=tempm->sub,*tempm2;
|
||||
CCCDUserData *tempc;
|
||||
|
||||
@@ -270,8 +275,7 @@ U0 CDFillPathTable(CDirEntry *tempm,
|
||||
}
|
||||
StrCpy(&tabbuf->name,tempm1->name);
|
||||
|
||||
tabbuf(U8 *)+=sizeof(CISO1PathEntry)-2+
|
||||
(StrLen(tempm1->name)+1) & -0x2;
|
||||
tabbuf(U8 *)+=sizeof(CISO1PathEntry)-2+(StrLen(tempm1->name)+1) & -0x2;
|
||||
|
||||
tabbuf2->name_len=StrLen(tempm1->name)<<1;
|
||||
if (big_endian) {
|
||||
@@ -321,33 +325,28 @@ class CElTorito
|
||||
U8 zero2[20];
|
||||
};
|
||||
|
||||
public I64 CDFileCreate(U8 *filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL,
|
||||
U8 *bootfile=NULL,I64 emulation=0)
|
||||
//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP.Z"$
|
||||
public I64 CDFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL,
|
||||
U8 *_stage2_filename=NULL)
|
||||
//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP"$
|
||||
|
||||
//NULL filename uses sys_dft_iso_name.
|
||||
//See the above sample code
|
||||
//0=no emu 2=1.44meg 4=hard drive
|
||||
|
||||
//Use "C:/*" if you want all files on the C: drive.
|
||||
//Use "C:/Distro/*" if you want all files in the C:/Distro directory.
|
||||
//Default flags are "+r" recurse.
|
||||
|
||||
{
|
||||
CISO1PriDesc *iso =CAlloc(CD_BLK_SIZE),
|
||||
*iso1=CAlloc(CD_BLK_SIZE),
|
||||
*iso2=CAlloc(CD_BLK_SIZE),
|
||||
*iso3=CAlloc(CD_BLK_SIZE);
|
||||
CISO1PriDesc *iso_pri=CAlloc(CD_BLK_SIZE),
|
||||
*iso_boot=CAlloc(CD_BLK_SIZE),
|
||||
*iso_sup=CAlloc(CD_BLK_SIZE),
|
||||
*iso_term=CAlloc(CD_BLK_SIZE);
|
||||
CDirEntry *rootdir=CAlloc(sizeof(CDirEntry));
|
||||
I64 i,j,
|
||||
cur_blk=0,bootfile_cd_blks=0,tabsize,tabsize2,first_free,max_depth,
|
||||
I64 i,j,stage2_blk=(CD_FILE_OFFSET+1<<2+CD_BOOT_LOADER_SIZE/BLK_SIZE)>>2,stage2_size,
|
||||
cur_blk=0,tabsize,tabsize2,first_free,max_depth,
|
||||
fuf_flags=0;
|
||||
U32 *d;
|
||||
CElTorito *et=CAlloc(CD_BLK_SIZE);
|
||||
U8 *filename2,
|
||||
*zero_buf=CAlloc(CD_BLK_SIZE),
|
||||
*bootfile_buf=NULL;
|
||||
U8 *filename,*stage2_filename,
|
||||
*stage1_buf=CAlloc(CD_BOOT_LOADER_SIZE),
|
||||
*zero_buf=CAlloc(CD_BLK_SIZE);
|
||||
CISO1PathEntry *tabbuf=NULL,*tabbuf2=NULL,*itabbuf,*itabbuf2;
|
||||
Bool okay=TRUE;
|
||||
CFile *out_file=NULL;
|
||||
CISO1DirEntry *tempi;
|
||||
CCCDUserData *tempc;
|
||||
@@ -355,195 +354,182 @@ public I64 CDFileCreate(U8 *filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=N
|
||||
GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r");
|
||||
GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
|
||||
|
||||
if (!filename)
|
||||
filename=sys_dft_iso_name;
|
||||
filename2=DftExt(filename,"ISO");
|
||||
if (!_filename)
|
||||
_filename=sys_dft_iso_name;
|
||||
filename=DftExt(_filename,"ISO");
|
||||
|
||||
if (_stage2_filename)
|
||||
stage2_filename=FileNameAbs(_stage2_filename);
|
||||
else
|
||||
stage2_filename=NULL;
|
||||
|
||||
if (bootfile) {
|
||||
bootfile_buf=FileRead(bootfile,&bootfile_cd_blks);
|
||||
if (bootfile_cd_blks>CD_BLK_SIZE*4) {
|
||||
ST_ERR_ST "Boot files limited to 0x2000 bytes\n";
|
||||
goto done1;
|
||||
}
|
||||
bootfile_cd_blks=(bootfile_cd_blks+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
}
|
||||
rootdir->attr=_ATTR_DIR;
|
||||
rootdir->sub=FilesFind(src_files_find_mask,fuf_flags);
|
||||
rootdir->datetime=GetCurTimeCDate;
|
||||
rootdir->datetime=GetCurTimeDate;
|
||||
rootdir->user_data=CAlloc(sizeof(CCCDUserData));
|
||||
tempc=rootdir->user_data;
|
||||
tempc->path_entry_num=1;
|
||||
|
||||
if (okay) {
|
||||
cur_blk=CD_FILE_OFFSET>>2;
|
||||
if (bootfile_buf)
|
||||
//preboot and bootloader
|
||||
cur_blk+=1+bootfile_cd_blks;
|
||||
CDFileCreate2(out_file,rootdir,
|
||||
&iso->root_dir_record,
|
||||
&iso2->root_dir_record,
|
||||
&cur_blk,rootdir,FALSE);
|
||||
tabsize=sizeof(CISO1PathEntry);
|
||||
tabsize2=sizeof(CISO1PathEntry);
|
||||
max_depth=CDTableLen(rootdir,&tabsize,&tabsize2,1);
|
||||
FillU32Palindrome(&iso->path_table_size,tabsize);
|
||||
FillU32Palindrome(&iso2->path_table_size,tabsize2);
|
||||
tabsize=(tabsize+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
cur_blk+=tabsize<<1;
|
||||
tabsize2=(tabsize2+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
cur_blk+=tabsize2<<1;
|
||||
cur_blk=CD_FILE_OFFSET>>2;
|
||||
if (stage2_filename) //preboot and bootloader
|
||||
cur_blk+=1+CD_BOOT_LOADER_SIZE/CD_BLK_SIZE;
|
||||
CDFileCreate2(out_file,rootdir,
|
||||
&iso_pri->root_dir_record,
|
||||
&iso_sup->root_dir_record,
|
||||
&cur_blk,rootdir,FALSE,stage2_filename,&stage2_blk);
|
||||
tabsize=sizeof(CISO1PathEntry);
|
||||
tabsize2=sizeof(CISO1PathEntry);
|
||||
max_depth=CDTableLen(rootdir,&tabsize,&tabsize2,1);
|
||||
FillU32Palindrome(&iso_pri->path_table_size,tabsize);
|
||||
FillU32Palindrome(&iso_sup->path_table_size,tabsize2);
|
||||
tabsize=(tabsize+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
cur_blk+=tabsize<<1;
|
||||
tabsize2=(tabsize2+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
cur_blk+=tabsize2<<1;
|
||||
|
||||
if (FileAttr(filename) & _ATTR_CONTIGUOUS)
|
||||
out_file=FOpen(filename,"wc",cur_blk<<2);
|
||||
else
|
||||
out_file=FOpen(filename,"w",cur_blk<<2);
|
||||
cur_blk=0;
|
||||
if (!out_file)
|
||||
goto cf_done;
|
||||
|
||||
while (cur_blk<CD_FILE_OFFSET>>2)
|
||||
FWBlks(out_file,zero_buf,cur_blk++<<2,4);
|
||||
|
||||
iso_pri->type=ISO1T_PRI_VOL_DESC;
|
||||
StrCpy(iso_pri->id,"CD001");
|
||||
iso_pri->version=1;
|
||||
FillU16Palindrome(&iso_pri->vol_set_size,1);
|
||||
FillU16Palindrome(&iso_pri->vol_seq_num,1);
|
||||
FillU16Palindrome(&iso_pri->log_block_size,CD_BLK_SIZE);
|
||||
iso_pri->file_structure_version=1;
|
||||
|
||||
iso_sup->type=ISO1T_SUPPLEMENTARY_DESC;
|
||||
StrCpy(iso_sup->id,"CD001");
|
||||
iso_sup->version=1;
|
||||
FillU16Palindrome(&iso_sup->vol_set_size,1);
|
||||
FillU16Palindrome(&iso_sup->vol_seq_num,1);
|
||||
FillU16Palindrome(&iso_sup->log_block_size,CD_BLK_SIZE);
|
||||
iso_sup->file_structure_version=1;
|
||||
|
||||
iso_boot->type=ISO1T_BOOT_RECORD;
|
||||
StrCpy(iso_boot->id,"CD001");
|
||||
iso_boot->version=1;
|
||||
StrCpy(iso_boot(U8 *)+7,"EL TORITO SPECIFICATION");
|
||||
|
||||
cur_blk=CD_FILE_OFFSET>>2;
|
||||
|
||||
if (stage2_filename) {
|
||||
d=iso_boot(U8 *)+0x47;
|
||||
*d=cur_blk;
|
||||
et->w[0]=1;
|
||||
StrCpy(&et->w[2],"TempleOS");
|
||||
et->w[15]=0xAA55;
|
||||
j=0;
|
||||
for (i=0;i<16;i++) //Checksum
|
||||
j+=et->w[i];
|
||||
et->w[14]=-j;
|
||||
et->bootable=0x88;
|
||||
et->media_type=0;//0=no emu 2=1.44meg 4=hard drive
|
||||
et->sect_cnt=4; //5 seems like the limit, 4 is safer
|
||||
et->load_rba=cur_blk+1;
|
||||
"%X: Pre Boot Blk\n",cur_blk;
|
||||
FWBlks(out_file,et,cur_blk++<<2,4);
|
||||
"%X: Boot Stage 1\n",cur_blk;
|
||||
cur_blk+=CD_BOOT_LOADER_SIZE/CD_BLK_SIZE;
|
||||
}
|
||||
if (okay) {
|
||||
if (FileAttr(filename2) & _ATTR_CONTIGUOUS)
|
||||
out_file=FOpen(filename2,"wc",cur_blk<<2);
|
||||
else
|
||||
out_file=FOpen(filename2,"w",cur_blk<<2);
|
||||
if (!out_file)
|
||||
okay=FALSE;
|
||||
|
||||
CDFileCreate2(out_file,rootdir,&iso_pri->root_dir_record,
|
||||
&iso_sup->root_dir_record,&cur_blk,rootdir,TRUE,stage2_filename,&stage2_blk);
|
||||
|
||||
tabbuf=CAlloc(tabsize*CD_BLK_SIZE);
|
||||
iso_pri->type_l_path_table=cur_blk;
|
||||
tabbuf->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso_pri->root_dir_record;
|
||||
tabbuf->blk=tempi->loc.little;
|
||||
tabbuf->parent_entry_num=1;
|
||||
tabbuf2=CAlloc(tabsize2*CD_BLK_SIZE);
|
||||
iso_sup->type_l_path_table=cur_blk+tabsize;
|
||||
tabbuf2->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso_sup->root_dir_record;
|
||||
tabbuf2->blk=tempi->loc.little;
|
||||
tabbuf2->parent_entry_num=1;
|
||||
itabbuf=tabbuf+1;
|
||||
itabbuf2=tabbuf2+1;
|
||||
first_free=2;
|
||||
for (i=1;i<=max_depth;i++)
|
||||
CDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,FALSE,&first_free,1,i);
|
||||
"%X: Path Table 0\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
|
||||
cur_blk+=tabsize;
|
||||
"%X: Path Table 1\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
|
||||
cur_blk+=tabsize2;
|
||||
|
||||
|
||||
MemSet(tabbuf,0,tabsize*CD_BLK_SIZE);
|
||||
iso_pri->type_m_path_table=EndianU32(cur_blk);
|
||||
tabbuf->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso_pri->root_dir_record;
|
||||
tabbuf->blk=tempi->loc.big;
|
||||
tabbuf->parent_entry_num=EndianU16(1);
|
||||
MemSet(tabbuf2,0,tabsize2*CD_BLK_SIZE);
|
||||
iso_sup->type_m_path_table=EndianU32(cur_blk+tabsize);
|
||||
tabbuf2->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso_sup->root_dir_record;
|
||||
tabbuf2->blk=tempi->loc.big;
|
||||
tabbuf2->parent_entry_num=EndianU16(1);
|
||||
itabbuf=tabbuf+1;
|
||||
itabbuf2=tabbuf2+1;
|
||||
first_free=2;
|
||||
for (i=1;i<=max_depth;i++)
|
||||
CDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,TRUE,&first_free,1,i);
|
||||
"%X: Path Table 2\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
|
||||
cur_blk+=tabsize;
|
||||
"%X: Path Table 3\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
|
||||
cur_blk+=tabsize2;
|
||||
|
||||
CDirLstDel2(rootdir);
|
||||
FillU32Palindrome(&iso_pri->vol_space_size,cur_blk);
|
||||
FillU32Palindrome(&iso_sup->vol_space_size,cur_blk);
|
||||
FWBlks(out_file,iso_pri,16<<2,4);
|
||||
|
||||
iso_term->type=ISO1T_TERMINATOR;
|
||||
StrCpy(iso_term->id,"CD001");
|
||||
iso_term->version=1;
|
||||
if (stage2_filename) {
|
||||
FWBlks(out_file,iso_boot,17<<2,4);
|
||||
FWBlks(out_file,iso_sup,18<<2,4);
|
||||
FWBlks(out_file,iso_term,19<<2,4);
|
||||
stage2_size=(FileSize(stage2_filename)+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
MemCpy(stage1_buf,BCD_START,BCD_END-BCD_START);
|
||||
*(BCD_BLK_CNT-BCD_START+stage1_buf)(U16 *)=stage2_size;
|
||||
*(BCD_BLK_LO -BCD_START+stage1_buf)(U32 *)=stage2_blk;
|
||||
"$$FG,RED$$!!! Boot Stage 2 !!! %X-%X$$FG$$\n",stage2_blk,stage2_blk+stage2_size-1;
|
||||
FWBlks(out_file,stage1_buf,
|
||||
CD_FILE_OFFSET+1<<2,CD_BOOT_LOADER_SIZE/BLK_SIZE);
|
||||
} else {
|
||||
FWBlks(out_file,iso_sup,17<<2,4);
|
||||
FWBlks(out_file,iso_term,18<<2,4);
|
||||
}
|
||||
if (okay) {
|
||||
cur_blk=0;
|
||||
while (cur_blk<CD_FILE_OFFSET>>2) {
|
||||
FWBlks(out_file,zero_buf,cur_blk<<2,4);
|
||||
cur_blk++;
|
||||
}
|
||||
iso->type=ISO1T_PRI_VOL_DESC;
|
||||
StrCpy(iso->id,"CD001");
|
||||
iso->version=1;
|
||||
FillU16Palindrome(&iso->vol_set_size,1);
|
||||
FillU16Palindrome(&iso->vol_seq_num,1);
|
||||
FillU16Palindrome(&iso->log_block_size,CD_BLK_SIZE);
|
||||
iso->file_structure_version=1;
|
||||
|
||||
iso2->type=ISO1T_SUPPLEMENTARY_DESC;
|
||||
StrCpy(iso2->id,"CD001");
|
||||
iso2->version=1;
|
||||
FillU16Palindrome(&iso2->vol_set_size,1);
|
||||
FillU16Palindrome(&iso2->vol_seq_num,1);
|
||||
FillU16Palindrome(&iso2->log_block_size,CD_BLK_SIZE);
|
||||
iso2->file_structure_version=1;
|
||||
|
||||
iso1->type=ISO1T_BOOT_RECORD;
|
||||
StrCpy(iso1->id,"CD001");
|
||||
iso1->version=1;
|
||||
StrCpy(iso1(U8 *)+7,"EL TORITO SPECIFICATION");
|
||||
|
||||
cur_blk=CD_FILE_OFFSET>>2;
|
||||
|
||||
if (bootfile_buf) {
|
||||
d=iso1(U8 *)+0x47;
|
||||
*d=cur_blk;
|
||||
et->w[0]=1;
|
||||
StrCpy(&et->w[2],"TempleOS");
|
||||
et->w[15]=0xAA55;
|
||||
j=0;
|
||||
for (i=0;i<16;i++) //Checksum
|
||||
j+=et->w[i];
|
||||
et->w[14]=-j;
|
||||
if (bootfile_buf)
|
||||
et->bootable=0x88;
|
||||
//0=no emu 2=1.44meg 4=hard drive
|
||||
et->media_type=emulation;
|
||||
et->sect_cnt=4; //5 seems like the limit, 4 is safer
|
||||
et->load_rba=cur_blk+1;
|
||||
//$AN,"CDBOOT","CDBOOT"$ See $LK,"CDBootFileCreate","MN:CDBootFileCreate"$
|
||||
//See $LK,"BootCdProbe","MN:BootCdProbe"$().
|
||||
"%X: Pre Boot Blk\n",cur_blk;
|
||||
FWBlks(out_file,et,cur_blk<<2,4);
|
||||
cur_blk++;
|
||||
|
||||
"%X: Boot Loader Blks\n",cur_blk;
|
||||
FWBlks(out_file,bootfile_buf,cur_blk<<2,bootfile_cd_blks<<2);
|
||||
cur_blk+=bootfile_cd_blks;
|
||||
}
|
||||
|
||||
CDFileCreate2(out_file,rootdir,
|
||||
&iso->root_dir_record,
|
||||
&iso2->root_dir_record,
|
||||
&cur_blk,rootdir,TRUE);
|
||||
|
||||
tabbuf=CAlloc(tabsize*CD_BLK_SIZE);
|
||||
iso->type_l_path_table=cur_blk;
|
||||
tabbuf->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso->root_dir_record;
|
||||
tabbuf->blk=tempi->loc.little;
|
||||
tabbuf->parent_entry_num=1;
|
||||
tabbuf2=CAlloc(tabsize2*CD_BLK_SIZE);
|
||||
iso2->type_l_path_table=cur_blk+tabsize;
|
||||
tabbuf2->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso2->root_dir_record;
|
||||
tabbuf2->blk=tempi->loc.little;
|
||||
tabbuf2->parent_entry_num=1;
|
||||
itabbuf=tabbuf+1;
|
||||
itabbuf2=tabbuf2+1;
|
||||
first_free=2;
|
||||
for (i=1;i<=max_depth;i++)
|
||||
CDFillPathTable(rootdir,&itabbuf,&itabbuf2,
|
||||
1,FALSE,&first_free,1,i);
|
||||
"%X: Path Table 0\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
|
||||
cur_blk+=tabsize;
|
||||
"%X: Path Table 1\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
|
||||
cur_blk+=tabsize2;
|
||||
|
||||
|
||||
MemSet(tabbuf,0,tabsize*CD_BLK_SIZE);
|
||||
iso->type_m_path_table=EndianU32(cur_blk);
|
||||
tabbuf->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso->root_dir_record;
|
||||
tabbuf->blk=tempi->loc.big;
|
||||
tabbuf->parent_entry_num=EndianU16(1);
|
||||
MemSet(tabbuf2,0,tabsize2*CD_BLK_SIZE);
|
||||
iso2->type_m_path_table=EndianU32(cur_blk+tabsize);
|
||||
tabbuf2->name_len=2; //Fill-in adam entry
|
||||
tempi=&iso2->root_dir_record;
|
||||
tabbuf2->blk=tempi->loc.big;
|
||||
tabbuf2->parent_entry_num=EndianU16(1);
|
||||
itabbuf=tabbuf+1;
|
||||
itabbuf2=tabbuf2+1;
|
||||
first_free=2;
|
||||
for (i=1;i<=max_depth;i++)
|
||||
CDFillPathTable(rootdir,&itabbuf,&itabbuf2,
|
||||
1,TRUE,&first_free,1,i);
|
||||
"%X: Path Table 2\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
|
||||
cur_blk+=tabsize;
|
||||
"%X: Path Table 3\n",cur_blk;
|
||||
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
|
||||
cur_blk+=tabsize2;
|
||||
|
||||
CDirLstDel2(rootdir);
|
||||
FillU32Palindrome(&iso->vol_space_size,cur_blk);
|
||||
FillU32Palindrome(&iso2->vol_space_size,cur_blk);
|
||||
FWBlks(out_file,iso,16<<2,4);
|
||||
|
||||
iso3->type=ISO1T_TERMINATOR;
|
||||
StrCpy(iso3->id,"CD001");
|
||||
iso3->version=1;
|
||||
if (bootfile_buf) {
|
||||
FWBlks(out_file,iso1,17<<2,4);
|
||||
FWBlks(out_file,iso2,18<<2,4);
|
||||
FWBlks(out_file,iso3,19<<2,4);
|
||||
} else {
|
||||
FWBlks(out_file,iso2,17<<2,4);
|
||||
FWBlks(out_file,iso3,18<<2,4);
|
||||
}
|
||||
} else
|
||||
cur_blk=0;
|
||||
|
||||
cf_done:
|
||||
FClose(out_file);
|
||||
Free(tabbuf);
|
||||
Free(tabbuf2);
|
||||
done1:
|
||||
Free(bootfile_buf);
|
||||
Free(filename2);
|
||||
Free(et);
|
||||
Free(stage2_filename);
|
||||
Free(filename);
|
||||
Free(zero_buf);
|
||||
Free(iso);
|
||||
Free(iso1);
|
||||
Free(iso2);
|
||||
Free(iso3);
|
||||
Free(stage1_buf);
|
||||
Free(et);
|
||||
Free(iso_pri);
|
||||
Free(iso_boot);
|
||||
Free(iso_sup);
|
||||
Free(iso_term);
|
||||
return cur_blk;
|
||||
}
|
||||
#help_index ""
|
||||
@@ -4,19 +4,14 @@
|
||||
//Kernel module: Kernel.BIN.Z
|
||||
#define KERNEL_BIN_C "Kernel.BIN.C"
|
||||
|
||||
//Must be first dir on CD.
|
||||
#define BOOT_DIR "/0000Boot"
|
||||
//Must be first file on CD.
|
||||
#define BOOT_DIR_KERNEL_BIN_C BOOT_DIR "/0000" KERNEL_BIN_C
|
||||
|
||||
//Stage 2 of master boot loader
|
||||
#define BOOTMHD2_BIN_C "/0000Boot/BootMHD2.BIN.C"
|
||||
#define BOOTMHD2_BIN_C BOOT_DIR "/BootMHD2.BIN.C"
|
||||
|
||||
//Old master boot record
|
||||
#define OLDMBR_BIN_C "/0000Boot/OldMBR.BIN.C"
|
||||
|
||||
//CD-ROM patched Boot Loader
|
||||
#define BOOTCD_BIN_Z "/0000Boot/BootCD.BIN.Z"
|
||||
#define OLDMBR_BIN_C BOOT_DIR "/OldMBR.BIN.C"
|
||||
|
||||
if (IsDrvWritable)
|
||||
MkDir("/Temp"); //Good to have a Temp
|
||||
@@ -25,30 +20,7 @@ if (IsDrvWritable)
|
||||
#include "BootHD"
|
||||
#include "BootMHD"
|
||||
#include "BootMHD2"
|
||||
|
||||
#help_index "Install;File/Install Related;File/CD DVD"
|
||||
public Bool CDBootFileCreate()
|
||||
{
|
||||
U8 *br;
|
||||
I64 size=FileSize(BOOT_DIR_KERNEL_BIN_C);
|
||||
|
||||
br=CAlloc(CD_BOOT_LOADER_SIZE);
|
||||
*BCD_BLK_CNT(U16 *)=(size+CD_BLK_SIZE-1)/CD_BLK_SIZE;
|
||||
|
||||
//$LK,"CDBOOT","FA:::/TempleOS/Adam/Dsk/DskCDDVD.CPP,CDBOOT"$ writes the following blocks:
|
||||
//0x14 Preboot
|
||||
//0x15 Boot-loader ($LK,"BootCD.BIN.C","FI:::/TempleOS/Adam/Boot/BootCD.CPP"$ stored uncompressed in a non-file block)
|
||||
//0x16 0000Kernel.BIN.C.
|
||||
|
||||
//No emulation
|
||||
//This trick assumes 0000Kernel is first file in first dir.
|
||||
*BCD_BLK_LO(U32 *)=1+(CD_FILE_OFFSET+CD_BOOT_LOADER_SIZE/BLK_SIZE)/(CD_BLK_SIZE>>BLK_SIZE_BITS);
|
||||
|
||||
MemCpy(br,BCD_START,BCD_END-BCD_START);
|
||||
FileWrite(BOOTCD_BIN_Z,br,CD_BOOT_LOADER_SIZE);
|
||||
Free(br);
|
||||
return TRUE;
|
||||
}
|
||||
#include "DskCDDVD"
|
||||
|
||||
#help_index "Call"
|
||||
asm {
|
||||
@@ -61,8 +33,24 @@ _HI_CALL::
|
||||
CALL RAX
|
||||
@@05: LEAVE
|
||||
RET1 8
|
||||
// ************************************
|
||||
_HI_MEMCPY::
|
||||
ENTER 0
|
||||
PUSH RSI
|
||||
PUSH RDI
|
||||
CLD
|
||||
MOV RDI,U64 SF_ARG1[RBP]
|
||||
MOV RSI,U64 SF_ARG2[RBP]
|
||||
MOV RCX,U64 SF_ARG3[RBP]
|
||||
REP_MOVSB
|
||||
MOV RAX,RDI
|
||||
POP RDI
|
||||
POP RSI
|
||||
LEAVE
|
||||
RET1 24
|
||||
}
|
||||
_extern _HI_CALL I64 HiCall(U8 *s);
|
||||
_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt);
|
||||
|
||||
#help_index "Boot"
|
||||
public U0 SoftBoot(U8 *filename) //No hardware rst
|
||||
@@ -74,23 +62,15 @@ public U0 SoftBoot(U8 *filename) //No hardware rst
|
||||
reg *shutdown,*hi_image2;
|
||||
|
||||
if (!(hi_image2=FileRead(filename,&size))) return;
|
||||
switch (snd_dev) {
|
||||
case SD_PC_SPEAKER:
|
||||
break;
|
||||
case SD_HD_AUDIO:
|
||||
CallExtStr("HDAudioEnd",TRUE);
|
||||
break;
|
||||
}
|
||||
|
||||
shutdown=MAlloc(SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL,Fs->code_heap);
|
||||
hi_image=MAlloc(size,Fs->code_heap);
|
||||
MemCpy(hi_image,hi_image2,size);
|
||||
HiMemCpy(hi_image,hi_image2,size);
|
||||
Free(hi_image2);
|
||||
|
||||
hi_image->boot_base=lo_image(U8 *)+sizeof(CBinFile);
|
||||
hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.loader_patch_table_offset;
|
||||
MemCpy(&hi_image->sys_mem_E801,&lo_image->sys_mem_E801,2*2);
|
||||
MemCpy(&hi_image->sys_mem_E820,&lo_image->sys_mem_E820,NUM_MEM_E820_ENTRIES*MEM_E820_ENTRY_SIZE);
|
||||
HiMemCpy(&hi_image->sys_mem_E801,&lo_image->sys_mem_E801,2*2);
|
||||
HiMemCpy(&hi_image->sys_mem_E820,&lo_image->sys_mem_E820,NUM_MEM_E820_ENTRIES*MEM_E820_ENTRY_SIZE);
|
||||
hi_image->sys_gr_mode=lo_image->sys_gr_mode;
|
||||
hi_image->sys_pci_busses=lo_image->sys_pci_busses;
|
||||
hi_image->boot_code=BOOT_CODE_RAM;
|
||||
@@ -99,9 +79,9 @@ public U0 SoftBoot(U8 *filename) //No hardware rst
|
||||
if (mp_cnt>1)
|
||||
MPHalt;
|
||||
|
||||
MemCpy(shutdown,SYS_RESTART_KERNEL,SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL);
|
||||
MemCpy(&hi_image->sys_gdttab,&lo_image->sys_gdttab,GDT_SIZE);
|
||||
MemCpy(lo_image,hi_image,size);
|
||||
HiMemCpy(shutdown,SYS_RESTART_KERNEL,SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL);
|
||||
HiMemCpy(&hi_image->sys_gdttab,&lo_image->sys_gdttab,GDT_SIZE);
|
||||
HiMemCpy(lo_image,hi_image,size);
|
||||
HiCall(shutdown);
|
||||
}
|
||||
|
||||
@@ -168,7 +148,7 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0)
|
||||
//the code on that drive and update the boot sect.
|
||||
|
||||
//If you are making a bootable CD-ROM you supply a dst_drv.
|
||||
//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP.Z"$
|
||||
//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP"$
|
||||
|
||||
//See $LK,"Install Documentation","FI:::/TempleOS/Doc/Install.TXT"$
|
||||
|
||||
@@ -202,7 +182,6 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0)
|
||||
switch (bdev->type) {
|
||||
case BDT_ATAPI:
|
||||
Move("/TempleOS/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C);
|
||||
CDBootFileCreate;
|
||||
result=TRUE;
|
||||
break;
|
||||
case BDT_RAM:
|
||||
@@ -214,9 +193,9 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0)
|
||||
Free(de.full_name);
|
||||
"Modifying partition boot record.\n";
|
||||
RBlks(p,&br,p->offset,1);
|
||||
br.jump_and_nop[0]=0xEB;
|
||||
br.jump_and_nop[1]=0x58;
|
||||
br.jump_and_nop[2]=0x90;
|
||||
br.jump_and_nop[0]=OC_JMP_REL8;
|
||||
br.jump_and_nop[1]=offset(CFAT32Boot.code)-2;
|
||||
br.jump_and_nop[2]=OC_NOP;
|
||||
*BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
|
||||
*BHD_DAP_BLK(I64 *)=p->data+de.cluster*p->spc;
|
||||
for (i=0;i<BHD_END-BHD_CODE;i++)
|
||||
@@ -243,8 +222,8 @@ public U0 OldMasterBootRead(U8 src_drv,U8 dst_drv)
|
||||
CMasterBoot mbr;
|
||||
Drv(dst_drv);
|
||||
p=Fs->cur_prt;
|
||||
if (p->type!=PT_NATIVE && p->type!=PT_FAT32)
|
||||
PutDefineErr("ST_NOT_NATIVE");
|
||||
if (p->type!=PT_REDSEA && p->type!=PT_FAT32)
|
||||
PutDefineErr("ST_NOT_REDSEA");
|
||||
else {
|
||||
//Bypass partition bounds-checking
|
||||
BlkDevLock(bdev);
|
||||
@@ -312,8 +291,8 @@ public Bool InstallMasterBootLoader(U8 drv_let,U8 *drv_lst=NULL)
|
||||
|
||||
Drv(drv_let);
|
||||
p=Fs->cur_prt;
|
||||
if (p->type!=PT_NATIVE && p->type!=PT_FAT32)
|
||||
PutDefineErr("ST_NOT_NATIVE");
|
||||
if (p->type!=PT_REDSEA && p->type!=PT_FAT32)
|
||||
PutDefineErr("ST_NOT_REDSEA");
|
||||
else {
|
||||
bdev=Drv2BlkDev(drv_let);
|
||||
if (!FileFind(OLDMBR_BIN_C,,FUF_JUST_FILES))
|
||||
|
||||
@@ -64,7 +64,7 @@ public Bool CtrlInside(CCtrl *c,I64 x,I64 y)
|
||||
U0 DrawCtrls(CTask *task)
|
||||
{
|
||||
CCtrl *c;
|
||||
CDC *dc=DCAlias(gr_dc,task);
|
||||
CDC *dc=DCAlias(gr_dc2,task);
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
c=task->next_ctrl;
|
||||
while (c!=&task->next_ctrl) {
|
||||
|
||||
@@ -25,8 +25,7 @@ Bool ClassRep2(CDoc *doc,U8 *class_name,U8 *_b,I64 depth,I64 max_depth,Bool dyna
|
||||
ptr=_b(U8 *)+ml->offset;
|
||||
DocPrintF(doc,"%08X ",ptr(U8 *)+offset);
|
||||
j=tempc2->ptr_cnt;
|
||||
while (tempc2->fwd_class)
|
||||
tempc2=tempc2->fwd_class;
|
||||
tempc2=OptClassFwd(tempc2);
|
||||
tempc2-=tempc2->ptr_cnt;
|
||||
if (tempc2->type & HTT_INTERNAL_TYPE) {
|
||||
DocPrintF(doc,"$$FG,GREEN$$%-20ts:$$FG$$",ml->str);
|
||||
@@ -143,7 +142,7 @@ public U0 ClassRep(U8 *class_name,U8 *_b,I64 max_depth=2,Bool fun=FALSE,I64 offs
|
||||
} else {
|
||||
DocMax;
|
||||
old_preempt=Preempt(OFF);
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
}
|
||||
if (fun)
|
||||
ClassRep2(doc,class_name,_b,0,max_depth,FALSE,HTT_FUN,offset);
|
||||
@@ -168,7 +167,7 @@ public U0 ClassRepD(U8 *class_name,U8 *_b,I64 max_depth=2,Bool fun=FALSE,I64 off
|
||||
} else {
|
||||
DocMax;
|
||||
old_preempt=Preempt(OFF);
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
}
|
||||
if (fun)
|
||||
ClassRep2(doc,class_name,_b,0,max_depth,TRUE,HTT_FUN,offset);
|
||||
@@ -190,9 +189,7 @@ U0 UpdateRegVarImg(CHashFun *tempf,U8 *_b,CTask *task)
|
||||
ml=tempf->member_lst;
|
||||
while (ml) {
|
||||
if (ml->register!=CREG_NONE) {
|
||||
tempc=ml->member_class;
|
||||
while (tempc->fwd_class)
|
||||
tempc=tempc->fwd_class;
|
||||
tempc=OptClassFwd(ml->member_class);
|
||||
MemCpy(_b+ml->offset,TaskRegAdd(task,ml->register),tempc->size);
|
||||
}
|
||||
ml=ml->next;
|
||||
|
||||
@@ -58,12 +58,8 @@ U0 PCILookUpSingle(CDoc *doc,I64 m,I64 d,U8 **_vendor,U8 **_dev)
|
||||
while (doc_e!=doc) {
|
||||
if (first) {
|
||||
if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[0]!=';' && StrLen(doc_e->tag)>=4) {
|
||||
buf[0]='0';
|
||||
buf[1]='x';
|
||||
buf[2]=doc_e->tag[0];
|
||||
buf[3]=doc_e->tag[1];
|
||||
buf[4]=doc_e->tag[2];
|
||||
buf[5]=doc_e->tag[3];
|
||||
buf[0](U16)='0x';
|
||||
buf[2](U32)=doc_e->tag(U32 *)[0];
|
||||
buf[6]=0;
|
||||
if (A2I(buf)==m) {
|
||||
doc_e=doc_e->next->next;
|
||||
@@ -87,12 +83,8 @@ U0 PCILookUpSingle(CDoc *doc,I64 m,I64 d,U8 **_vendor,U8 **_dev)
|
||||
if (doc_e->type_u8==DOCT_TAB) {
|
||||
doc_e=doc_e->next;
|
||||
if (doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=4) {
|
||||
buf[0]='0';
|
||||
buf[1]='x';
|
||||
buf[2]=doc_e->tag[0];
|
||||
buf[3]=doc_e->tag[1];
|
||||
buf[4]=doc_e->tag[2];
|
||||
buf[5]=doc_e->tag[3];
|
||||
buf[0](U16)='0x';
|
||||
buf[2](U32)=doc_e->tag(U32 *)[0];
|
||||
buf[6]=0;
|
||||
if (A2I(buf)==d) {
|
||||
doc_e=doc_e->next->next;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
#help_file "::/TempleOS/Doc/Doc"
|
||||
|
||||
//See $LK-A,"::/TempleOS/Doc/Doc.TXT"$
|
||||
|
||||
extern I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e);
|
||||
extern I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e);
|
||||
extern U0 DocPutSPartial(CDoc *doc,U8 *st);
|
||||
@@ -10,10 +9,10 @@ extern U0 DocFormBackward(CDoc *doc,Bool giveup=FALSE);
|
||||
extern U0 EdUndoFilter(CDoc *doc);
|
||||
|
||||
U0 DocInit()
|
||||
{
|
||||
DefineLstLoad("ST_DOC_CMDS","TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0FO\0ID\0"
|
||||
"FG\0BG\0FD\0BD\0F2\0FL\0FM\0FA\0FH\0FE\0FU\0FB\0FY\0FR\0FC\0FQ\0"
|
||||
"WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0"
|
||||
{ //$LK,"CMD Defines","MN:DOCT_TEXT"$
|
||||
DefineLstLoad("ST_DOC_CMDS",
|
||||
"TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0FO\0ID\0"
|
||||
"FG\0BG\0FD\0BD\0PT\0WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0"
|
||||
"CB\0MA\0MU\0HX\0HS\0HE\0TR\0SP\0IB\0IT\0IS\0BP\0SO\0HL\0LP\0CC\0HI\0HV\0HC\0ER\0");
|
||||
DefineLstLoad("ST_DOC_FLAGS",
|
||||
//flags1
|
||||
|
||||
+293
-146
@@ -1,26 +1,22 @@
|
||||
#define EF_DONT_RECOMPILE 0
|
||||
#define EF_RECOMPILE 1
|
||||
#define EF_RENUM_ASM 2
|
||||
#define EF_SLIDER_CTRL 3
|
||||
#define EF_CH_SC 4
|
||||
#define C_INDENT_SPACES 2
|
||||
#define ASM_RENUM_SPACING 5
|
||||
|
||||
#define EF_REINDENT 0
|
||||
#define EF_CHK_COMPILE 1
|
||||
#define EF_RENUM_ASM 2
|
||||
#define EF_SLIDER_CTRL 3
|
||||
#define EF_CH_SC 4
|
||||
|
||||
I64 PopUpEdFmt()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$FG,PURPLE$$Reformat Function$$FG$$\n"
|
||||
"If you enter $$FG,GREEN$$DONT RECOMPILE$$FG$$ the stored\n"
|
||||
"source line indentation information will\n"
|
||||
"be used. $$BK,1$$Be sure it is up-to-date!$$BK,0$$\n"
|
||||
"For $$FG,GREEN$$#exe$$FG$$ config'ed projects, enter $$FG,GREEN$$DONT RECOMPILE$$FG$$.\n"
|
||||
"$$MU,\"Recompile and autoindent CPP.Z Fun\",EF_RECOMPILE$$\n"
|
||||
"$$MU,\"Don't Recompile but autoindent CPP.Z Fun\",EF_DONT_RECOMPILE$$\n\n"
|
||||
"$$MU,\"Renum Asm Local @@ Labels for Fun\",EF_RENUM_ASM$$\n\n"
|
||||
"$$FG,PURPLE$$Insert Managed Code$$FG$$\n"
|
||||
"$$MU,\"Slider Ctrl\",EF_SLIDER_CTRL$$\n\n"
|
||||
"$$FG,PURPLE$$Misc$$FG$$\n"
|
||||
"$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\",EF_CH_SC$$\n\n"
|
||||
"$$MU,\"CANCEL\",DOCM_CANCEL$$\n"
|
||||
DocPutS(doc,"$$FG,LTBLUE$$$$MU,\"Check Compile\",EF_CHK_COMPILE$$\n"
|
||||
"$$MU,\"Reindent CPP.Z Fun\",EF_REINDENT$$\n"
|
||||
"$$MU,\"Renum Asm Local @@ Labels for Fun\",EF_RENUM_ASM$$\n"
|
||||
"$$MU,\"Insert Mgd Code: Slider Ctrl\",EF_SLIDER_CTRL$$\n"
|
||||
"$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\",EF_CH_SC$$\n"
|
||||
"$$MU,\"CANCEL\",DOCM_CANCEL$$\n\n"
|
||||
"$$FG,GREEN$$<ALT-BACKSPACE>$$FG$$ to undo if not happy\n"
|
||||
"with the results.\n");
|
||||
i=PopUpMenu(doc);
|
||||
@@ -28,14 +24,185 @@ I64 PopUpEdFmt()
|
||||
return i;
|
||||
}
|
||||
|
||||
class CRILex
|
||||
{
|
||||
CLex *lx1,*lx2;
|
||||
CQueVectU8 *indent;
|
||||
I64 depth,exp_depth;
|
||||
Bool was_new_line,is_not_cont,one_shot;
|
||||
};
|
||||
|
||||
#define C_INDENT_SPACES 2
|
||||
#define ASM_RENUM_SPACING 5
|
||||
I64 EdRILex(CRILex *rx)
|
||||
{
|
||||
Bool is_not_cont=FALSE;
|
||||
I64 i;
|
||||
do {
|
||||
Lex(rx->lx1);
|
||||
Lex(rx->lx2);
|
||||
|
||||
if (rx->lx1->token=='\n') {
|
||||
if (rx->lx2->token==TK_IDENT)
|
||||
i=PrsKeyWord(rx->lx2);
|
||||
else
|
||||
i=-1;
|
||||
if (rx->lx2->token==';' || rx->lx2->token=='{' || rx->lx2->token=='}' ||
|
||||
rx->lx2->token==':' || rx->lx2->token==')' && !rx->exp_depth ||
|
||||
i==KW_ELSE || i==KW_CATCH || i==KW_DO)
|
||||
is_not_cont=TRUE;
|
||||
}
|
||||
|
||||
if (rx->was_new_line && (rx->lx1->token!=':' || rx->lx2->token!=TK_IDENT ||
|
||||
PrsKeyWord(rx->lx2)==KW_DFT)) {
|
||||
if (rx->one_shot) {
|
||||
QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth+3);
|
||||
rx->one_shot=FALSE;
|
||||
} else
|
||||
QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth);
|
||||
}
|
||||
if (rx->lx2->token=='\n')
|
||||
rx->was_new_line=TRUE;
|
||||
else
|
||||
rx->was_new_line=FALSE;
|
||||
} while (rx->lx1->token=='\n');
|
||||
rx->is_not_cont=is_not_cont;
|
||||
return rx->lx1->token;
|
||||
}
|
||||
|
||||
U0 EdRIExp(CRILex *rx)
|
||||
{
|
||||
if (rx->lx1->token=='(') {
|
||||
if (!rx->exp_depth++)
|
||||
rx->depth+=3;
|
||||
EdRILex(rx);
|
||||
while (rx->lx1->token && rx->lx1->token!=')')
|
||||
EdRIExp(rx);
|
||||
if (!--rx->exp_depth)
|
||||
rx->depth-=3;
|
||||
}
|
||||
EdRILex(rx);
|
||||
}
|
||||
|
||||
U0 EdRIStmt(CRILex *rx,Bool indent)
|
||||
{
|
||||
I64 i;
|
||||
Bool cont;
|
||||
if (rx->lx1->token=='{') {
|
||||
rx->depth++;
|
||||
EdRILex(rx);
|
||||
while (rx->lx1->token && rx->lx1->token!='}')
|
||||
EdRIStmt(rx,FALSE);
|
||||
rx->depth--;
|
||||
EdRILex(rx);
|
||||
} else {
|
||||
if (indent) rx->depth++;
|
||||
do {
|
||||
cont=FALSE;
|
||||
switch (PrsKeyWord(rx->lx1)) {
|
||||
case KW_IF:
|
||||
EdRILex(rx);
|
||||
EdRIExp(rx);
|
||||
EdRIStmt(rx,TRUE);
|
||||
if (PrsKeyWord(rx->lx1)==KW_ELSE) {
|
||||
EdRILex(rx);
|
||||
if (PrsKeyWord(rx->lx1)==KW_IF && rx->lx2->token!='\n')
|
||||
EdRIStmt(rx,FALSE);
|
||||
else
|
||||
EdRIStmt(rx,TRUE);
|
||||
}
|
||||
break;
|
||||
case KW_TRY:
|
||||
EdRILex(rx);
|
||||
EdRIStmt(rx,TRUE);
|
||||
if (PrsKeyWord(rx->lx1)==KW_CATCH) {
|
||||
EdRILex(rx);
|
||||
EdRIStmt(rx,TRUE);
|
||||
}
|
||||
break;
|
||||
case KW_FOR:
|
||||
case KW_WHILE:
|
||||
EdRILex(rx);
|
||||
EdRIExp(rx);
|
||||
EdRIStmt(rx,TRUE);
|
||||
break;
|
||||
case KW_DO:
|
||||
EdRILex(rx);
|
||||
EdRIStmt(rx,TRUE);
|
||||
if (PrsKeyWord(rx->lx1)==KW_WHILE) {
|
||||
EdRILex(rx);
|
||||
EdRIExp(rx);
|
||||
}
|
||||
if (rx->lx1->token==';')
|
||||
EdRILex(rx);
|
||||
break;
|
||||
case KW_SWITCH:
|
||||
case KW_NOBOUND_SWITCH:
|
||||
EdRILex(rx);
|
||||
EdRIExp(rx);
|
||||
if (rx->lx1->token=='{') {
|
||||
rx->depth++;
|
||||
EdRILex(rx);
|
||||
while (rx->lx1->token && rx->lx1->token!='}') {
|
||||
while (TRUE) {
|
||||
i=PrsKeyWord(rx->lx1);
|
||||
if (i==KW_CASE || i==KW_DFT) {
|
||||
EdRILex(rx);
|
||||
while (rx->lx1->token && rx->lx1->token!=':')
|
||||
EdRILex(rx);
|
||||
EdRILex(rx);
|
||||
} else
|
||||
break;
|
||||
}
|
||||
if (rx->lx1->token)
|
||||
EdRIStmt(rx,TRUE);
|
||||
}
|
||||
rx->depth--;
|
||||
EdRILex(rx);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
while (rx->lx1->token && rx->lx1->token!=';' && rx->lx1->token!=':') {
|
||||
if (rx->lx2->token=='\n' && !rx->is_not_cont)
|
||||
rx->one_shot=TRUE;
|
||||
EdRILex(rx);
|
||||
}
|
||||
if (rx->lx1->token==':')
|
||||
cont=TRUE;
|
||||
EdRILex(rx);
|
||||
}
|
||||
} while (cont);
|
||||
if (indent) rx->depth--;
|
||||
}
|
||||
}
|
||||
|
||||
CQueVectU8 *EdRICode(CDoc *doc)
|
||||
{
|
||||
CQueVectU8 *result;
|
||||
CRILex *rx=CAlloc(sizeof(CRILex));
|
||||
|
||||
rx->lx1=LexNew(NULL,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name);
|
||||
Free(rx->lx1->lfns[0].name);
|
||||
LexAttachDoc(rx->lx1,&rx->lx1->lfns[0],doc,,doc->cur_entry,doc->cur_data_col);
|
||||
|
||||
rx->lx2=LexNew(NULL,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name);
|
||||
Free(rx->lx2->lfns[0].name);
|
||||
LexAttachDoc(rx->lx2,&rx->lx2->lfns[0],doc,,doc->cur_entry,doc->cur_data_col);
|
||||
|
||||
rx->indent=QueVectU8New(doc->cur_entry->y);
|
||||
|
||||
Lex(rx->lx1);
|
||||
EdRIStmt(rx,FALSE);
|
||||
|
||||
LexDel(rx->lx1);
|
||||
LexDel(rx->lx2);
|
||||
result=rx->indent;
|
||||
Free(rx);
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 EdRemFunLeadingSpace(CDoc *doc)
|
||||
{
|
||||
Bool unlock=DocLock(doc),
|
||||
start_of_line=TRUE;
|
||||
start_of_line=TRUE;
|
||||
U8 ch,*ptr;
|
||||
I64 levels=1;
|
||||
CDocEntry *doc_e,*doc_e2;
|
||||
@@ -45,8 +212,8 @@ U0 EdRemFunLeadingSpace(CDoc *doc)
|
||||
do {
|
||||
doc_e2=doc_e->next;
|
||||
if (doc_e!=doc && doc_e!=doc->cur_entry &&
|
||||
!(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT))
|
||||
!(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT))
|
||||
switch (doc_e->type_u8) {
|
||||
case DOCT_TEXT:
|
||||
ptr=doc_e->tag;
|
||||
@@ -155,7 +322,7 @@ U0 EdRenumAsm(CDoc *doc)
|
||||
I64 num=0;
|
||||
CRenum root,*tempr,*tempr1;
|
||||
U8 buf[sizeof(CEdFindText.find_text)],
|
||||
buf2[sizeof(CEdFindText.find_text)];
|
||||
buf2[sizeof(CEdFindText.find_text)];
|
||||
|
||||
QueInit(&root);
|
||||
EdSelectFun(doc,TRUE);
|
||||
@@ -184,146 +351,105 @@ U0 EdRenumAsm(CDoc *doc)
|
||||
DocUnlock(doc);
|
||||
}
|
||||
|
||||
#define AC_ABORT -1
|
||||
#define AC_REINDENT 0
|
||||
#define AC_RENUM_ASM 1
|
||||
|
||||
U0 EdRefmtFun(CDoc *doc,I64 fmt_type)
|
||||
U0 EdCodeTools2(CDoc *doc,I64 tool_action)
|
||||
{
|
||||
Bool unlock=DocLock(doc),start_of_line=TRUE;
|
||||
Bool okay,unlock=DocLock(doc),start_of_line=TRUE;
|
||||
CDocEntry *doc_e,*doc_ne;
|
||||
I64 i,x,r,action=AC_ABORT,old_line_num;
|
||||
I64 i,start_y,end_y,x,r,goto_line_num;
|
||||
U8 *b,*st,*st2,*prj_file;
|
||||
CHashSrcSym *temph;
|
||||
CIndentInfo *indent;
|
||||
CTask *task=NULL;
|
||||
CTaskCmd *tempc;
|
||||
CSrvCmd *tempc;
|
||||
CQueVectU8 *indent;
|
||||
|
||||
DocRecalc(doc);
|
||||
old_line_num=doc->cur_entry->y+1;
|
||||
goto_line_num=doc->cur_entry->y+1;
|
||||
|
||||
DocCaptureUndo(doc,TRUE);
|
||||
switch (fmt_type) {
|
||||
case EF_RECOMPILE:
|
||||
if (EdGoToFun(doc,FALSE,FALSE)) {
|
||||
if (doc->flags&DOCF_PLAIN_TEXT)
|
||||
DocFlagsToggle(doc,DOCF_PLAIN_TEXT);
|
||||
DocWrite(doc);
|
||||
task=Spawn(&ServantUserCmdLine,NULL,"Servant",Fs);
|
||||
st2=CurDir;
|
||||
st=MSPrintF("Cd(\"%s\");",st2);
|
||||
tempc=TaskRqstQue(task,Fs,st,1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
Free(st2);
|
||||
switch (tool_action) {
|
||||
case EF_CHK_COMPILE:
|
||||
okay=FALSE;
|
||||
if (doc->flags&DOCF_PLAIN_TEXT)
|
||||
DocFlagsToggle(doc,DOCF_PLAIN_TEXT);
|
||||
DocWrite(doc);
|
||||
task=Spawn(&SrvUserCmdLine,NULL,"Srv",,Fs);
|
||||
st2=CurDir;
|
||||
st=MSPrintF("Cd(\"%s\");",st2);
|
||||
tempc=TaskExeStrQue(task,Fs,st,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
Free(st2);
|
||||
Free(st);
|
||||
SetWinHorz(Fs->win_left,Fs->win_right, task);
|
||||
SetWinVert(Fs->win_top, Fs->win_bottom,task);
|
||||
if (ScanResult(tempc,&r)) {
|
||||
st=DirFile(doc->filename.name,,"PRJ.Z"),
|
||||
prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z);
|
||||
Free(st);
|
||||
SetWinHorz(Fs->win_left,Fs->win_right, task);
|
||||
SetWinVert(Fs->win_top, Fs->win_bottom,task);
|
||||
if (GetRqstResult(tempc,&r)) {
|
||||
st=DirFile(doc->filename.name,,"PRJ.Z"),
|
||||
if (FileFind(prj_file)) {
|
||||
st2=DirFile(prj_file),
|
||||
st=MSPrintF("Cd(\"%s\");",st2);
|
||||
Free(st2);
|
||||
tempc=TaskExeStrQue(task,Fs,st,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER|1<<SVCf_FREE_ON_COMPLETE);
|
||||
Free(st);
|
||||
st=MSPrintF("\"$$WW,1$$\";Cmp(\"%s\",\"SysTemp\",\"SysTemp\");",prj_file);
|
||||
tempc=TaskExeStrQue(task,Fs,st,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
if (ScanResult(tempc,&r))
|
||||
if (!r) {
|
||||
tempc=TaskExeStrQue(task,Fs,
|
||||
"Load(\"SysTemp\",LDF_JUST_LOAD);",1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
if (ScanResult(tempc,&r))
|
||||
okay=TRUE;
|
||||
}
|
||||
tempc=TaskExeStrQue(task,Fs,"Del(\"SysTemp.*\");",1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
ScanResult(tempc,&r);
|
||||
} else {
|
||||
Free(prj_file);
|
||||
st=DirFile(doc->filename.name,"Load","CPP.Z");
|
||||
prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z);
|
||||
Free(st);
|
||||
if (FileFind(prj_file)) {
|
||||
st2=DirFile(prj_file),
|
||||
st=MSPrintF("Cd(\"%s\");",st2);
|
||||
Free(st2);
|
||||
tempc=TaskRqstQue(task,Fs,st,1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
st=MSPrintF("\"$$WW,1$$\";Cmp(\"%s\",\"SysTemp\",\"SysTemp\");",prj_file);
|
||||
tempc=TaskRqstQue(task,Fs,st,1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
if (GetRqstResult(tempc,&r))
|
||||
if (!r) {
|
||||
tempc=TaskRqstQue(task,Fs,
|
||||
"Load(\"SysTemp\",LDF_JUST_LOAD);"
|
||||
"MapFileLoad(\"SysTemp\");",1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
if (GetRqstResult(tempc,&r))
|
||||
action=AC_REINDENT;
|
||||
}
|
||||
tempc=TaskRqstQue(task,Fs,"Del(\"SysTemp.*\");",1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
GetRqstResult(tempc,&r);
|
||||
} else {
|
||||
Free(prj_file);
|
||||
st=DirFile(doc->filename.name,"Load","CPP.Z");
|
||||
prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z);
|
||||
Free(st);
|
||||
if (FileFind(prj_file))
|
||||
st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",prj_file);
|
||||
else
|
||||
st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",doc->filename.name);
|
||||
tempc=TaskRqstQue(task,Fs,st,1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
if (GetRqstResult(tempc,&r) && r)
|
||||
action=AC_REINDENT;
|
||||
}
|
||||
Free(prj_file);
|
||||
}
|
||||
if (action==AC_REINDENT) {
|
||||
DocUnlock(doc);
|
||||
st=MSPrintF("DbgFunFind(0x%X,0);",doc);
|
||||
tempc=TaskRqstQue(task,Fs,st,1<<TASKCf_WAKE_MASTER|1<<TASKCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
if (GetRqstResult(tempc,&r))
|
||||
temph=r;
|
||||
if (FileFind(prj_file))
|
||||
st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",prj_file);
|
||||
else
|
||||
action=AC_ABORT;
|
||||
DocLock(doc);
|
||||
} else
|
||||
PopUpOk("Has Errors");
|
||||
}
|
||||
break;
|
||||
case EF_DONT_RECOMPILE:
|
||||
if (EdGoToFun(doc,FALSE,FALSE)) {
|
||||
if (temph=DbgFunFind(doc,0))
|
||||
action=AC_REINDENT;
|
||||
}
|
||||
break;
|
||||
case EF_RENUM_ASM:
|
||||
if (EdGoToFun(doc,FALSE,TRUE)) {
|
||||
if (EdCurU8(doc)=='{') {
|
||||
EdCursorRight(doc);
|
||||
DocRecalc(doc);
|
||||
} else if (EdCurU8(doc)==':') {
|
||||
EdCursorRight(doc);
|
||||
if (EdCurU8(doc)==':')
|
||||
EdCursorRight(doc);
|
||||
DocRecalc(doc);
|
||||
st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",doc->filename.name);
|
||||
tempc=TaskExeStrQue(task,Fs,st,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
Free(st);
|
||||
if (ScanResult(tempc,&r) && r)
|
||||
okay=TRUE;
|
||||
}
|
||||
action=AC_RENUM_ASM;
|
||||
Free(prj_file);
|
||||
}
|
||||
if (!okay) {
|
||||
PopUpOk("Has Errors");
|
||||
while (LBts(&sys_semas[SYS_SEMA_FIX],0))
|
||||
Yield;
|
||||
ToFileLine(sys_fix_file_line,&st,&i);
|
||||
LBtr(&sys_semas[SYS_SEMA_FIX],0);
|
||||
if (!StrCmp(st,doc->filename.name))
|
||||
goto_line_num=i;
|
||||
Free(st);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
case AC_RENUM_ASM:
|
||||
DocUnlock(doc);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
Sleep(100);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
DocLock(doc);
|
||||
EdRenumAsm(doc);
|
||||
break;
|
||||
case AC_REINDENT:
|
||||
if (temph->type&(HTT_FUN|HTT_EXPORT_SYS_SYM))
|
||||
indent=temph->indent;
|
||||
else
|
||||
indent=NULL;
|
||||
if (indent && indent->min_line<=indent->max_line) {
|
||||
case EF_REINDENT:
|
||||
if (EdGoToFun(doc,FALSE,FALSE)) {
|
||||
start_y=doc->cur_entry->y;
|
||||
indent=EdRICode(doc);
|
||||
DocUnlock(doc);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
Sleep(100);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
DocLock(doc);
|
||||
EdRemFunLeadingSpace(doc);
|
||||
DocLineNumGoTo(doc,indent->min_line);
|
||||
DocLineNumGoTo(doc,start_y+1);
|
||||
doc_e=doc->cur_entry;
|
||||
while (indent->min_line<=doc_e->y+1<=indent->max_line) {
|
||||
end_y=start_y+indent->total_cnt;
|
||||
while (start_y<=doc_e->y<end_y) {
|
||||
if (doc_e!=doc && doc_e!=doc->cur_entry &&
|
||||
!(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
!(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc_e->type_u8==DOCT_NEW_LINE||doc_e->type_u8==DOCT_SOFT_NEW_LINE)
|
||||
start_of_line=TRUE;
|
||||
else {
|
||||
if (start_of_line) {
|
||||
i=indent->body[doc_e->y+1-indent->min_line]*C_INDENT_SPACES;
|
||||
i=QueVectU8Get(indent,doc_e->y)*C_INDENT_SPACES;
|
||||
x=doc_e->x+1;
|
||||
while (i>8) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
@@ -339,7 +465,7 @@ U0 EdRefmtFun(CDoc *doc,I64 fmt_type)
|
||||
b=MAlloc(i+1,doc->mem_task);
|
||||
MemSet(b,CH_SPACE,i);
|
||||
b[i]=0;
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
doc_ne->tag=b;
|
||||
doc_ne->max_col=1;
|
||||
@@ -354,11 +480,32 @@ U0 EdRefmtFun(CDoc *doc,I64 fmt_type)
|
||||
}
|
||||
doc_e=doc_e->next;
|
||||
}
|
||||
break;
|
||||
QueVectU8Del(indent);
|
||||
}
|
||||
break;
|
||||
case EF_RENUM_ASM:
|
||||
if (EdGoToFun(doc,FALSE,TRUE)) {
|
||||
if (EdCurU8(doc)=='{') {
|
||||
EdCursorRight(doc);
|
||||
DocRecalc(doc);
|
||||
} else if (EdCurU8(doc)==':') {
|
||||
EdCursorRight(doc);
|
||||
if (EdCurU8(doc)==':')
|
||||
EdCursorRight(doc);
|
||||
DocRecalc(doc);
|
||||
}
|
||||
DocUnlock(doc);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
Sleep(100);
|
||||
Snd(2000); Sleep(150); Snd(0);
|
||||
DocLock(doc);
|
||||
EdRenumAsm(doc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
DocRecalc(doc);
|
||||
DocLineNumGoTo(doc,old_line_num);
|
||||
DocLineNumGoTo(doc,goto_line_num);
|
||||
|
||||
DocUnlock(doc);
|
||||
if (!unlock)
|
||||
@@ -371,7 +518,7 @@ U0 EdPopUpChSC(I64 *_ch,I64 *_sc)
|
||||
{
|
||||
I64 sc;
|
||||
"Press A Key\n";
|
||||
DocCur->flags|=DOCF_MIN_SIZE;
|
||||
DocPut->flags|=DOCF_MIN_SIZE;
|
||||
do GetMsg(_ch,&sc,1<<MSG_KEY_DOWN);
|
||||
while (sc.u8[0]==SC_SHIFT || sc.u8[0]==SC_CTRL || sc.u8[0]==SC_ALT);
|
||||
*_sc=sc;
|
||||
@@ -411,12 +558,12 @@ U0 EdChSC(CDoc *doc)
|
||||
|
||||
U0 EdCodeTools(CDoc *doc)
|
||||
{
|
||||
I64 fmt_type=PopUpEdFmt;
|
||||
switch (fmt_type) {
|
||||
case EF_DONT_RECOMPILE:
|
||||
case EF_RECOMPILE:
|
||||
I64 tool_action=PopUpEdFmt;
|
||||
switch (tool_action) {
|
||||
case EF_CHK_COMPILE:
|
||||
case EF_REINDENT:
|
||||
case EF_RENUM_ASM:
|
||||
EdRefmtFun(doc,fmt_type);
|
||||
EdCodeTools2(doc,tool_action);
|
||||
break;
|
||||
case EF_SLIDER_CTRL:
|
||||
MgdSliderCtrl(doc);
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
U8 *ctrl_L_footer=
|
||||
"\n$$MU,\"Abort\",DOCM_CANCEL$$\n"
|
||||
"\n\n$$LK+PU,\"Click for Help\",\"FI:::/TempleOS/Doc/Widget.TXT\"$$\n";
|
||||
|
||||
#define DFT_ADDR_LINK_BIN_SIZE 64
|
||||
|
||||
I64 PopUpLinkType(Bool include_anchor)
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$MU,\"To file\",LK_FILE$$\n"
|
||||
DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Link Type Menu\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU,\"To file\",LK_FILE$$\n"
|
||||
"$$MU,\"To anchor in file\",LK_FILE_ANCHOR$$\n"
|
||||
"$$MU,\"To str in file\",LK_FILE_FIND$$\n"
|
||||
"$$MU,\"To line in file\",LK_FILE_LINE$$\n"
|
||||
@@ -18,7 +23,7 @@ I64 PopUpLinkType(Bool include_anchor)
|
||||
"$$MU,\"To Addr\",LK_ADDR$$\n");
|
||||
if (include_anchor)
|
||||
DocPutS(doc,"$$MU,\"Place Anchor\",LK_PLACE_ANCHOR$$\n");
|
||||
DocPutS(doc,"\n$$MU,\"CANCEL\",DOCM_CANCEL$$");
|
||||
DocPrintF(doc,"%s",ctrl_L_footer);
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -31,7 +36,8 @@ class CEdFileLink
|
||||
U8 aux[136];
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -42,7 +48,8 @@ class CEdFileAnchorLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Anchor Label :%s\"$$\n";
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -53,7 +60,8 @@ class CEdFileFindLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Str :%s\"$$\n";
|
||||
I64 num fmtstr "$$DA-T,135,\"Occurrence Num:%04d\"$$\n";
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -64,7 +72,8 @@ class CEdFileLineLink
|
||||
U8 aux[136];
|
||||
I64 num fmtstr "$$DA-T,135,\"Line Num :%04d\"$$\n";
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -75,7 +84,8 @@ class CEdManPageLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Label :%s\"$$\n";
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -86,7 +96,8 @@ class CEdAddrLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Addr Exp :%s\"$$\n";
|
||||
I64 num fmtstr "$$DA-T,135,\"Bin Size :%04d\"$$\n";
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -97,8 +108,9 @@ class CEdPlaceAnchor
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Anchor Label :%s\"$$\n";
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide fmtstr "$$CB,\"Hide\"$$\n";
|
||||
Bool pop_up;
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide fmtstr "$$CB,\"Hide\"$$\n";
|
||||
};
|
||||
|
||||
class CEdBibleLink
|
||||
@@ -108,7 +120,8 @@ class CEdBibleLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Chapter Verse :%s\"$$\n";
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -119,7 +132,8 @@ class CEdDefLink
|
||||
U8 aux[136] fmtstr "$$DA-P,135,\"Word :%s\"$$\n";
|
||||
I64 num fmtstr "$$DA-T,135,\"Def Num :%4d\"$$\n";
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
@@ -130,13 +144,12 @@ class CEdProject
|
||||
U8 aux[136];
|
||||
I64 num;
|
||||
U8 html_link[136] fmtstr "$$DA-P,135,\"Html Link :%s\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool pop_up fmtstr "$$CB,\"PopUp\"$$\n";
|
||||
Bool quote fmtstr "$$CB,\"Quote\"$$\n";
|
||||
Bool hide;
|
||||
};
|
||||
|
||||
U8 *ctrl_L_footer="\n\n$$LK,\"Click for Help\",\"FI:::/TempleOS/Doc/CtrlL.TXT\"$$\n";
|
||||
|
||||
Bool PmtLink(I64 type,U8 **_tag,U8 **_link,Bool *_quote,U8 **_html_link)
|
||||
Bool PmtLink(I64 type,U8 **_tag,U8 **_link,Bool *_pop_up,Bool *_quote,U8 **_html_link)
|
||||
{
|
||||
I64 i;
|
||||
CEdFileLink *el=CAlloc(sizeof(CEdFileLink));
|
||||
@@ -316,6 +329,10 @@ Bool PmtLink(I64 type,U8 **_tag,U8 **_link,Bool *_quote,U8 **_html_link)
|
||||
*_html_link=StrNew(el->html_link);
|
||||
else
|
||||
*_html_link=NULL;
|
||||
if (el->pop_up)
|
||||
*_pop_up=TRUE;
|
||||
else
|
||||
*_pop_up=FALSE;
|
||||
if (el->quote)
|
||||
*_quote=TRUE;
|
||||
else
|
||||
@@ -326,11 +343,15 @@ Bool PmtLink(I64 type,U8 **_tag,U8 **_link,Bool *_quote,U8 **_html_link)
|
||||
|
||||
U0 EdInsLink()
|
||||
{
|
||||
U8 *tag=NULL,*link=NULL,*st=NULL,*html_link=NULL;
|
||||
Bool quote=FALSE;
|
||||
U8 *tag=NULL,*link=NULL,*st=NULL,*html_link=NULL,*pop_up_st;
|
||||
Bool pop_up=FALSE,quote=FALSE;
|
||||
I64 type=PopUpLinkType(TRUE);
|
||||
if (type>=0) {
|
||||
if (PmtLink(type,&tag,&link,"e,&html_link)) {
|
||||
if (PmtLink(type,&tag,&link,&pop_up,"e,&html_link)) {
|
||||
if (pop_up)
|
||||
pop_up_st="+PU";
|
||||
else
|
||||
pop_up_st="";
|
||||
switch (type) {
|
||||
case LK_PLACE_ANCHOR:
|
||||
if (html_link)
|
||||
@@ -340,9 +361,9 @@ U0 EdInsLink()
|
||||
break;
|
||||
default:
|
||||
if (html_link)
|
||||
st=MSPrintF("$$LK+HTML,\"%Q\",\"%Q\",\"%Q\"$$",tag,link,html_link);
|
||||
st=MSPrintF("$$LK%s+HTML,\"%Q\",\"%Q\",\"%Q\"$$",pop_up_st,tag,link,html_link);
|
||||
else
|
||||
st=MSPrintF("$$LK,\"%Q\",\"%Q\"$$",tag,link);
|
||||
st=MSPrintF("$$LK%s,\"%Q\",\"%Q\"$$",pop_up_st,tag,link);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -362,23 +383,12 @@ I64 PopUpColorType()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$MU,\"Foreground\",DOCT_FOREGROUND$$\n"
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Color Type Menu\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU,\"Foreground\",DOCT_FOREGROUND$$\n"
|
||||
"$$MU,\"Background\",DOCT_BACKGROUND$$\n"
|
||||
"$$MU,\"Default Foreground\",DOCT_DFT_FOREGROUND$$\n"
|
||||
"$$MU,\"Default Background\",DOCT_DFT_BACKGROUND$$\n"
|
||||
"$$MU,\"Alt Foreground\",DOCT_ALT_FOREGROUND$$\n"
|
||||
"$$MU,\"Link Foreground\",DOCT_LINK_FOREGROUND$$\n"
|
||||
"$$MU,\"Macro Foreground\",DOCT_MACRO_FOREGROUND$$\n"
|
||||
"$$MU,\"Anchor Foreground\",DOCT_ANCHOR_FOREGROUND$$\n"
|
||||
"$$MU,\"Hidden Foreground\",DOCT_HIDDEN_FOREGROUND$$\n"
|
||||
"$$MU,\"Tree Foreground\",DOCT_TREE_FOREGROUND$$\n"
|
||||
"$$MU,\"User Foreground\",DOCT_USER_FOREGROUND$$\n"
|
||||
"$$MU,\"Binary Foreground\",DOCT_BINARY_FOREGROUND$$\n"
|
||||
"$$MU,\"Keyword Foreground\",DOCT_KEYWORD_FOREGROUND$$\n"
|
||||
"$$MU,\"Keyword2 Foreground\",DOCT_KEYWORD2_FOREGROUND$$\n"
|
||||
"$$MU,\"Comment Foreground\",DOCT_COMMENT_FOREGROUND$$\n"
|
||||
"$$MU,\"Quote Foreground\",DOCT_QUOTE_FOREGROUND$$\n"
|
||||
"\n$$MU,\"CANCEL\",DOCM_CANCEL$$");
|
||||
"%s",ctrl_L_footer);
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -388,13 +398,15 @@ I64 PopUpPageSettingType()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$MU,\"Page Length\",DOCT_PAGE_LEN$$\n"
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Page Setting Menu\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU,\"Page Length\",DOCT_PAGE_LEN$$\n"
|
||||
"$$MU,\"Page Header\",DOCT_HEADER$$\n"
|
||||
"$$MU,\"Page Footer\",DOCT_FOOTER$$\n"
|
||||
"$$MU,\"Left Margin\",DOCT_LEFT_MARGIN$$\n"
|
||||
"$$MU,\"Right Margin\",DOCT_RIGHT_MARGIN$$\n"
|
||||
"$$MU,\"Lock To Page\",DOCT_LOCK_TO_PAGE$$\n"
|
||||
"$$MU,\"Lock To Center\",DOCT_LOCK_TO_CENTER$$\n");
|
||||
"$$MU,\"Lock To Center\",DOCT_LOCK_TO_CENTER$$\n"
|
||||
"%s",ctrl_L_footer);
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -491,7 +503,8 @@ I64 PopUpDollarType()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$MU,\"Link\",DOCT_LINK$$\n"
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Text Widget Menu\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU,\"Link\",DOCT_LINK$$\n"
|
||||
"$$MU,\"Text\",DOCT_TEXT$$\n"
|
||||
"$$MU,\"Tree Branch\",DOCT_TREE$$\n"
|
||||
"$$MU,\"Color\",DOCT_FOREGROUND$$\n"
|
||||
@@ -507,7 +520,7 @@ I64 PopUpDollarType()
|
||||
"$$MU,\"Syntax Highlighting\",DOCT_HIGHLIGHT$$\n"
|
||||
"$$MU,\"HTML\",DOCT_HTML_CODE$$\n"
|
||||
"$$MU,\"Song\",DOCT_SONG$$\n"
|
||||
"\n$$MU,\"CANCEL\",DOCM_CANCEL$$");
|
||||
"%s",ctrl_L_footer);
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -613,10 +626,10 @@ I64 PopUpHtmlType()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$MU,\"Html Code\",HT_CODE$$\n"
|
||||
DocPutS(doc,"$$FG,LTBLUE$$$$MU,\"Html Code\",HT_CODE$$\n"
|
||||
"$$MU,\"Html Image\",HT_IMAGE$$\n"
|
||||
"$$MU,\"Html Video\",HT_VIDEO$$\n"
|
||||
"\n$$MU,\"CANCEL\",DOCM_CANCEL$$");
|
||||
"\n$$MU,\"Abort\",DOCM_CANCEL$$");
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -953,7 +966,7 @@ U0 EdInsBinary(I64 bin_num,I64 type)
|
||||
"$$%Z+BP,\"%Q\",%d,\"%s,%d\"$$",type,"ST_DOC_CMDS",dt->tag,dt->bin_num,
|
||||
dt->bin_ptr_link_file,dt->bin_ptr_link_bin_num;
|
||||
} else {
|
||||
if (DocBinFindNum(DocCur,dt->bin_num))
|
||||
if (DocBinFindNum(DocPut,dt->bin_num))
|
||||
"$$%Z,\"%Q\",%d$$",type,"ST_DOC_CMDS",dt->tag,dt->bin_num;
|
||||
else
|
||||
PopUpOk("Invalid Binary Num");
|
||||
@@ -981,7 +994,7 @@ U0 EdInsTree()
|
||||
st=MSPrintF("%q",dt->label);
|
||||
st2=MSPrintF("$$TR%s,\"%Q\"$$\n$$ID,%d$$*\n$$ID,%d$$",
|
||||
buf,st,dt->indent,-dt->indent);
|
||||
DocInsSafe(DocCur,st2);
|
||||
DocInsSafe(DocPut,st2);
|
||||
Free(st);
|
||||
Free(st2);
|
||||
}
|
||||
@@ -990,7 +1003,7 @@ U0 EdInsTree()
|
||||
|
||||
U0 EdInsHidden()
|
||||
{
|
||||
DocInsSafe(DocCur,"$$HS$$*$$HE$$");
|
||||
DocInsSafe(DocPut,"$$HS$$*$$HE$$");
|
||||
}
|
||||
|
||||
U0 EdInsDollarCmd()
|
||||
@@ -1048,39 +1061,29 @@ U0 EdInsDollarCmd()
|
||||
}
|
||||
|
||||
#define PT_SPRITE 0
|
||||
#define PT_SPRITE_MACRO 1
|
||||
#define PT_SPRITE_MENU 2
|
||||
#define PT_SPRITE_LINK 3
|
||||
#define PT_SPRITE_PTR 4
|
||||
#define PT_SPRITE_SIZE 5
|
||||
#define PT_DUP_SPRITE 6
|
||||
#define PT_SPRITE_PTR 1
|
||||
#define PT_DUP_SPRITE 2
|
||||
#define PT_SPRITE_SIZE 3
|
||||
#define PT_SPRITE_MACRO 4
|
||||
#define PT_SPRITE_MENU 5
|
||||
#define PT_SPRITE_LINK 6
|
||||
#define PT_SPRITE_TYPE 7
|
||||
|
||||
I64 PopUpSpriteType()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"A sprite is composed of an ordered lst of elements\n"
|
||||
"such as lines and color changes. You can create an icon\n"
|
||||
"by placing a sprite with a payload of C+ code to execute.\n"
|
||||
"This is a called a \"sprite macro\". Check \"Pop-Up\" for\n"
|
||||
"icons and \"Esc\" for shelling-to-the-cmd-line macros.\n\n"
|
||||
"In a program, you first make a sprite. Then, you insert\n"
|
||||
"a pointer to it.\n\n"
|
||||
"$$MU,\"Insert just Sprite\",PT_SPRITE$$\n"
|
||||
DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Graphic Resource Menu\"$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/Resource.TXT.Z\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU,\"Make Sprite\",PT_SPRITE$$\n"
|
||||
"$$MU,\"Pointer to Sprite\",PT_SPRITE_PTR$$\n"
|
||||
"$$MU,\"Duplicate Sprite\",PT_DUP_SPRITE$$\n"
|
||||
"$$MU,\"Sprite Size (not really needed)\",PT_SPRITE_SIZE$$\n"
|
||||
"$$MU,\"Sprite Macro (Icon)\",PT_SPRITE_MACRO$$\n"
|
||||
"$$MU,\"Sprite Menu Item\",PT_SPRITE_MENU$$\n"
|
||||
"$$MU,\"Sprite Link\",PT_SPRITE_LINK$$\n"
|
||||
"$$MU,\"Pointer to Sprite\",PT_SPRITE_PTR$$\n"
|
||||
"$$MU,\"Sprite Size (not really needed)\",PT_SPRITE_SIZE$$\n"
|
||||
"$$MU,\"Duplicate Sprite\",PT_DUP_SPRITE$$\n"
|
||||
"\n$$MU,\"CANCEL\",DOCM_CANCEL$$\n\n"
|
||||
"The potential exists for binary data besides $$FG,GREEN$$sprites$$FG$$.\n"
|
||||
"This is why the pointer to a sprite is known as\n"
|
||||
"\"Insert Binary\". There is one more option called\n"
|
||||
"\"Insert Binary Type\". The only other binary data type is\n"
|
||||
"source line info in map files.\n\n"
|
||||
"$$MU,\"Insert Binary Data Type\",PT_SPRITE_TYPE$$\n");
|
||||
"$$MU,\"Binary Data Type (not needed)\",PT_SPRITE_TYPE$$\n"
|
||||
"\n$$MU,\"Abort\",DOCM_CANCEL$$\n\n");
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -1107,16 +1110,14 @@ class CEdMenuSprite
|
||||
Bool escape fmtstr "$$CB,\"Escape\"$$\n";
|
||||
};
|
||||
|
||||
U8 *EdSpriteLink(U8 **_html_link)
|
||||
U8 *EdSpriteLink(Bool *_pop_up,U8 **_html_link)
|
||||
{
|
||||
U8 *result=NULL,*tag=NULL,*link=NULL;
|
||||
Bool quote=FALSE;
|
||||
I64 type=PopUpLinkType(FALSE);
|
||||
*_html_link=NULL;
|
||||
if (type>=0) {
|
||||
if (PmtLink(type,&tag,&link,"e,_html_link))
|
||||
result=MSPrintF("\"%Q\",\"%Q\"",tag,link);
|
||||
}
|
||||
if (type>=0 && PmtLink(type,&tag,&link,_pop_up,"e,_html_link))
|
||||
result=MSPrintF("\"%Q\",\"%Q\"",tag,link);
|
||||
Free(tag);
|
||||
Free(link);
|
||||
return result;
|
||||
@@ -1125,6 +1126,7 @@ U8 *EdSpriteLink(U8 **_html_link)
|
||||
U8 *EdSprite(I64 bin_num)
|
||||
{
|
||||
I64 type=PopUpSpriteType;
|
||||
Bool pop_up;
|
||||
U8 *st,*st1=NULL,*st2=NULL,buf[1024],*html_link=NULL;
|
||||
CEdMacroSprite *dt=CAlloc(sizeof(CEdMacroSprite));
|
||||
*buf=0;
|
||||
@@ -1156,7 +1158,9 @@ U8 *EdSprite(I64 bin_num)
|
||||
break;
|
||||
case PT_SPRITE_LINK:
|
||||
StrCat(buf,"+L+A");
|
||||
st1=EdSpriteLink(&html_link);
|
||||
st1=EdSpriteLink(&pop_up,&html_link);
|
||||
if (pop_up)
|
||||
StrCat(buf,"+PU");
|
||||
break;
|
||||
case PT_SPRITE_PTR:
|
||||
EdInsBinary(--bin_num,DOCT_INS_BINARY);
|
||||
|
||||
+44
-37
@@ -8,6 +8,8 @@ public Bool DocLineNumGoTo(CDoc *doc,I64 line_num) //one based
|
||||
doc->y=line_num-1;
|
||||
DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR);
|
||||
DocCenter(doc);
|
||||
if (doc->cur_entry->y==line_num-1)
|
||||
result=TRUE;
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
}
|
||||
@@ -124,7 +126,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
|
||||
cc<doc_ce->max_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -143,7 +145,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
|
||||
cc>doc_ce->min_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -186,7 +188,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
|
||||
cc>doc_ce->min_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -246,7 +248,7 @@ public U0 EdCursorRight(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
|
||||
cc>doc_ce->min_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -276,7 +278,7 @@ public U0 EdCursorRight(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) &&
|
||||
cc<doc_ce->max_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | old_color & -0x100;
|
||||
doc_ne->flags1=old_flags1;
|
||||
doc_ne->flags2=old_flags2;
|
||||
@@ -358,7 +360,7 @@ public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc_ce->min_col<doc->cur_data_col<doc_ce->max_col-1) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -456,7 +458,7 @@ public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT) && doc_ce->x<x) {
|
||||
if (doc->cur_data_col<doc_ce->max_col-1) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -513,7 +515,7 @@ public U0 EdLineDown(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT)&&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc->cur_data_col>doc_ce->min_col && doc->cur_data_col<doc_ce->max_col-1) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=doc_ce->type;
|
||||
doc_ne->flags1=doc_ce->flags1;
|
||||
doc_ne->flags2=doc_ce->flags2;
|
||||
@@ -590,7 +592,7 @@ public U0 EdLineDown(CDoc *doc,I64 sc=MIN_I64)
|
||||
!(doc_ce->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_ce->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc_ce->min_col<doc->cur_data_col<doc_ce->max_col-1) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | old_color & -0x100;
|
||||
doc_ne->flags1=old_flags1;
|
||||
doc_ne->flags2=old_flags2;
|
||||
@@ -717,7 +719,7 @@ U0 EdInsChar(I64 ch,I64 sc,CDoc *doc)
|
||||
goto ic_done;
|
||||
}
|
||||
}
|
||||
if (ch==CH_CARRIAGE_RETURN) goto ic_done;
|
||||
if (ch=='\r') goto ic_done;
|
||||
|
||||
ic_cont:
|
||||
if ((ch==CH_SPACE || ch=='\n') &&
|
||||
@@ -792,7 +794,7 @@ ic_overstrike_char:
|
||||
b=MAlloc(2,doc->mem_task);
|
||||
*b=ch;
|
||||
b[1]=0;
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
doc_ne->tag=b;
|
||||
doc_ne->max_col=1;
|
||||
@@ -862,7 +864,7 @@ ic_form_tab:
|
||||
b=MAlloc(2,doc->mem_task);
|
||||
*b=ch;
|
||||
b[1]=0;
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
doc_ne->tag=b;
|
||||
doc_ne->max_col=1;
|
||||
@@ -973,7 +975,10 @@ public U0 EdFindNext(CDoc *doc)
|
||||
}
|
||||
}
|
||||
fn_skip:
|
||||
doc_e= doc->find_replace->scan_fwd ? doc_e->next:doc_e->last;
|
||||
if (doc->find_replace->scan_fwd)
|
||||
doc_e=doc_e->next;
|
||||
else
|
||||
doc_e=doc_e->last;
|
||||
} while (doc_e!=doc_ce);
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
@@ -1475,8 +1480,7 @@ U0 DocEntryToggle(CDoc *doc)
|
||||
U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)
|
||||
{
|
||||
Bool unlock=DocLock(doc);
|
||||
I64 size,start_text_attr=doc->start_text_attr,
|
||||
flags=doc->flags^tog_flags;
|
||||
I64 size,flags=doc->flags^tog_flags;
|
||||
U8 *st=DocSave(doc,&size);
|
||||
CDocUndo *u_next,*u_last;
|
||||
|
||||
@@ -1485,7 +1489,6 @@ U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)
|
||||
doc->undo_root.next=doc->undo_root.last=&doc->undo_root;
|
||||
|
||||
DocRst(doc,TRUE);
|
||||
doc->start_text_attr=start_text_attr;
|
||||
doc->undo_root.next=u_next;
|
||||
doc->undo_root.last=u_last;
|
||||
DocUndoCntSet(doc);
|
||||
@@ -1506,7 +1509,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
U8 *st,*st2;
|
||||
Bool unlock;
|
||||
|
||||
if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
return;
|
||||
if (doc->user_put_key)
|
||||
if ((*doc->user_put_key)(doc,doc->user_put_data,ch,sc))
|
||||
@@ -1590,7 +1593,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
doc_ce=doc->cur_entry=doc_ce->last;
|
||||
if (doc_ce!=doc && doc_ce->type_u8==DOCT_SOFT_NEW_LINE)
|
||||
doc_ce=doc->cur_entry=doc_ce->last;
|
||||
if (doc_ce==doc || doc_ce->type_u8==DOCT_USER_FOREGROUND) {
|
||||
if (doc_ce==doc || doc_ce->type_u8==DOCT_PMT) {
|
||||
doc_ce=doc->cur_entry=doc_ce->next;
|
||||
doc->cur_data_col=doc_ce->min_col;
|
||||
} else {
|
||||
@@ -1803,7 +1806,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
else
|
||||
SetKeyDesc("Edit/Autocomplete Word");
|
||||
} else {
|
||||
if (WordStat) {
|
||||
if (WordStat(ON)) {
|
||||
DocUnlock(doc);
|
||||
if (sc&SCF_SHIFT)
|
||||
WSDDef(ch-'0',Fs);
|
||||
@@ -1869,7 +1872,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
else
|
||||
SetKeyDesc("Edit/Autocomplete Sym");
|
||||
} else {
|
||||
if (WordStat) {
|
||||
if (WordStat(ON)) {
|
||||
DocUnlock(doc);
|
||||
if (sc&SCF_SHIFT)
|
||||
WSMan(sc2-SC_F1+1,Fs);
|
||||
@@ -1961,6 +1964,13 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
DocWrite(doc);
|
||||
st=StrNew(doc->filename.name);
|
||||
}
|
||||
if (st2=DirFile(st,"Run","CPP.Z")) {
|
||||
if (FileFind(st2)) {
|
||||
Free(st);
|
||||
st=st2;
|
||||
} else
|
||||
Free(st2);
|
||||
}
|
||||
if (st) {
|
||||
if (sc&SCF_SHIFT)
|
||||
AdamFile(st);
|
||||
@@ -2195,19 +2205,16 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc)
|
||||
Yield;
|
||||
}
|
||||
|
||||
U0 DocNewLine(CDoc *doc=NULL,I64 cnt=1)
|
||||
{
|
||||
while (cnt-->0)
|
||||
DocPutKey(doc,'\n',0);
|
||||
}
|
||||
|
||||
Bool AKDDocPutKey(I64 ch,I64 scancode)
|
||||
{
|
||||
CDoc *doc;
|
||||
doc=Fs->next_doc;
|
||||
while (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) && doc->flags&DOCF_AUX_DOC && !doc->best_d) {
|
||||
DocPutKey(doc,ch,scancode);
|
||||
return FALSE;
|
||||
}
|
||||
doc=doc->next_doc;
|
||||
}
|
||||
if (doc=DocCur)
|
||||
if (doc=DocPut)
|
||||
DocPutKey(doc,ch,scancode);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -2261,7 +2268,7 @@ public U0 DocPutSPartial(CDoc *doc,U8 *st)
|
||||
Free(doc_ce->tag);
|
||||
doc_ce->tag=b;
|
||||
} else {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
doc_ne->tag=MAlloc(j+1,doc->mem_task);
|
||||
MemCpy(doc_ne->tag,ptr2,j+1);
|
||||
@@ -2287,12 +2294,11 @@ public U0 DocPutSPartial(CDoc *doc,U8 *st)
|
||||
Bool DocFileEd(I64 type,U8 *filename,
|
||||
U8 *pattern,I64 *_num,I64 ed_flags)
|
||||
{
|
||||
I64 flags=0,i;
|
||||
I64 flags=0,i,old_border_src=Fs->border_src;
|
||||
CDocEntry *doc_e;
|
||||
CDoc *doc;
|
||||
Bool old_silent=Bt(&Fs->display_flags,DISPLAYf_SILENT),
|
||||
result=FALSE;
|
||||
|
||||
result=FALSE;
|
||||
try {
|
||||
switch (type) {
|
||||
case LK_PLAIN:
|
||||
@@ -2315,7 +2321,7 @@ Bool DocFileEd(I64 type,U8 *filename,
|
||||
flags|=DOCF_ALLOW_UNDO;
|
||||
|
||||
if (!*filename)
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
else {
|
||||
Silent(ON);
|
||||
if (Bt(&ed_flags,EDf_BAIL)) //if bail, scan parents
|
||||
@@ -2326,7 +2332,7 @@ Bool DocFileEd(I64 type,U8 *filename,
|
||||
doc=DocRead(filename,flags);
|
||||
StrCpy(doc->desc,"Edit");
|
||||
Silent(old_silent);
|
||||
doc->flags|=DOCF_ATTR_BY_FILENAME;
|
||||
Fs->border_src=BDS_ED_FILENAME_PRT;
|
||||
}
|
||||
|
||||
if (Bt(&ed_flags,EDf_COLLAPSE))
|
||||
@@ -2360,7 +2366,7 @@ Bool DocFileEd(I64 type,U8 *filename,
|
||||
DocUnlock(doc);
|
||||
DocWrite(doc);
|
||||
}
|
||||
if (Fs->last_doc!=doc)
|
||||
if (DocPut!=doc)
|
||||
DocDel(doc);
|
||||
else
|
||||
result=FALSE;
|
||||
@@ -2368,6 +2374,7 @@ Bool DocFileEd(I64 type,U8 *filename,
|
||||
Silent(old_silent);
|
||||
result=FALSE;
|
||||
}
|
||||
Fs->border_src=old_border_src;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL)
|
||||
break;
|
||||
case DOCT_NEW_LINE:
|
||||
if (doc->flags&DOCF_CARRIAGE_RETURN)
|
||||
*dst++=CH_CARRIAGE_RETURN;
|
||||
*dst++='\r';
|
||||
*dst++='\n';
|
||||
break;
|
||||
default:
|
||||
@@ -152,7 +152,6 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL)
|
||||
*dst++='$$';
|
||||
Free(st);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -200,7 +199,7 @@ public U0 DocInsDoc(CDoc *doc,CDoc *doc2)
|
||||
if (doc->cur_entry->type_u8==DOCT_TEXT &&
|
||||
doc->cur_data_col>doc->cur_entry->min_col) {
|
||||
if (doc->cur_data_col<doc->cur_entry->max_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT | doc->cur_entry->type & 0xFFFFFF00;
|
||||
doc_ne->flags1=doc->cur_entry->flags1;
|
||||
doc_ne->flags2=doc->cur_entry->flags2;
|
||||
@@ -424,32 +423,43 @@ U0 DocUndoRestore(CDoc *doc)
|
||||
DocUnlock(doc);
|
||||
}
|
||||
|
||||
#help_index "Graphics/Windows BMP Files;Doc/Output"
|
||||
|
||||
#help_index "File/Cmd Line (Typically);Doc/Cmd Line (Typically);Cmd Line (Typically)"
|
||||
|
||||
public Bool Type(U8 *fname)
|
||||
//Output a file to the cmd line.
|
||||
//Even graphics and macros will be sent.
|
||||
{
|
||||
CDoc *doc,*doc2;
|
||||
if (doc=DocCur) {
|
||||
if (FilesFindMatch(FILENAME_MASK_TXT,fname)) {
|
||||
doc2=DocRead(fname);
|
||||
DocInsDoc(doc,doc2);
|
||||
DocDel(doc2);
|
||||
return TRUE;
|
||||
} else if (FilesFindMatch("*.BMP.Z",fname)) {
|
||||
DocPutBMPFile(doc,fname,FALSE);
|
||||
return TRUE;
|
||||
} else if (FilesFindMatch("*.BMP;*.bmp",fname)) {
|
||||
DocPutBMPFile(doc,fname,TRUE);
|
||||
return TRUE;
|
||||
} else if (FilesFindMatch("*.GRA*",fname)) {
|
||||
DocPutGRAFile(doc,fname);
|
||||
return TRUE;
|
||||
}
|
||||
public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1)
|
||||
{//This is like DOS "type" or Unix "cat".
|
||||
//Output a file to a document.
|
||||
//Even graphics can be sent.
|
||||
Bool result=FALSE;
|
||||
CDoc *doc2;
|
||||
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
return FALSE;
|
||||
if (FilesFindMatch(FILENAME_MASK_TXT,filename)) {
|
||||
doc2=DocRead(filename);
|
||||
DocInsDoc(doc,doc2);
|
||||
DocDel(doc2);
|
||||
result=TRUE;
|
||||
} else if (FilesFindMatch("*.BMP.Z",filename)) {
|
||||
DocPutBMPFile(doc,filename,FALSE);
|
||||
result=TRUE;
|
||||
} else if (FilesFindMatch("*.BMP;*.bmp",filename)) {
|
||||
DocPutBMPFile(doc,filename,TRUE);
|
||||
result=TRUE;
|
||||
} else if (FilesFindMatch("*.GRA*",filename)) {
|
||||
DocPutGRAFile(doc,filename);
|
||||
result=TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
if (result)
|
||||
DocNewLine(doc,trailing_new_lines);
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Windows BMP Files;File/Cmd Line (Typically);Doc/Cmd Line (Typically);Cmd Line (Typically)"
|
||||
|
||||
public Bool Type(U8 *filename,I64 trailing_new_lines=1)
|
||||
{//This is like DOS "type" or Unix "cat".
|
||||
//Output a file to the cmd line.
|
||||
//Even graphics can be sent.
|
||||
return DocType(,filename,trailing_new_lines);
|
||||
}
|
||||
|
||||
#help_index "Doc"
|
||||
@@ -10,7 +10,7 @@ DocHighlightInit;
|
||||
|
||||
U32 *DocHighlight(CDoc *doc,Bool full_refresh,CDocEntry *doc_e,CDocSettings **_s,
|
||||
U8 *src,I64 len,I64 _temp_u32_attr)
|
||||
{ //Be aware of $LK-A,"::/TempleOS/Adam/ToHtml.CPP"$.
|
||||
{ //Be aware of $LK-A,"::/TempleOS/Adam/Utils/ToHtml.CPP"$.
|
||||
U32 *result=MAlloc((len+1)*sizeof(U32)),*dst=result;
|
||||
U8 *ptr,ch,ch1,last_ch;
|
||||
CDocSettings *s=*_s;
|
||||
@@ -28,13 +28,13 @@ hl_normal:
|
||||
case '/':
|
||||
if (len>=2) {
|
||||
if (*src=='/') {
|
||||
temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr;
|
||||
*dst++=ch1+temp_u32_attr;
|
||||
*dst++=*src++ +temp_u32_attr;
|
||||
len-=2;
|
||||
goto hl_cpp_comment;
|
||||
} else if (*src=='*') {
|
||||
temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr;
|
||||
*dst++=ch1+temp_u32_attr;
|
||||
*dst++=*src++ +temp_u32_attr;
|
||||
len-=2;
|
||||
@@ -44,30 +44,30 @@ hl_normal:
|
||||
}
|
||||
break;
|
||||
case '\'':
|
||||
temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr;
|
||||
*dst++=ch1+temp_u32_attr;
|
||||
len--;
|
||||
goto hl_single_quote;
|
||||
case '\"':
|
||||
temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr;
|
||||
*dst++=ch1+temp_u32_attr;
|
||||
len--;
|
||||
goto hl_dbl_quote;
|
||||
case '(':
|
||||
if (paren_depth++&1)
|
||||
temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr;
|
||||
break;
|
||||
case ')':
|
||||
if (--paren_depth&1)
|
||||
temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr;
|
||||
break;
|
||||
case '{':
|
||||
if (brace_depth++&1)
|
||||
temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr;
|
||||
break;
|
||||
case '}':
|
||||
if (--brace_depth&1)
|
||||
temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr;
|
||||
break;
|
||||
}
|
||||
*dst++=ch1+temp_u32_attr;
|
||||
@@ -82,9 +82,9 @@ hl_normal:
|
||||
*src=0;
|
||||
if (temph=HashFind(ptr,doc_hash,HTT_KEYWORD|HTT_ASM_KEYWORD|HTT_OPCODE|HTT_REG)) {
|
||||
if (temph->type&(HTT_KEYWORD|HTT_ASM_KEYWORD|HTT_OPCODE))
|
||||
temp_u32_attr=(s->keyword_attr&15) <<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_KEYWORD<<8|mask_temp_u32_attr;
|
||||
else
|
||||
temp_u32_attr=(s->keyword2_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_KEYWORD2<<8|mask_temp_u32_attr;
|
||||
} else
|
||||
temp_u32_attr=_temp_u32_attr;
|
||||
while (ch1=*ptr++)
|
||||
@@ -106,7 +106,7 @@ hl_normal_done:
|
||||
}
|
||||
break;
|
||||
case DOCSS_SINGLE_QUOTE:
|
||||
temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr;
|
||||
hl_single_quote:
|
||||
last_ch=0;
|
||||
while (len--) {
|
||||
@@ -133,7 +133,7 @@ hl_single_quote:
|
||||
}
|
||||
break;
|
||||
case DOCSS_DBL_QUOTE:
|
||||
temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr;
|
||||
hl_dbl_quote:
|
||||
last_ch=0;
|
||||
while (len--) {
|
||||
@@ -160,7 +160,7 @@ hl_dbl_quote:
|
||||
}
|
||||
break;
|
||||
case DOCSS_COMMENT:
|
||||
temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr;
|
||||
comment_depth=s->comment_depth;
|
||||
hl_comment:
|
||||
last_ch=0;
|
||||
@@ -188,7 +188,7 @@ hl_comment:
|
||||
}
|
||||
break;
|
||||
case DOCSS_CPP_Z_COMMENT:
|
||||
temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr;
|
||||
temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr;
|
||||
hl_cpp_comment:
|
||||
while (len--)
|
||||
*dst++=*src++ +temp_u32_attr;
|
||||
|
||||
@@ -78,7 +78,7 @@ U0 WatchLocals()
|
||||
if (!TaskValidate(dbg_task=task->dbg_task))
|
||||
Exit;
|
||||
DocDblBufStart;
|
||||
if (doc=DocCur(dbg_task)) {
|
||||
if (doc=DocPut(dbg_task)) {
|
||||
if (tempf=DbgFunFind(doc,0)) {
|
||||
"$$WW,1$$";
|
||||
rbp=task->rbp;
|
||||
@@ -145,7 +145,7 @@ public U0 IDE(U8 *filename)
|
||||
SetWinVert(2,TEXT_ROWS-2);
|
||||
LBts(&Fs->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP);
|
||||
|
||||
task=Spawn(&UserCmdLine,NULL,"Debug",Fs);
|
||||
task=Spawn(&UserCmdLine,NULL,"Debug",,Fs);
|
||||
TaskWait(task);
|
||||
SetWinHorz(TEXT_COLS>>1+1,TEXT_COLS-2,task);
|
||||
SetWinVert(12,TEXT_ROWS-2,task);
|
||||
@@ -153,7 +153,7 @@ public U0 IDE(U8 *filename)
|
||||
|
||||
Fs->dbg_task=task;
|
||||
|
||||
task=Spawn(&UserCmdLine,NULL,"Watch",Fs);
|
||||
task=Spawn(&UserCmdLine,NULL,"Watch",,Fs);
|
||||
TaskWait(task);
|
||||
SetWinHorz(TEXT_COLS>>1+1,TEXT_COLS-2,task);
|
||||
SetWinVert(2,10,task);
|
||||
@@ -405,12 +405,12 @@ U0 IDEEdTask(I64)
|
||||
CDoc *doc;
|
||||
CBpt *tempb;
|
||||
if (rip_filename=SrcFileName(rip)) {
|
||||
ed_task=Spawn(&UserCmdLine,NULL,"Debug",task);
|
||||
ed_task=Spawn(&UserCmdLine,NULL,"Debug",,task);
|
||||
TaskWait(ed_task);
|
||||
st=MSPrintF("Preempt(OFF);Ed(\"%s\");\n",rip_filename);
|
||||
XTalkWait(ed_task,st);
|
||||
Free(st);
|
||||
doc=DocCur(ed_task);
|
||||
doc=DocPut(ed_task);
|
||||
if (TaskValidate(dbg_task=task->dbg_task)) {
|
||||
SetWinHorz(dbg_task->win_left,dbg_task->win_right, ed_task);
|
||||
SetWinVert(dbg_task->win_top, dbg_task->win_bottom,ed_task);
|
||||
@@ -444,7 +444,7 @@ U0 IDEResumeDbg()
|
||||
CIDE *tempi=NamedFramePtr("IDEFrame",dbg_task);
|
||||
U8 *opcode;
|
||||
if (!tempi) {
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs);
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs);
|
||||
Suspend(Fs);
|
||||
} else
|
||||
switch (tempi->type) {
|
||||
@@ -454,19 +454,19 @@ U0 IDEResumeDbg()
|
||||
LBtr(&Fs->rflags,RFLAGf_TRAP);
|
||||
if (Fs->rip==tempi->cur_line) {//Jmp to self
|
||||
tempi->cur_line=NULL;
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs);
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs);
|
||||
Suspend(Fs);
|
||||
} else
|
||||
tempi->cur_line=NULL;
|
||||
} else {
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs);
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs);
|
||||
Suspend(Fs);
|
||||
}
|
||||
break;
|
||||
case IDET_STEP_INTO:
|
||||
if (!tempi->cur_line ||
|
||||
Fs->rip<tempi->cur_line || Fs->rip>=tempi->next_line) {
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs);
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs);
|
||||
Suspend(Fs);
|
||||
} else
|
||||
Suspend(Fs,FALSE);
|
||||
@@ -481,7 +481,7 @@ U0 IDEResumeDbg()
|
||||
}
|
||||
if (!tempi->cur_line ||
|
||||
Fs->rip<tempi->cur_line || Fs->rip>=tempi->next_line) {
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs);
|
||||
Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs);
|
||||
Suspend(Fs);
|
||||
} else {
|
||||
opcode=Fs->rip;
|
||||
|
||||
@@ -3,20 +3,20 @@ StrCpy(captured_macro_name,"Test");
|
||||
|
||||
I64 sys_macro_repeat_n=1;
|
||||
|
||||
U0 SysMacroStripKey(CTaskCmd *macro_root,I64 p1,I64 p2)
|
||||
U0 SysMacroStripKey(CSrvCmd *macro_root,I64 p1,I64 p2)
|
||||
{
|
||||
CTaskCmd *tempc,*tempc1;
|
||||
CSrvCmd *tempc,*tempc1;
|
||||
tempc=macro_root->next;
|
||||
while (tempc!=macro_root) {
|
||||
tempc1=tempc->next;
|
||||
if (tempc->cmd_code==TASKCT_MSG &&
|
||||
if (tempc->cmd_code==SVCT_MSG &&
|
||||
(tempc->msg_code==MSG_KEY_DOWN ||
|
||||
tempc->msg_code==MSG_KEY_UP ||
|
||||
tempc->msg_code==MSG_KEY_DOWN_UP) &&
|
||||
p1 && tempc->p1==p1 ||
|
||||
!p1 && tempc->p2==p2) {
|
||||
p1 && tempc->aux1==p1 ||
|
||||
!p1 && tempc->aux2==p2) {
|
||||
QueRem(tempc);
|
||||
Free(tempc);
|
||||
SrvCmdDel(tempc);
|
||||
}
|
||||
tempc=tempc1;
|
||||
}
|
||||
@@ -33,27 +33,27 @@ class CMacroTemp
|
||||
U8 buf[136];
|
||||
};
|
||||
|
||||
CMacroTemp *Cmd2MT(CTaskCmd *tempc)
|
||||
CMacroTemp *Cmd2MT(CSrvCmd *tempc)
|
||||
{
|
||||
U8 buf[8];
|
||||
CMacroTemp *tempmt=CAlloc(sizeof(CMacroTemp));
|
||||
if (Bt(getkey_chars_bitmap,tempc->p1) && tempc->msg_code==MSG_KEY_DOWN) {
|
||||
if (Bt(getkey_chars_bitmap,tempc->aux1) && tempc->msg_code==MSG_KEY_DOWN) {
|
||||
tempmt->type=MT_CHAR;
|
||||
buf[0]=tempc->p1;
|
||||
buf[0]=tempc->aux1;
|
||||
buf[1]=0;
|
||||
SPrintF(tempmt->buf,"%Q",buf);
|
||||
} else {
|
||||
tempmt->type=MT_MSG;
|
||||
SPrintF(tempmt->buf,"Msg(0x%X,0x%X,0x%X);",
|
||||
tempc->msg_code,tempc->p1,tempc->p2);
|
||||
tempc->msg_code,tempc->aux1,tempc->aux2);
|
||||
}
|
||||
return tempmt;
|
||||
}
|
||||
|
||||
|
||||
U8 *SysMacro2Str(CTaskCmd *macro_root)
|
||||
U8 *SysMacro2Str(CSrvCmd *macro_root)
|
||||
{
|
||||
CTaskCmd *tempc;
|
||||
CSrvCmd *tempc;
|
||||
I64 cnt=1; //terminating zero
|
||||
U8 *ptr,*m;
|
||||
CMacroTemp *tempmt,*tempmt1,root;
|
||||
@@ -147,7 +147,7 @@ U0 EdInsCapturedMacro()
|
||||
I64 PopUpExitRecordPlayStopIns()
|
||||
{
|
||||
U8 buf[136];
|
||||
CTaskCmd *tempc;
|
||||
CSrvCmd *tempc;
|
||||
CDoc *doc=DocNew;
|
||||
CDocEntry *doc_e=DocPutS(doc,"$$DA-P,135,\"Name:%s\"$$");
|
||||
I64 result=0;
|
||||
@@ -166,12 +166,12 @@ I64 PopUpExitRecordPlayStopIns()
|
||||
"\n\n\n$$FG,GREEN$$SHIFT-F2$$FG$$ will play macro.\n");
|
||||
doc->flags|=DOCF_MIN_SIZE | DOCF_FORM;
|
||||
SPrintF(buf,"DocMenuDo(0x%X);",doc);
|
||||
sys_macro_util_task=Spawn(&ServantUserCmdLine,NULL,"Macro Popup",Fs);
|
||||
sys_macro_util_task=Spawn(&SrvUserCmdLine,NULL,"Macro Popup",,Fs);
|
||||
Fs->popup_task=sys_macro_util_task;
|
||||
LBts(&sys_macro_util_task->display_flags,DISPLAYf_WIN_ON_TOP);
|
||||
tempc=TaskRqstQue(sys_macro_util_task,Fs,buf,
|
||||
1<<TASKCf_WAKE_MASTER | 1<<TASKCf_FOCUS_MASTER);
|
||||
GetRqstResult(tempc,&result);
|
||||
tempc=TaskExeStrQue(sys_macro_util_task,Fs,buf,
|
||||
1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
ScanResult(tempc,&result);
|
||||
Fs->popup_task=NULL;
|
||||
Kill(sys_macro_util_task);
|
||||
sys_macro_util_task=NULL;
|
||||
|
||||
@@ -58,10 +58,9 @@ public Bool Plain(U8 *filename)
|
||||
public Bool DocLinkChk(U8 *link_st)
|
||||
{
|
||||
U8 *filename;
|
||||
I64 num;
|
||||
Bool result=FALSE;
|
||||
if (link_st) {
|
||||
switch (EdLinkCvt(link_st,&filename,,&num)) {
|
||||
switch (EdLinkCvt(link_st,&filename)) {
|
||||
case -1:
|
||||
break;
|
||||
case LK_FILE_LINE:
|
||||
@@ -108,70 +107,68 @@ public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL)
|
||||
}
|
||||
|
||||
#help_index "Doc/Task"
|
||||
public CDoc *SysAuxDocInit()
|
||||
public CDoc *SysBorderDocInit()
|
||||
{
|
||||
CDocEntry *doc_e;
|
||||
CDoc *aux,*doc=DocCur;
|
||||
CDoc *bdoc,*doc=DocPut;
|
||||
|
||||
aux=DocNew;
|
||||
aux->flags|=DOCF_AUX_DOC;
|
||||
bdoc=DocNew;
|
||||
bdoc->flags|=DOCF_BORDER_DOC;
|
||||
|
||||
if (doc) {
|
||||
DocPutS(aux,"$$CM+H+BY+RX+NC,-7,1$$");
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
DocPutS(bdoc,"$$CM+H+BY+RX+NC,-7,1$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdFilterCB;
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdOverStrikeCB;
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdDollarCB;
|
||||
}
|
||||
|
||||
DocPutS(aux,"$$CM+H+BY+RX+NC,-4,1$$");
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
DocPutS(bdoc,"$$CM+H+BY+RX+NC,-4,1$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->tag_cb=&EdQuotesCB;
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->tag_cb=&EdBracesCB;
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->tag_cb=&EdSemicolonCB;
|
||||
|
||||
if (doc) {
|
||||
DocPutS(aux,"$$CM+H+BY+RX+NC,-18,1$$");
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
DocPutS(bdoc,"$$CM+H+BY+RX+NC,-18,1$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdMoreCB;
|
||||
doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdDollarTypeCB;
|
||||
}
|
||||
|
||||
if (Fs->user_num)
|
||||
DocPrintF(aux,"$$CM+H+TY+LX+NC,5,-1$$$$TX+H+BD,\"#%d\"$$",Fs->user_num);
|
||||
DocPutS(aux,"$$CM+H+TY+NC,0,-1$$");
|
||||
doc_e=DocPutS(aux,"$$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$");
|
||||
DocPrintF(bdoc,"$$CM+H+TY+LX+NC,5,-1$$$$TX+H+BD,\"#%d\"$$",Fs->user_num);
|
||||
DocPutS(bdoc,"$$CM+H+TY+NC,0,-1$$");
|
||||
doc_e=DocPutS(bdoc,"$$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$");
|
||||
doc_e->data=&Fs->task_title;
|
||||
DocDataFmt(doc_e);
|
||||
DocPrintF(aux,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs);
|
||||
aux->settings_root.dft_text_attr=Fs->border_attr;
|
||||
DocPrintF(bdoc,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs);
|
||||
if (Bt(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN))
|
||||
DocPutS(aux,"$$TX+H+RX+BD,\"[X]\"$$");
|
||||
DocPutS(aux,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$");
|
||||
return aux;
|
||||
DocPutS(bdoc,"$$TX+H+RX+BD,\"[X]\"$$");
|
||||
DocPutS(bdoc,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$");
|
||||
return bdoc;
|
||||
}
|
||||
|
||||
public U0 UseTermDoc()
|
||||
{
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
CDoc *doc=DocNew;
|
||||
doc->start_text_attr=WHITE<<4+BLUE;
|
||||
DocQueIns(doc,Fs->last_doc);
|
||||
doc->right_click_link=&TermRightClickLink;
|
||||
doc->max_entries=4096;
|
||||
doc->flags|=DOCF_ATTR_BY_PRT;
|
||||
Fs->border_src=BDS_CUR_PRT;
|
||||
StrCpy(doc->desc,"Term");
|
||||
DocQueInsRev(SysAuxDocInit,Fs->next_doc);
|
||||
Fs->put_doc=Fs->display_doc=doc;
|
||||
Fs->border_doc=SysBorderDocInit;
|
||||
Fs->cur_menu=MenuFile("::/TempleOS/Doc/EdPullDown.TXT");
|
||||
WinScrollsInit(Fs);
|
||||
Preempt(old_preempt);
|
||||
@@ -219,7 +216,7 @@ public U8 *DocGetLine(CDoc *doc,CDocEntry *doc_e,I64 *cur_col=NULL,CDocEntry **_
|
||||
}
|
||||
|
||||
#help_index "Doc/Output"
|
||||
public U0 DocDump(CDoc *doc,I64 uS_delay=0)
|
||||
U0 DocDump(CDoc *doc,I64 uS_delay=0)
|
||||
{
|
||||
U8 *st;
|
||||
CDocEntry *doc_e,*doc_e2;
|
||||
@@ -240,10 +237,14 @@ public U0 DocDump(CDoc *doc,I64 uS_delay=0)
|
||||
DocUnlock(doc);
|
||||
}
|
||||
|
||||
public CDocEntry *DocPutLine(CDocEntry *doc_e)
|
||||
public CDocEntry *DocPutLine(CDoc *doc=NULL,CDocEntry *doc_e)
|
||||
{
|
||||
U8 ch,*ptr,*ptr2;
|
||||
while (doc_e->type_u8!=DOCT_ERROR && doc_e->type_u8!=DOCT_NEW_LINE) {
|
||||
Bool unlock;
|
||||
if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
return NULL;
|
||||
unlock=DocLock(doc);
|
||||
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {
|
||||
if (Bt(doc_tag_types,doc_e->type_u8)) {
|
||||
ptr=doc_e->tag;
|
||||
do {
|
||||
@@ -266,7 +267,11 @@ public CDocEntry *DocPutLine(CDocEntry *doc_e)
|
||||
doc_e=doc_e->next;
|
||||
}
|
||||
NewLine;
|
||||
return doc_e->type_u8==DOCT_ERROR ? doc_e:doc_e->next;
|
||||
if (doc_e!=doc)
|
||||
doc_e=doc_e->next;
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
return doc_e;
|
||||
}
|
||||
|
||||
#help_index "Doc/Input"
|
||||
@@ -278,29 +283,19 @@ public U8 *DocMGetS(I64 flags=0)
|
||||
Bool old_preempt=IsPreempt;
|
||||
U8 *st,*result;
|
||||
I64 ch,sc;
|
||||
"$$FU$$";
|
||||
"$$PT$$";
|
||||
do {
|
||||
ch=DocGetKey(&sc);
|
||||
if (ch==CH_ESC) {
|
||||
doc=Fs->next_doc;
|
||||
while (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (doc=DocPut) {
|
||||
DocLock(doc);
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) &&
|
||||
(!doc->best_d || !(doc->flags&DOCF_AUX_DOC)) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL && doc->cur_entry!=doc) {
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL && doc->cur_entry!=doc) {
|
||||
doc_e=DocEntryCopy(doc,doc->cur_entry);
|
||||
if (doc->flags&DOCF_AUX_DOC && DocCur)
|
||||
DocBottom;
|
||||
else
|
||||
DocBottom(doc);
|
||||
DocBottom(doc);
|
||||
DocEntryRun(doc,doc_e,TRUE);
|
||||
DocEntryDel(doc,doc_e);
|
||||
DocUnlock(doc);
|
||||
break;
|
||||
}
|
||||
DocUnlock(doc);
|
||||
doc=doc->next_doc;
|
||||
}
|
||||
if (flags&GETSF_WITH_NEW_LINE)
|
||||
break;
|
||||
@@ -316,12 +311,12 @@ public U8 *DocMGetS(I64 flags=0)
|
||||
} while (flags&GETSF_WITH_NEW_LINE || ch!='\n' || sc & SCF_CTRL && sc & SCF_SHIFT);
|
||||
|
||||
Preempt(OFF);
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
DocLock(doc);
|
||||
if (flags&GETSF_WITH_NEW_LINE) {
|
||||
doc_e=doc->cur_entry;
|
||||
do doc_e=doc_e->last;
|
||||
while (doc_e!=doc && doc_e->type_u8!=DOCT_USER_FOREGROUND);
|
||||
while (doc_e!=doc && doc_e->type_u8!=DOCT_PMT);
|
||||
doc_e=doc_e->next;
|
||||
if (result=DocGetLine(doc,doc_e,NULL,&doc_e_end)) {
|
||||
while (doc_e_end!=doc && doc_e_end->type_u8==DOCT_NEW_LINE) {
|
||||
@@ -336,18 +331,18 @@ public U8 *DocMGetS(I64 flags=0)
|
||||
doc_e=doc->cur_entry;
|
||||
do doc_e=doc_e->last;
|
||||
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
|
||||
doc_e->type_u8!=DOCT_USER_FOREGROUND);
|
||||
if (doc_e!=doc && doc_e->type_u8!=DOCT_USER_FOREGROUND) {
|
||||
doc_e->type_u8!=DOCT_PMT);
|
||||
if (doc_e!=doc && doc_e->type_u8!=DOCT_PMT) {
|
||||
do doc_e=doc_e->last;
|
||||
while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&
|
||||
doc_e->type_u8!=DOCT_USER_FOREGROUND);
|
||||
doc_e->type_u8!=DOCT_PMT);
|
||||
}
|
||||
doc_e=doc_e->next;
|
||||
result=DocGetLine(doc,doc_e,NULL);
|
||||
}
|
||||
DocUnlock(doc);
|
||||
mgets_done:
|
||||
"$$FU$$$$FG$$$$BG$$";
|
||||
"$$PT$$$$FG$$$$BG$$";
|
||||
Preempt(old_preempt);
|
||||
return result;
|
||||
}
|
||||
@@ -367,11 +362,12 @@ public I64 PmtI64(U8 *msg,I64 dft,I64 lo=MIN_I64,I64 hi=MAX_I64)
|
||||
return dft;
|
||||
}
|
||||
try {
|
||||
okay=FALSE;
|
||||
result=ExePrintF3("ToI64(%s);",st);
|
||||
okay=TRUE;
|
||||
} catch
|
||||
} catch {
|
||||
Fs->catch_except=TRUE;
|
||||
okay=FALSE;
|
||||
}
|
||||
Free(st);
|
||||
if (okay && lo<=result<=hi)
|
||||
return result;
|
||||
@@ -391,11 +387,12 @@ public F64 PmtF64(U8 *msg,F64 dft,F64 lo=MIN_F64,F64 hi=MAX_F64)
|
||||
return dft;
|
||||
}
|
||||
try {
|
||||
okay=FALSE;
|
||||
result=ExePrintF3("ToF64(%s);",st)(F64);
|
||||
okay=TRUE;
|
||||
} catch
|
||||
} catch {
|
||||
Fs->catch_except=TRUE;
|
||||
okay=FALSE;
|
||||
}
|
||||
Free(st);
|
||||
if (okay && lo<=result<=hi)
|
||||
return result;
|
||||
@@ -433,7 +430,7 @@ public CDate PmtCDate(U8 *msg,CDate dft,CDate lo=MIN_I64,CDate hi=MAX_I64)
|
||||
Free(st);
|
||||
return dft;
|
||||
}
|
||||
result=A2CDate(st);
|
||||
result=A2Date(st);
|
||||
Free(st);
|
||||
if (result>=lo && result<=hi)
|
||||
return result;
|
||||
@@ -495,10 +492,15 @@ I64 PopUpCancelIncludeDelAuto(U8 *header=NULL,U8 *footer=NULL)
|
||||
I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
{ //called with doc locked, exit unlocked
|
||||
Bool result;
|
||||
U8 *st;
|
||||
U8 *st,*st2;
|
||||
if (st=DocEntryLink(doc,doc_e)) {
|
||||
DocUnlock(doc);
|
||||
result=Ed(st);
|
||||
if (doc_e->flags1 & DOCEF1_POPUP) {
|
||||
st2=MSPrintF("Ed(\"%Q\");",st);
|
||||
result=PopUp(st2);
|
||||
Free(st2);
|
||||
} else
|
||||
result=Ed(st);
|
||||
Free(st);
|
||||
return result;
|
||||
}
|
||||
@@ -523,7 +525,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"#include \"%s\";\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"#include \"%s\";\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
ExeFile(st);
|
||||
result=TRUE;
|
||||
@@ -535,11 +537,11 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
result=Type(st);
|
||||
break;
|
||||
case RIGHT_ED:
|
||||
"Ed(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"Ed(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
result=Ed(st);
|
||||
break;
|
||||
case RIGHT_PLAIN:
|
||||
"Plain(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"Plain(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
result=Plain(st);
|
||||
break;
|
||||
case RIGHT_AUTOFILE:
|
||||
@@ -549,7 +551,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"AutoFile(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"AutoFile(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
AutoStr("%F\n",st);
|
||||
result=TRUE;
|
||||
@@ -561,7 +563,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"Adam(\"#include \\\"%s\\\"\" );\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"Adam(\"#include \\\"%s\\\"\" );\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
AdamFile(st,FALSE);
|
||||
result=TRUE;
|
||||
@@ -573,7 +575,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"Cmp(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"Cmp(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
result=!ToBool(Cmp(st));
|
||||
break;
|
||||
@@ -584,7 +586,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"Load(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"Load(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
result=ToBool(Load(st));
|
||||
break;
|
||||
@@ -595,7 +597,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"BinRep(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"BinRep(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
result=BinRep(st);
|
||||
break;
|
||||
@@ -620,7 +622,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
break;
|
||||
}
|
||||
}
|
||||
"IDE(\"%s\");\n$$FU$$$$FG$$$$BG$$",st;
|
||||
"IDE(\"%s\");\n$$PT$$$$FG$$$$BG$$",st;
|
||||
WinZBufUpdate;
|
||||
IDE(st);
|
||||
result=TRUE;
|
||||
@@ -635,7 +637,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e)
|
||||
} else
|
||||
send_new_line=TRUE;
|
||||
DocBottom(doc);
|
||||
"$$FU$$$$FG$$$$BG$$";
|
||||
"$$PT$$$$FG$$$$BG$$";
|
||||
if (send_new_line)
|
||||
'\n';
|
||||
return result;
|
||||
@@ -648,7 +650,7 @@ public U0 DocDm(U8 *buf,I64 cnt=0x80)
|
||||
//edited.
|
||||
{
|
||||
CDocEntry *doc_e;
|
||||
CDoc *doc=DocCur;
|
||||
CDoc *doc=DocPut;
|
||||
Bool unlock=DocLock(doc);
|
||||
doc_e=DocPrintF(doc,"$$HX-Z,%d,16$$",cnt);
|
||||
doc_e->data=buf;
|
||||
@@ -664,7 +666,7 @@ public U0 DocD(U8 *buf,I64 cnt=0x80)
|
||||
//edited.
|
||||
{
|
||||
CDocEntry *doc_e;
|
||||
CDoc *doc=DocCur;
|
||||
CDoc *doc=DocPut;
|
||||
Bool unlock=DocLock(doc);
|
||||
doc_e=DocPrintF(doc,"$$HX,%d,16$$",cnt);
|
||||
doc_e->data=buf;
|
||||
@@ -678,13 +680,13 @@ public U0 DocD(U8 *buf,I64 cnt=0x80)
|
||||
Bool AKDDocPutS(U8 *st)
|
||||
{
|
||||
CDoc *doc;
|
||||
if (doc=DocCur)
|
||||
if (doc=DocPut)
|
||||
DocPutSPartial(doc,st);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
KeyDevAdd(&AKDDocPutKey,&AKDDocPutS,0x80000000,TRUE);
|
||||
fp_mgets=&DocMGetS;
|
||||
fp_doc_cur=&DocCur;
|
||||
fp_doc_put=&DocPut;
|
||||
|
||||
#help_index "Doc"
|
||||
+93
-163
@@ -40,18 +40,7 @@ U0 DocTablesInit()
|
||||
1<<DOCT_BACKGROUND|
|
||||
1<<DOCT_DFT_FOREGROUND|
|
||||
1<<DOCT_DFT_BACKGROUND|
|
||||
1<<DOCT_ALT_FOREGROUND|
|
||||
1<<DOCT_LINK_FOREGROUND|
|
||||
1<<DOCT_MACRO_FOREGROUND|
|
||||
1<<DOCT_ANCHOR_FOREGROUND|
|
||||
1<<DOCT_HIDDEN_FOREGROUND|
|
||||
1<<DOCT_TREE_FOREGROUND|
|
||||
1<<DOCT_USER_FOREGROUND|
|
||||
1<<DOCT_BINARY_FOREGROUND|
|
||||
1<<DOCT_KEYWORD_FOREGROUND|
|
||||
1<<DOCT_KEYWORD2_FOREGROUND|
|
||||
1<<DOCT_COMMENT_FOREGROUND|
|
||||
1<<DOCT_QUOTE_FOREGROUND|
|
||||
1<<DOCT_PMT|
|
||||
1<<DOCT_WORD_WRAP|
|
||||
1<<DOCT_UNDERLINE|
|
||||
1<<DOCT_INVERT|
|
||||
@@ -391,7 +380,7 @@ public U0 DocHome(CDoc *doc=NULL)
|
||||
{
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc) return;
|
||||
}
|
||||
unlock=DocLock(doc);
|
||||
@@ -454,7 +443,7 @@ public U0 DocRst(CDoc *doc,Bool is_old)
|
||||
CDocSettings *s;
|
||||
CDocBin *b,*b1;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc) return;
|
||||
}
|
||||
unlock=DocLock(doc);
|
||||
@@ -511,19 +500,7 @@ public U0 DocRst(CDoc *doc,Bool is_old)
|
||||
s->shifted_x=0;
|
||||
s->shifted_y=0;
|
||||
|
||||
s->cur_text_attr=s->dft_text_attr=doc->start_text_attr=WHITE<<4+BLACK;
|
||||
s->alt_text_attr =LTGRAY;
|
||||
s->link_attr =RED;
|
||||
s->macro_attr =LTBLUE;
|
||||
s->anchor_attr =DKGRAY;
|
||||
s->hidden_attr =DKGRAY;
|
||||
s->tree_attr =PURPLE;
|
||||
s->user_attr =GREEN;
|
||||
s->bin_attr =CYAN;
|
||||
s->keyword_attr =BLUE;
|
||||
s->keyword2_attr =LTRED;
|
||||
s->comment_attr =GREEN;
|
||||
s->quote_attr =BROWN;
|
||||
s->cur_text_attr=s->dft_text_attr=DOC_ATTR_DFT_TEXT;
|
||||
|
||||
doc_e=&doc->root;
|
||||
doc_e->type=DOCT_ERROR;
|
||||
@@ -547,7 +524,6 @@ public U0 DocDel(CDoc *doc)
|
||||
if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL) return;
|
||||
DocLock(doc);
|
||||
doc->doc_signature=0;
|
||||
doc->doc_in_que_signature=0;
|
||||
DocRst(doc,TRUE);
|
||||
Free(doc->find_replace);
|
||||
Free(doc->dollar_buf);
|
||||
@@ -683,7 +659,7 @@ U0 DocRemSoftNewLines(CDoc *doc=NULL,CDocEntry *doc_e=NULL)
|
||||
CDocEntry *doc_e2,*saved_ll=doc_e;
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc) return;
|
||||
}
|
||||
unlock=DocLock(doc);
|
||||
@@ -712,7 +688,7 @@ public I64 DocMax(I64 i=MAX_I32)
|
||||
//entries after a while.
|
||||
{
|
||||
I64 result;
|
||||
CDoc *doc=DocCur;
|
||||
CDoc *doc=DocPut;
|
||||
if (doc) {
|
||||
result=doc->max_entries;
|
||||
doc->max_entries=i;
|
||||
@@ -747,162 +723,116 @@ public CDoc *DocNew(CTask *task=NULL)
|
||||
sys_clipboard_doc=DocNew;
|
||||
|
||||
#help_index "Doc/Task"
|
||||
public U0 DocQueIns(CDoc *doc,CDoc *pred)
|
||||
{
|
||||
CDoc *succ;
|
||||
Bool *old_preempt;
|
||||
if (!doc) return;
|
||||
old_preempt=Preempt(OFF);
|
||||
succ=pred->next_doc;
|
||||
doc->last_doc=pred;
|
||||
doc->next_doc=succ;
|
||||
pred->next_doc=doc;
|
||||
succ->last_doc=doc;
|
||||
doc->doc_in_que_signature=DOC_IN_QUE_SIGNATURE_VAL;
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
public U0 DocQueInsRev(CDoc *doc,CDoc *succ)
|
||||
{
|
||||
CDoc *pred;
|
||||
Bool *old_preempt;
|
||||
if (!doc) return;
|
||||
old_preempt=Preempt(OFF);
|
||||
pred=succ->last_doc;
|
||||
doc->last_doc=pred;
|
||||
doc->next_doc=succ;
|
||||
pred->next_doc=doc;
|
||||
succ->last_doc=doc;
|
||||
doc->doc_in_que_signature=DOC_IN_QUE_SIGNATURE_VAL;
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
public U0 DocQueRem(CDoc *doc)
|
||||
{
|
||||
CDoc *succ,*pred;
|
||||
Bool *old_preempt;
|
||||
if (!doc) return;
|
||||
old_preempt=Preempt(OFF);
|
||||
doc->doc_in_que_signature=0;
|
||||
succ=doc->next_doc;
|
||||
pred=doc->last_doc;
|
||||
pred->next_doc=succ;
|
||||
succ->last_doc=pred;
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
public CDoc *DocCur(CTask *task=NULL)
|
||||
{
|
||||
public CDoc *DocPut(CTask *task=NULL)
|
||||
{//Current document that PUT goes to.
|
||||
//Basically, StdOut unless double buffering.
|
||||
CDoc *result;
|
||||
if (!task) task=Fs;
|
||||
result=task->last_doc;
|
||||
if (result==(&task->next_doc)(U8 *)-offset(CDoc.next_doc) ||
|
||||
result->flags&DOCF_AUX_DOC ||
|
||||
result->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL)
|
||||
result=NULL;
|
||||
return result;
|
||||
if ((result=task->put_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
|
||||
return result;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
public CDoc *DocAux(CTask *task=NULL)
|
||||
{
|
||||
public CDoc *DocDisplay(CTask *task=NULL)
|
||||
{//StdOut unless double buffering.
|
||||
CDoc *result;
|
||||
if (!task) task=Fs;
|
||||
result=task->next_doc;
|
||||
if (result==(&task->next_doc)(U8 *)-offset(CDoc.next_doc) ||
|
||||
!(result->flags&DOCF_AUX_DOC) ||
|
||||
result->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL)
|
||||
result=NULL;
|
||||
return result;
|
||||
if ((result=task->display_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
|
||||
return result;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
public CDoc *DocBorder(CTask *task=NULL)
|
||||
{//Doc holding border of window text.
|
||||
CDoc *result;
|
||||
if (!task) task=Fs;
|
||||
if ((result=task->border_doc) && result->doc_signature==DOC_SIGNATURE_VAL)
|
||||
return result;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
public CDoc *DocDblBufStart(CTask *task=NULL)
|
||||
{ //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$
|
||||
CDoc *doc,*doc2;
|
||||
Bool unlock_doc2,old_preempt=Preempt(OFF);
|
||||
if (!task) task=Fs;
|
||||
doc2=task->last_doc;
|
||||
unlock_doc2=DocLock(doc2); //dont want change during winupdate, so lock DocCur$WW,0$
|
||||
doc=DocNew(task);
|
||||
doc->win_task =doc2->win_task;
|
||||
doc->start_text_attr=doc2->start_text_attr;
|
||||
doc->max_entries=doc2->max_entries;
|
||||
MemCpy(doc->find_replace,doc2->find_replace,sizeof(CEdFindText));
|
||||
doc->start_x =doc2->start_x;
|
||||
doc->start_y =doc2->start_y;
|
||||
MemCpy(&doc->filename,&doc2->filename,sizeof(CEdFileName));
|
||||
doc->left_click_link =doc2->left_click_link;
|
||||
doc->right_click_link=doc2->right_click_link;
|
||||
doc->user_put_data=doc2->user_put_data;
|
||||
doc->user_put_key =doc2->user_put_key;
|
||||
doc->user_put_s =doc2->user_put_s;
|
||||
doc->parent_doc =doc2->parent_doc;
|
||||
doc->desc[0](I64)=doc2->desc[0](I64);
|
||||
doc->user_data =doc2->user_data;
|
||||
doc->flags|=doc2->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW;
|
||||
DocQueIns(doc,task->last_doc);
|
||||
if (unlock_doc2)
|
||||
DocUnlock(doc2);
|
||||
Bool unlock_ddoc,old_preempt=Preempt(OFF);
|
||||
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task),*result;
|
||||
if (!pdoc || !ddoc || pdoc!=ddoc)
|
||||
result=NULL; //Already Double buffering
|
||||
else {
|
||||
if (!task) task=Fs;
|
||||
unlock_ddoc=DocLock(ddoc); //dont want change during winupdate, so lock DocPut$WW,0$
|
||||
result=DocNew(task);
|
||||
result->win_task =ddoc->win_task;
|
||||
result->max_entries =ddoc->max_entries;
|
||||
MemCpy(result->find_replace,ddoc->find_replace,sizeof(CEdFindText));
|
||||
result->start_x =ddoc->start_x;
|
||||
result->start_y =ddoc->start_y;
|
||||
MemCpy(&result->filename,&ddoc->filename,sizeof(CEdFileName));
|
||||
result->left_click_link =ddoc->left_click_link;
|
||||
result->right_click_link =ddoc->right_click_link;
|
||||
result->user_put_data =ddoc->user_put_data;
|
||||
result->user_put_key =ddoc->user_put_key;
|
||||
result->user_put_s =ddoc->user_put_s;
|
||||
result->parent_doc =ddoc->parent_doc;
|
||||
result->desc[0](I64) =ddoc->desc[0](I64);
|
||||
result->user_data =ddoc->user_data;
|
||||
result->flags|=ddoc->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW;
|
||||
task->put_doc=result;
|
||||
if (unlock_ddoc)
|
||||
DocUnlock(ddoc);
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
return doc;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool DocDblBufEnd(CTask *task=NULL)
|
||||
{ //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$
|
||||
Bool okay=FALSE,old_preempt=Preempt(OFF);
|
||||
CDoc *doc1,*doc2;
|
||||
if (!task) task=Fs;
|
||||
if (doc1=DocCur(task)) {
|
||||
doc2=doc1->last_doc;
|
||||
if (doc2!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
!(doc2->flags&DOCF_AUX_DOC) &&
|
||||
doc2->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
doc2->flags|=DOCF_DONT_SHOW;
|
||||
doc1->flags&=~DOCF_DONT_SHOW;
|
||||
DocLock(doc2);
|
||||
DocQueRem(doc2);
|
||||
DocUnlock(doc2);
|
||||
DocDel(doc2);
|
||||
okay=TRUE;
|
||||
}
|
||||
Bool result=FALSE,old_preempt=Preempt(OFF);
|
||||
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
|
||||
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
|
||||
if (!task) task=Fs;
|
||||
ddoc->flags|=DOCF_DONT_SHOW;
|
||||
pdoc->flags&=~DOCF_DONT_SHOW;
|
||||
DocLock(ddoc);
|
||||
task->display_doc=pdoc;
|
||||
DocUnlock(ddoc);
|
||||
DocDel(ddoc);
|
||||
result=TRUE;
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
return okay;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool DocDblBufSwap(CTask *task=NULL)
|
||||
{ //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$
|
||||
Bool okay=FALSE,old_preempt=Preempt(OFF);
|
||||
CDoc *doc1,*doc2;
|
||||
if (!task) task=Fs;
|
||||
if (doc1=DocCur(task)) {
|
||||
doc2=doc1->last_doc;
|
||||
if (doc2!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
!(doc2->flags&DOCF_AUX_DOC) &&
|
||||
doc2->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
doc2->flags|=DOCF_DONT_SHOW;
|
||||
doc1->flags&=~DOCF_DONT_SHOW;
|
||||
DocLock(doc2);
|
||||
DocQueRem(doc2);
|
||||
DocUnlock(doc2);
|
||||
DocRst(doc2,TRUE);
|
||||
MemCpy(doc2->find_replace,doc1->find_replace,sizeof(CEdFindText));
|
||||
MemCpy(&doc2->filename,&doc1->filename,sizeof(CEdFileName));
|
||||
doc2->start_text_attr=doc1->start_text_attr;
|
||||
doc2->max_entries =doc1->max_entries;
|
||||
doc2->flags =doc1->flags&DOCG_DBL_BUF_FLAGS | doc2->flags&~DOCG_DBL_BUF_FLAGS;
|
||||
doc2->left_click_link =doc1->left_click_link;
|
||||
doc2->right_click_link=doc1->right_click_link;
|
||||
doc2->user_put_data=doc1->user_put_data;
|
||||
doc2->user_put_key =doc1->user_put_key;
|
||||
doc2->user_put_s =doc1->user_put_s;
|
||||
doc2->desc[0](I64)=doc1->desc[0](I64);
|
||||
doc2->user_data =doc1->user_data;
|
||||
DocQueIns(doc2,task->last_doc);
|
||||
okay=TRUE;
|
||||
}
|
||||
Bool result=FALSE,old_preempt=Preempt(OFF);
|
||||
CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task);
|
||||
if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering?
|
||||
if (!task) task=Fs;
|
||||
ddoc->flags|=DOCF_DONT_SHOW;
|
||||
pdoc->flags&=~DOCF_DONT_SHOW;
|
||||
DocLock(ddoc);
|
||||
task->display_doc=pdoc;
|
||||
DocUnlock(ddoc);
|
||||
DocRst(ddoc,TRUE);
|
||||
MemCpy(ddoc->find_replace,pdoc->find_replace,sizeof(CEdFindText));
|
||||
MemCpy(&ddoc->filename,&pdoc->filename,sizeof(CEdFileName));
|
||||
ddoc->max_entries =pdoc->max_entries;
|
||||
ddoc->flags =pdoc->flags&DOCG_DBL_BUF_FLAGS | ddoc->flags&~DOCG_DBL_BUF_FLAGS;
|
||||
ddoc->left_click_link =pdoc->left_click_link;
|
||||
ddoc->right_click_link =pdoc->right_click_link;
|
||||
ddoc->user_put_data =pdoc->user_put_data;
|
||||
ddoc->user_put_key =pdoc->user_put_key;
|
||||
ddoc->user_put_s =pdoc->user_put_s;
|
||||
ddoc->desc[0](I64) =pdoc->desc[0](I64);
|
||||
ddoc->user_data =pdoc->user_data;
|
||||
task->put_doc=ddoc;
|
||||
result=TRUE;
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
return okay;
|
||||
return result;
|
||||
}
|
||||
#help_index "Doc"
|
||||
@@ -4,6 +4,7 @@ I64 DocOptEntry(CDoc *,CDocEntry *doc_e)
|
||||
{
|
||||
U8 *st,*st2,**dst;
|
||||
I64 i,result=0;
|
||||
|
||||
if (doc_e->flags1&DOCEF1_LINK) {
|
||||
if (doc_e->flags1 & DOCEF1_AUX_STR &&
|
||||
Bt(doc_tag_types,doc_e->type_u8) &&
|
||||
|
||||
+11
-134
@@ -80,40 +80,7 @@ DOCEF1_DATA_IS_PTR | DOCEF1_HAS_TERMINATOR | DOCEF1_AUX_STR | DOCEF1_U64,
|
||||
//DOCT_DFT_BACKGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ALT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_LINK_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_MACRO_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ANCHOR_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_HIDDEN_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_TREE_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_USER_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_BINARY_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD2_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_COMMENT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_QUOTE_FOREGROUND
|
||||
//DOCT_PMT
|
||||
0,
|
||||
|
||||
//DOCT_WORD_WRAP
|
||||
@@ -261,40 +228,7 @@ I64 doc_dft_flags2[DOCT_NUM_TYPES]={
|
||||
//DOCT_DFT_BACKGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ALT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_LINK_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_MACRO_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ANCHOR_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_HIDDEN_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_TREE_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_USER_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_BINARY_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD2_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_COMMENT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_QUOTE_FOREGROUND
|
||||
//DOCT_PMT
|
||||
0,
|
||||
|
||||
//DOCT_WORD_WRAP
|
||||
@@ -442,40 +376,7 @@ I64 doc_dft_type_flags[DOCT_NUM_TYPES]={
|
||||
//DOCT_DFT_BACKGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ALT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_LINK_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_MACRO_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_ANCHOR_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_HIDDEN_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_TREE_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_USER_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_BINARY_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_KEYWORD2_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_COMMENT_FOREGROUND
|
||||
0,
|
||||
|
||||
//DOCT_QUOTE_FOREGROUND
|
||||
//DOCT_PMT
|
||||
0,
|
||||
|
||||
//DOCT_WORD_WRAP
|
||||
@@ -703,18 +604,6 @@ U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e)
|
||||
case DOCT_BACKGROUND:
|
||||
case DOCT_DFT_FOREGROUND:
|
||||
case DOCT_DFT_BACKGROUND:
|
||||
case DOCT_ALT_FOREGROUND:
|
||||
case DOCT_LINK_FOREGROUND:
|
||||
case DOCT_MACRO_FOREGROUND:
|
||||
case DOCT_ANCHOR_FOREGROUND:
|
||||
case DOCT_HIDDEN_FOREGROUND:
|
||||
case DOCT_TREE_FOREGROUND:
|
||||
case DOCT_USER_FOREGROUND:
|
||||
case DOCT_BINARY_FOREGROUND:
|
||||
case DOCT_KEYWORD_FOREGROUND:
|
||||
case DOCT_KEYWORD2_FOREGROUND:
|
||||
case DOCT_COMMENT_FOREGROUND:
|
||||
case DOCT_QUOTE_FOREGROUND:
|
||||
case DOCT_WORD_WRAP:
|
||||
case DOCT_HIGHLIGHT:
|
||||
case DOCT_LOCK_TO_PAGE:
|
||||
@@ -907,18 +796,6 @@ CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st)
|
||||
case DOCT_BACKGROUND:
|
||||
case DOCT_DFT_FOREGROUND:
|
||||
case DOCT_DFT_BACKGROUND:
|
||||
case DOCT_ALT_FOREGROUND:
|
||||
case DOCT_LINK_FOREGROUND:
|
||||
case DOCT_MACRO_FOREGROUND:
|
||||
case DOCT_ANCHOR_FOREGROUND:
|
||||
case DOCT_HIDDEN_FOREGROUND:
|
||||
case DOCT_TREE_FOREGROUND:
|
||||
case DOCT_USER_FOREGROUND:
|
||||
case DOCT_BINARY_FOREGROUND:
|
||||
case DOCT_KEYWORD_FOREGROUND:
|
||||
case DOCT_KEYWORD2_FOREGROUND:
|
||||
case DOCT_COMMENT_FOREGROUND:
|
||||
case DOCT_QUOTE_FOREGROUND:
|
||||
case DOCT_WORD_WRAP:
|
||||
case DOCT_HIGHLIGHT:
|
||||
case DOCT_LOCK_TO_PAGE:
|
||||
@@ -1077,7 +954,7 @@ public U0 DocIns(CDoc *doc,CDocEntry *doc_e)
|
||||
!(doc_ce->flags1&(DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) &&
|
||||
!(doc_ce->flags2&DOCEF2_BIN_PTR_LINK) &&
|
||||
doc->cur_data_col<doc_ce->max_col) {
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_ne->type=DOCT_TEXT|doc_ce->type&0xFFFFFF00;
|
||||
doc_ne->x=doc_ce->x;
|
||||
doc_ne->y=doc_ce->y;
|
||||
@@ -1116,7 +993,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st)
|
||||
Bool unlock;
|
||||
I64 j;
|
||||
CDocEntry *doc_e=NULL,*result=NULL,*doc_ce;
|
||||
if (!st || !doc || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
if (!st || !doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
return NULL;
|
||||
unlock=DocLock(doc);
|
||||
if (doc->flags & DOCF_PLAIN_TEXT_WITH_TABS)
|
||||
@@ -1134,7 +1011,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st)
|
||||
ptr--;
|
||||
if (!ch) {
|
||||
if (j=ptr-ptr2) {
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
if (doc->flags & DOCF_NO_CURSOR) {
|
||||
src=MAlloc(j+1);
|
||||
@@ -1153,7 +1030,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st)
|
||||
} else {
|
||||
if (j=ptr-ptr2) {
|
||||
*ptr=0;
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
if (doc->flags & DOCF_NO_CURSOR) {
|
||||
src=MAlloc(j+1);
|
||||
@@ -1210,7 +1087,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st)
|
||||
ptr2++;
|
||||
}
|
||||
if (ptr==ptr2) {
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task);
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8;
|
||||
doc_e->max_col=1;
|
||||
if (doc->flags & DOCF_DBL_DOLLARS)
|
||||
@@ -1248,12 +1125,12 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st)
|
||||
doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task);
|
||||
doc_e->type=DOCT_NEW_LINE | doc->settings_root.dft_text_attr << 8;
|
||||
DocIns(doc,doc_e);
|
||||
if (ch==CH_CARRIAGE_RETURN)
|
||||
while (*ptr==CH_CARRIAGE_RETURN)
|
||||
if (ch=='\r')
|
||||
while (*ptr=='\r')
|
||||
ptr++;
|
||||
if (*ptr=='\n')
|
||||
ptr++;
|
||||
while (*ptr==CH_CARRIAGE_RETURN)
|
||||
while (*ptr=='\r')
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
+115
-78
@@ -5,27 +5,26 @@ public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,Bool exited)
|
||||
DocLock(doc);
|
||||
if (!exited) {
|
||||
if (doc_e->flags1 & DOCEF1_ESC) {
|
||||
Msg(MSG_KEY_DOWN,CH_ESC,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_KEY_DOWN,CH_ESC,0,1<<SVCf_DONT_FILTER);
|
||||
return 0;
|
||||
} if (doc_e->flags1 & DOCEF1_QUIT) {
|
||||
Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0,1<<SVCf_DONT_FILTER);
|
||||
return 0;
|
||||
} else if (doc_e->flags1 & DOCEF1_CHECK_COLLAPSABLE)
|
||||
doc_e->flags1^=DOCEF1_CHECKED_COLLAPSED;
|
||||
}
|
||||
doc->best_d=MAX_I64;
|
||||
try {
|
||||
if (ch==CH_SPACE) {
|
||||
if (doc_e->flags1 & DOCEF1_LINK && doc->left_click_link)
|
||||
result=(*doc->left_click_link)(doc,doc_e);
|
||||
if (doc_e->flags1 & DOCEF1_LEFT_EXP) {
|
||||
result=doc_e->left_exp;
|
||||
Msg(MSG_CMD,result,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
|
||||
}
|
||||
if (doc_e->flags1 & DOCEF1_LEFT_CB && doc_e->left_cb) {
|
||||
DocUnlock(doc);
|
||||
result=(*doc_e->left_cb)(doc,doc_e);
|
||||
Msg(MSG_CMD,result,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
|
||||
}
|
||||
if (doc_e->flags1 & DOCEF1_LEFT_MACRO) {
|
||||
if (doc_e->flags1 & DOCEF1_POPUP) {
|
||||
@@ -45,12 +44,12 @@ public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,Bool exited)
|
||||
result=(*doc->right_click_link)(doc,doc_e);
|
||||
if (doc_e->flags1 & DOCEF1_RIGHT_EXP) {
|
||||
result=doc_e->right_exp;
|
||||
Msg(MSG_CMD,result,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
|
||||
}
|
||||
if (doc_e->flags1 & DOCEF1_RIGHT_CB && doc_e->right_cb) {
|
||||
DocUnlock(doc);
|
||||
result=(*doc_e->right_cb)(doc,doc_e);
|
||||
Msg(MSG_CMD,result,0,1<<TASKCf_DONT_FILTER);
|
||||
Msg(MSG_CMD,result,0,1<<SVCf_DONT_FILTER);
|
||||
}
|
||||
if (doc_e->flags1 & DOCEF1_RIGHT_MACRO) {
|
||||
if (doc_e->flags1 & DOCEF1_POPUP) {
|
||||
@@ -77,7 +76,10 @@ U8 *EdOverStrikeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
|
||||
{
|
||||
CDoc *doc=doc_e->user_data;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=doc->flags & DOCF_OVERSTRIKE ? 'O':'Ä';
|
||||
if (doc->flags & DOCF_OVERSTRIKE)
|
||||
*st='O';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -86,7 +88,10 @@ U8 *EdFilterCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
|
||||
{
|
||||
CDoc *doc=doc_e->user_data;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=doc->find_replace->filter_lines ? 'F':'Ä';
|
||||
if (doc->find_replace->filter_lines)
|
||||
*st='F';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -95,7 +100,10 @@ U8 *EdDollarCB(CDoc *,CDocEntry *doc_e,CTask *mem_task)
|
||||
{
|
||||
CDoc *doc=doc_e->user_data;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=doc->flags & DOCF_IN_DOLLAR ? '$$':'Ä';
|
||||
if (doc->flags & DOCF_IN_DOLLAR)
|
||||
*st='$$';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -115,7 +123,10 @@ U8 *EdQuotesCB(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
CLex *lx=mem_task->last_lex;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=lx->flags & LF_IN_QUOTES ? '"':'Ä';
|
||||
if (lx->flags & LF_IN_QUOTES)
|
||||
*st='"';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -124,7 +135,10 @@ U8 *EdBracesCB(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
CLex *lx=mem_task->last_lex;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=lx->braces_cnt ? '}':'Ä';
|
||||
if (lx->braces_cnt)
|
||||
*st='}';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -133,7 +147,10 @@ U8 *EdSemicolonCB(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
CLex *lx=mem_task->last_lex;
|
||||
U8 *st=MAlloc(8,mem_task);
|
||||
*st=lx->statement_cnt ? ';':'Ä';
|
||||
if (lx->statement_cnt)
|
||||
*st=';';
|
||||
else
|
||||
*st='Ä';
|
||||
st[1]=0;
|
||||
return st;
|
||||
}
|
||||
@@ -157,12 +174,12 @@ public I64 DocGetKey(I64 *_sc=NULL)
|
||||
Bool cont,old_preempt=IsPreempt;
|
||||
do {
|
||||
ch=GetKey(&sc,TRUE);
|
||||
DocRecalc(DocCur);
|
||||
DocRecalc(DocPut);
|
||||
cont=FALSE;
|
||||
if (ch==CH_ESC || ch==CH_SHIFT_ESC) { //Check for exit filter mode
|
||||
Preempt(OFF);
|
||||
if (DocCur && DocCur->find_replace->filter_lines) {
|
||||
EdUndoFilter(DocCur);
|
||||
if (DocPut && DocPut->find_replace->filter_lines) {
|
||||
EdUndoFilter(DocPut);
|
||||
cont=TRUE;
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
@@ -184,72 +201,78 @@ public Bool View()
|
||||
#help_index "Doc"
|
||||
public Bool DocDo(CDoc *doc,I64 doc_flags=0)
|
||||
{
|
||||
CDoc *old_doc=DocCur,*old_aux_doc=DocAux,*aux;
|
||||
CDoc *old_put_doc =DocPut,
|
||||
*old_display_doc=DocDisplay,
|
||||
*old_border_doc =DocBorder,*bdoc;
|
||||
CDocEntry *doc_e;
|
||||
I64 old_attr=Fs->text_attr,
|
||||
old_top =Fs->win_top, old_bottom=Fs->win_bottom,
|
||||
old_left=Fs->win_left,old_right =Fs->win_right;
|
||||
old_left=Fs->win_left,old_right =Fs->win_right,
|
||||
old_title_src=Fs->title_src;
|
||||
Bool result,unlock,old_preempt;
|
||||
|
||||
U8 *old_task_title;
|
||||
if (doc_flags&DOF_WIN_MAX)
|
||||
WinMax;
|
||||
|
||||
unlock=DocLock(doc);
|
||||
doc->win_task=Fs;
|
||||
aux=DocNew;
|
||||
aux->flags|=DOCF_AUX_DOC;
|
||||
aux->settings_root.dft_text_attr=Fs->border_attr;
|
||||
DocPutS(aux,"$$CM+TY+LX+NC,0,-1$$");
|
||||
bdoc=DocNew;
|
||||
bdoc->flags|=DOCF_BORDER_DOC;
|
||||
DocPutS(bdoc,"$$CM+TY+LX+NC,0,-1$$");
|
||||
if (Bt(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN))
|
||||
DocPutS(aux,"$$TX+RX+BD,\"[X]\"$$");
|
||||
DocPutS(aux,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$");
|
||||
DocPutS(bdoc,"$$TX+RX+BD,\"[X]\"$$");
|
||||
DocPutS(bdoc,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$");
|
||||
|
||||
doc_e=DocPutS(aux,"$$DA-T-P+BD+RD+CX+SCX+IV,256,\"%s...\",16$$");
|
||||
doc_e->data=&doc->filename.name;
|
||||
old_task_title=StrNew(Fs->task_title);
|
||||
if (Fs->title_src!=TTS_LOCKED_CONST) {
|
||||
Fs->title_src=TTS_ED_FILENAME;
|
||||
MemCpy(Fs->task_title,doc->filename.name,TASK_TITLE_LEN);
|
||||
}
|
||||
doc_e=DocPutS(bdoc,"$$DA-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$");
|
||||
doc_e->data=&Fs->task_title;
|
||||
DocDataFmt(doc_e);
|
||||
|
||||
if (doc->flags & DOCF_ALLOW_UNDO) {
|
||||
DocPutS(aux,"$$CM+BY+LX+NC,1,1$$");
|
||||
doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Undo:%03d\"$$\n");
|
||||
DocPutS(bdoc,"$$CM+BY+LX+NC,1,1$$");
|
||||
doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Undo:%03d\"$$\n");
|
||||
doc_e->data=&doc->undo_cnt;
|
||||
DocDataFmt(doc_e);
|
||||
}
|
||||
|
||||
DocPutS(aux,"$$CM+BY+RX+NC,-30,1$$");
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
DocPutS(bdoc,"$$CM+BY+RX+NC,-30,1$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdMoreCB;
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdDollarTypeCB;
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdFilterCB;
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdOverStrikeCB;
|
||||
doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$");
|
||||
doc_e->user_data=doc;
|
||||
doc_e->tag_cb=&EdDollarCB;
|
||||
doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Line:%04d \"$$");
|
||||
doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Line:%04d \"$$");
|
||||
doc_e->data=&doc->line;
|
||||
DocDataFmt(doc_e);
|
||||
doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\n");
|
||||
doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\n");
|
||||
doc_e->data=&doc->col;
|
||||
DocDataFmt(doc_e);
|
||||
|
||||
DocRecalc(aux);
|
||||
DocRecalc(bdoc);
|
||||
DocRecalc(doc);
|
||||
if (!(doc_flags&DOF_DONT_HOME))
|
||||
DocHome(doc);
|
||||
old_preempt=Preempt(OFF);
|
||||
DocQueRem(old_aux_doc);
|
||||
DocQueInsRev(aux,Fs->next_doc);
|
||||
if (doc!=old_doc)
|
||||
doc->parent_doc=old_doc;
|
||||
DocQueRem(old_doc);
|
||||
DocQueIns(doc,Fs->last_doc);
|
||||
Fs->text_attr=doc->settings_root.dft_text_attr;
|
||||
Fs->border_doc=bdoc;
|
||||
if (doc!=old_display_doc)
|
||||
doc->parent_doc=old_display_doc;
|
||||
Fs->put_doc=Fs->display_doc=doc;
|
||||
if (!(doc_flags&DOF_DONT_TEXT_ATTR))
|
||||
Fs->text_attr=DOC_ATTR_DFT_TEXT;
|
||||
LBts(&Fs->display_flags,DISPLAYf_SHOW);
|
||||
WinZBufUpdate;
|
||||
if (doc_flags&DOF_MIN_SIZE)
|
||||
@@ -274,13 +297,16 @@ public Bool DocDo(CDoc *doc,I64 doc_flags=0)
|
||||
}
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
|
||||
DocQueRem(aux);
|
||||
DocQueInsRev(old_aux_doc,Fs->next_doc);
|
||||
DocDel(aux);
|
||||
DocQueRem(doc);
|
||||
DocQueIns(old_doc,Fs->last_doc);
|
||||
Fs->text_attr=old_attr;
|
||||
Fs->border_doc =old_border_doc;
|
||||
Fs->display_doc=old_display_doc;
|
||||
Fs->put_doc =old_put_doc;
|
||||
Fs->text_attr =old_attr;
|
||||
if (Fs->title_src!=TTS_LOCKED_CONST) {
|
||||
Fs->title_src =old_title_src;
|
||||
StrCpy(Fs->task_title,old_task_title);
|
||||
}
|
||||
Free(old_task_title);
|
||||
DocDel(bdoc);
|
||||
if (doc_flags&DOF_MIN_SIZE) {
|
||||
SetWinHorz(old_left,old_right);
|
||||
SetWinVert(old_top,old_bottom);
|
||||
@@ -302,6 +328,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name,
|
||||
CHashClass *tempc;
|
||||
CDoc *doc;
|
||||
Bool result=FALSE;
|
||||
I64 old_border_src=Fs->border_src;
|
||||
if (!(tempc=HashFind(class_name,Fs->hash_table,HTT_CLASS)))
|
||||
return FALSE;
|
||||
doc=DocNew;
|
||||
@@ -322,7 +349,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name,
|
||||
}
|
||||
if (footer) DocPutS(doc,footer);
|
||||
if (doc->root.next!=doc) {
|
||||
doc->flags&=~(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME);
|
||||
Fs->border_src=BDS_CONST;
|
||||
DocRecalc(doc);
|
||||
if (DocDo(doc,doc_flags)) {
|
||||
doc_e=doc->cur_entry;
|
||||
@@ -334,6 +361,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name,
|
||||
}
|
||||
}
|
||||
DocDel(doc);
|
||||
Fs->border_src=old_border_src;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -348,12 +376,12 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0)
|
||||
U8 *old_end_cb=Fs->task_end_cb;
|
||||
Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC);
|
||||
CDocEntry *doc_e;
|
||||
I64 old_doc_flags=m->flags,result=DOCM_CANCEL;
|
||||
I64 old_border_src=Fs->border_src,result=DOCM_CANCEL;
|
||||
Fs->task_end_cb=&DocMenuDoEndTaskCB;
|
||||
try {
|
||||
if (m) {
|
||||
StrCpy(m->desc,"Menu");
|
||||
m->flags&=~(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME);
|
||||
Fs->border_src=BDS_CONST;
|
||||
if (DocDo(m,doc_flags)) {
|
||||
doc_e=m->cur_entry;
|
||||
if (doc_e!=m) {
|
||||
@@ -369,8 +397,8 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0)
|
||||
Fs->catch_except=TRUE;
|
||||
}
|
||||
}
|
||||
m->flags|=old_doc_flags&(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME);
|
||||
LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc);
|
||||
Fs->border_src=old_border_src;
|
||||
Fs->task_end_cb=old_end_cb;
|
||||
return result;
|
||||
}
|
||||
@@ -378,21 +406,20 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0)
|
||||
#help_index "Doc"
|
||||
public I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL)
|
||||
{
|
||||
I64 result=0;
|
||||
I64 result;
|
||||
CSrvCmd *tempc;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
CTaskCmd *tempc;
|
||||
CTask *task=Spawn(&ServantUserCmdLine,NULL,"System",parent);
|
||||
CTask *task=Spawn(&SrvUserCmdLine,NULL,"System",,parent);
|
||||
if (!parent) {
|
||||
TaskRqstQue(task,parent,msg,1<<TASKCf_EXIT_ON_COMPLETE);
|
||||
TaskExeStrQue(task,parent,msg,1<<SVCf_EXIT_ON_COMPLETE|1<<SVCf_FREE_ON_COMPLETE);
|
||||
if (_pu_task) *_pu_task=task;
|
||||
Preempt(old_preempt);
|
||||
return 0;
|
||||
} else {
|
||||
Fs->popup_task=task;
|
||||
tempc=TaskRqstQue(task,parent,msg,
|
||||
1<<TASKCf_WAKE_MASTER | 1<<TASKCf_FOCUS_MASTER);
|
||||
tempc=TaskExeStrQue(task,parent,msg,1<<SVCf_WAKE_MASTER|1<<SVCf_FOCUS_MASTER);
|
||||
if (_pu_task) *_pu_task=task;
|
||||
GetRqstResult(tempc,&result);
|
||||
ScanResult(tempc,&result);
|
||||
Fs->popup_task=NULL;
|
||||
Kill(task);
|
||||
if (_pu_task) *_pu_task=NULL;
|
||||
@@ -405,8 +432,8 @@ public I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL)
|
||||
public CTask *PopUpViewDoc(CDoc *doc,I64 doc_flags=0)
|
||||
{
|
||||
U8 *buf=MSPrintF("if (!IsSysDeterministic) Preempt(ON);DocDo(0x%X,0x%X);",doc,doc_flags);
|
||||
CTask *task=Spawn(&ServantUserCmdLine,NULL,"View",Fs);
|
||||
TaskRqstQue(task,NULL,buf,1<<TASKCf_EXIT_ON_COMPLETE);
|
||||
CTask *task=Spawn(&SrvUserCmdLine,NULL,"View",,Fs);
|
||||
TaskExeStrQue(task,NULL,buf,1<<SVCf_EXIT_ON_COMPLETE|1<<SVCf_FREE_ON_COMPLETE);
|
||||
Free(buf);
|
||||
return task;
|
||||
}
|
||||
@@ -432,13 +459,13 @@ public CTask *PopUpViewStr(U8 *msg)
|
||||
public I64 PopUpMenu(CDoc *doc,I64 doc_flags=0)
|
||||
{
|
||||
doc->flags|=DOCF_MIN_SIZE | DOCF_FORM;
|
||||
return ServantUser("DocMenuDo(0x%X,0x%X);",doc,doc_flags);
|
||||
return SrvUser("DocMenuDo(0x%X,0x%X);",doc,doc_flags);
|
||||
}
|
||||
|
||||
public Bool PopUpForm(U8 *D,U8 *class_name,I64 doc_flags=DOF_MIN_SIZE,
|
||||
U8 *header=NULL,U8 *footer=NULL)
|
||||
{
|
||||
return ServantUser("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",D,class_name,
|
||||
return SrvUser("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",D,class_name,
|
||||
doc_flags,header,footer);
|
||||
}
|
||||
|
||||
@@ -495,7 +522,7 @@ public U8 *PopUpFileName(U8 *dft=NULL,I64 doc_flags=0)
|
||||
}
|
||||
|
||||
#help_index "Doc"
|
||||
public Bool PopUpCd()
|
||||
Bool PopUpCd()
|
||||
{
|
||||
Bool result;
|
||||
U8 *st=PopUpPickDir;
|
||||
@@ -512,6 +539,7 @@ public U8 *PopUpPickLstEntry(U8 *lst)
|
||||
{
|
||||
I64 i=0;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
while (*lst) {
|
||||
if (*lst=='@') { //Check for '@' alias lst entry
|
||||
i--;
|
||||
@@ -623,6 +651,7 @@ public I64 PopUpRangeI64(I64 lo,I64 hi,I64 step=1,U8 *header=NULL,U8 *footer=NUL
|
||||
CDoc *doc=DocNew;
|
||||
if (header)
|
||||
DocPutS(doc,header);
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
for (i=lo;i<=hi;i+=step)
|
||||
DocPrintF(doc,"$$MU,\"%d\",%d$$\n",i,i);
|
||||
if (footer)
|
||||
@@ -641,6 +670,7 @@ public F64 PopUpRangeF64(F64 lo,F64 hi,F64 step,
|
||||
CDoc *doc=DocNew;
|
||||
if (header)
|
||||
DocPutS(doc,header);
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
for (d=lo;d<=hi;d+=step) {
|
||||
SPrintF(buf,fmt,d);
|
||||
DocPrintF(doc,"$$MU,\"%s\",0x%X$$\n",buf,d);
|
||||
@@ -661,6 +691,7 @@ public F64 PopUpRangeF64Exp(F64 lo,F64 hi,F64 factor,
|
||||
CDoc *doc=DocNew;
|
||||
if (header)
|
||||
DocPutS(doc,header);
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
for (d=lo;d<=hi;d*=factor) {
|
||||
SPrintF(buf,fmt,d);
|
||||
DocPrintF(doc,"$$MU,\"%s\",0x%X$$\n",buf,d);
|
||||
@@ -678,7 +709,7 @@ public F64 PopUpRangeF64Log(F64 lo,F64 hi,I64 steps,
|
||||
return PopUpRangeF64Exp(lo,hi,Exp(Ln(hi/lo)/(steps-1)),fmt,header,footer);
|
||||
}
|
||||
|
||||
#help_index "Task/Rqsts"
|
||||
#help_index "Task/Requests"
|
||||
public I64 AdamFile(U8 *filename,Bool warn_ext=TRUE)
|
||||
{
|
||||
Bool okay=TRUE;
|
||||
@@ -725,8 +756,7 @@ public I64 PopUpColor(U8 *header=NULL,Bool allow_transparent=TRUE,Bool allow_dft
|
||||
if (header)
|
||||
DocPutS(doc,header);
|
||||
if (allow_transparent)
|
||||
DocPutS(doc,"$$BG,WHITE$$$$MU,\"TRANSPARENT\",COLOR_TRANSPARENT$$$$BG$$\n");
|
||||
DocPutS(doc,"$$FM,BLACK$$");
|
||||
DocPutS(doc,"$$MU,\"TRANSPARENT\",COLOR_TRANSPARENT$$\n");
|
||||
for (i=0;i<16;i++)
|
||||
DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-8Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",i);
|
||||
if (allow_dft)
|
||||
@@ -736,18 +766,25 @@ public I64 PopUpColor(U8 *header=NULL,Bool allow_transparent=TRUE,Bool allow_dft
|
||||
return i;
|
||||
}
|
||||
|
||||
public I64 PopUpLightingColor(U8 *header=NULL)
|
||||
public I64 PopUpColorLighting(U8 *header=NULL)
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
if (header)
|
||||
DocPutS(doc,header);
|
||||
DocPutS(doc,"\n$$FM,BLACK$$Single-Sided Full-Range Double-Sided Full-Range\n");
|
||||
DocPutS(doc,"\nSingle-Sided means both sides same color."
|
||||
"\nDouble-Sided means back side darker."
|
||||
"\n"
|
||||
"\nHalf-Range means 0 to [0,7]"
|
||||
"\n [8,15]-8 to [8,15]"
|
||||
"\nFull-Range means 0 to [0,7] to [0,7]+8"
|
||||
"\n");
|
||||
DocPutS(doc,"\n$$FG,LTPURPLE$$Single-Sided Full-Range Double-Sided Full-Range\n$$FG,BLACK$$");
|
||||
for (i=0;i<8;i++) {
|
||||
DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$ ",i,i,"ST_COLORS",i);
|
||||
DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",ROPF_TWO_SIDED+i);
|
||||
}
|
||||
DocPutS(doc,"\nSingle-Sided Half-Range Double-Sided Half-Range\n");
|
||||
DocPutS(doc,"\n$$FG,LTPURPLE$$Single-Sided Half-Range Double-Sided Half-Range\n$$FG,BLACK$$");
|
||||
for (i=0;i<16;i++) {
|
||||
DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$ ",i,i,"ST_COLORS",ROPF_HALF_RANGE_COLOR+i);
|
||||
DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",ROPF_TWO_SIDED+ROPF_HALF_RANGE_COLOR+i);
|
||||
@@ -806,7 +843,7 @@ Bool PopUpTransform(I64 *r)
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
I64 i,j,i1,j1;
|
||||
CDoc *doc=DocCur(task);
|
||||
CDoc *doc=DocPut(task);
|
||||
for (j=0;j<17;j++)
|
||||
for (i=0;i<17;i++) {
|
||||
if (j<16)
|
||||
@@ -831,8 +868,8 @@ I64 DitherColorDo(U8 *header=NULL)
|
||||
I64 msg_code,p1,p2,result=-1,i,j;
|
||||
DocClear;
|
||||
"" header;
|
||||
DocRecalc(DocCur);
|
||||
NamedFramePtrAdd("DitherDoFrame",(DocCur->max_y+1)*FONT_HEIGHT);
|
||||
DocRecalc(DocPut);
|
||||
NamedFramePtrAdd("DitherDoFrame",(DocPut->max_y+1)*FONT_HEIGHT);
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
Fs->draw_it=&DrawIt;
|
||||
do {
|
||||
@@ -857,7 +894,7 @@ dcd_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 PopUpDitherColor(U8 *header=NULL)
|
||||
public I64 PopUpColorDither(U8 *header=NULL)
|
||||
{
|
||||
U8 buf[136];
|
||||
SPrintF(buf,"DitherColorDo(0x%X);",header);
|
||||
|
||||
+147
-289
@@ -24,14 +24,14 @@ public U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC_ALL)
|
||||
Bool unlock;
|
||||
CTask *task;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
unlock=DocLock(doc);
|
||||
task=doc->win_task;
|
||||
DocRecalc(doc,FALSE,recalc);
|
||||
if (!(doc->flags&DOCF_AUX_DOC))
|
||||
if (!(doc->flags&DOCF_BORDER_DOC))
|
||||
doc->cur_top_line_num=doc->y-(task->win_height+1)>>1;
|
||||
LockToPage(doc);
|
||||
if (unlock)
|
||||
@@ -103,23 +103,23 @@ U0 DocBorderLstDraw(CDoc *doc)
|
||||
}
|
||||
|
||||
U8 doc_spaces[9]=
|
||||
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0};
|
||||
{CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,0};
|
||||
|
||||
Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
{
|
||||
I64 i,ii,j,k,x,x0,y,y0,D,d2,col,col2,best_col=0,best_d=MAX_I64,xx,yy,zz,
|
||||
num_entries=0,ijif,cur_u8_attr,temp_u32_attr,
|
||||
hide_collapsed[2],
|
||||
cursor_y=MIN_I64,left_margin,right_margin,
|
||||
y_plot_top,y_plot_bottom,
|
||||
top,left,bottom,right,width,height,scroll_x,scroll_y,
|
||||
pixel_top,pixel_left;
|
||||
num_entries=0,ijif,cur_u8_attr,temp_u32_attr,
|
||||
hide_collapsed[2],
|
||||
cursor_y=MIN_I64,left_margin,right_margin,
|
||||
y_plot_top,y_plot_bottom,
|
||||
top,left,bottom,right,width,height,scroll_x,scroll_y,
|
||||
pixel_top,pixel_left;
|
||||
CDocEntry reg *doc_e,reg *doc_e2,*best_do_e,*alias,*next_clear_found=NULL;
|
||||
CDocBin *tempb;
|
||||
CDocSettings *s;
|
||||
Bool del_cl,skipped_update,tree_collapsed,
|
||||
resize=FALSE,same_win,more=FALSE,find_cursor=FALSE,
|
||||
blink_flag,full_refresh=TRUE,unlock;
|
||||
resize=FALSE,same_win,more=FALSE,find_cursor=FALSE,
|
||||
blink_flag,full_refresh=TRUE,unlock;
|
||||
CTask *win_task,*mem_task;
|
||||
CDC *dc;
|
||||
U8 *bptr,*ptr,buf[136],ch;
|
||||
@@ -154,19 +154,19 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
nobound_switch (recalc) {
|
||||
case DOC_RECALC_FIND_CURSOR:
|
||||
if (win_task)
|
||||
dc=DCAlias(gr_dc,win_task);
|
||||
dc=DCAlias(gr_dc2,win_task);
|
||||
find_cursor=TRUE;
|
||||
case DOC_RECALC_ALL:
|
||||
doc->recalc_start=doc;
|
||||
break;
|
||||
case DOC_RECALC_TO_SCREEN:
|
||||
if (doc->refresh_cnt++%(ToI64(win_actual_refresh/10)+1) &&
|
||||
!Bt(&doc->flags,DOCf_DO_FULL_REFRESH) &&
|
||||
!(doc->flags&DOCF_BACKWARD_MOVEMENT))
|
||||
!Bt(&doc->flags,DOCf_DO_FULL_REFRESH) &&
|
||||
!(doc->flags&DOCF_BACKWARD_MOVEMENT))
|
||||
full_refresh=FALSE;
|
||||
doc->recalc_start=doc;
|
||||
if (win_task)
|
||||
dc=DCAlias(gr_dc,win_task);
|
||||
dc=DCAlias(gr_dc2,win_task);
|
||||
break;
|
||||
case DOC_RECALC_PARTIAL:
|
||||
DocRemSoftNewLines(doc,doc->recalc_start);
|
||||
@@ -188,14 +188,14 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
left_margin=left;
|
||||
right_margin=right;
|
||||
PopFD;
|
||||
if (doc->flags&DOCF_AUX_DOC) {
|
||||
if (doc->flags&DOCF_BORDER_DOC) {
|
||||
scroll_x=0;
|
||||
scroll_y=0;
|
||||
}
|
||||
best_do_e=doc->cur_entry;
|
||||
|
||||
if (!(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS)) &&
|
||||
FilesFindMatch(FILENAME_MASK_SRC,doc->filename.name))
|
||||
FilesFindMatch(FILENAME_MASK_SRC,doc->filename.name))
|
||||
doc->flags|=DOCF_HIGHLIGHT;
|
||||
else
|
||||
doc->flags&=~DOCF_HIGHLIGHT;
|
||||
@@ -214,41 +214,44 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
|
||||
hss=&win_task->horz_scroll;
|
||||
vss=&win_task->vert_scroll;
|
||||
if (doc->flags&DOCF_AUX_DOC) {
|
||||
if (doc->flags&DOCF_BORDER_DOC) {
|
||||
doc->cur_top_line_num=0;
|
||||
doc->line_start_col=0;
|
||||
has_cursor=FALSE;
|
||||
} else if (has_cursor && full_refresh) {
|
||||
if (Bt(&hss->flags,WSSf_SET_TO_POS)||Bt(&vss->flags,WSSf_SET_TO_POS)) {
|
||||
if (!(doc->flags&DOCF_NO_SCROLL_BARS)) {
|
||||
if (Bt(&hss->flags,WSSf_SET_TO_POS)) {
|
||||
doc->line_start_col=hss->pos;
|
||||
LBtr(&hss->flags,WSSf_SET_TO_POS);
|
||||
}
|
||||
if (Bt(&vss->flags,WSSf_SET_TO_POS)) {
|
||||
doc->cur_top_line_num=vss->pos;
|
||||
LBtr(&vss->flags,WSSf_SET_TO_POS);
|
||||
doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=win_task->border_attr;
|
||||
} else {
|
||||
if (has_cursor && full_refresh) {
|
||||
if (Bt(&hss->flags,WSSf_SET_TO_POS)||Bt(&vss->flags,WSSf_SET_TO_POS)) {
|
||||
if (!(doc->flags&DOCF_NO_SCROLL_BARS)) {
|
||||
if (Bt(&hss->flags,WSSf_SET_TO_POS)) {
|
||||
doc->line_start_col=hss->pos;
|
||||
LBtr(&hss->flags,WSSf_SET_TO_POS);
|
||||
}
|
||||
if (Bt(&vss->flags,WSSf_SET_TO_POS)) {
|
||||
doc->cur_top_line_num=vss->pos;
|
||||
LBtr(&vss->flags,WSSf_SET_TO_POS);
|
||||
}
|
||||
}
|
||||
doc->x=doc->line_start_col+width/2;
|
||||
doc->y=doc->cur_top_line_num+height/2;
|
||||
find_cursor=TRUE;
|
||||
doc->recalc_start=doc;
|
||||
}
|
||||
doc->x=doc->line_start_col+width/2;
|
||||
doc->y=doc->cur_top_line_num+height/2;
|
||||
find_cursor=TRUE;
|
||||
doc->recalc_start=doc;
|
||||
}
|
||||
doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=win_task->text_attr;
|
||||
}
|
||||
x0=doc->line_start_col;
|
||||
y0=doc->cur_top_line_num;
|
||||
doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=doc->start_text_attr;
|
||||
same_win=top ==doc->old_win_top &&
|
||||
bottom==doc->old_win_bottom &&
|
||||
left ==doc->old_win_left &&
|
||||
right ==doc->old_win_right &&
|
||||
doc->cur_entry==doc->old_cur_entry &&
|
||||
doc->cur_data_col==doc->old_cur_data_col;
|
||||
bottom==doc->old_win_bottom &&
|
||||
left ==doc->old_win_left &&
|
||||
right ==doc->old_win_right &&
|
||||
doc->cur_entry==doc->old_cur_entry &&
|
||||
doc->cur_data_col==doc->old_cur_data_col;
|
||||
if (recalc==DOC_RECALC_TO_SCREEN) {
|
||||
y_plot_top=y0-scroll_y/FONT_HEIGHT;
|
||||
y_plot_bottom=y0+height-1-scroll_y/FONT_HEIGHT;
|
||||
if (!(doc->flags&DOCF_AUX_DOC) && !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
if (!(doc->flags&DOCF_BORDER_DOC) && !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
DocBorderLstDraw(doc);
|
||||
}
|
||||
|
||||
@@ -264,17 +267,19 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
i=doc->ww_lines_back;
|
||||
ii=i/2; //Threshold for stopping on SOFT_CR
|
||||
while (i-- && doc_e->type_u8!=DOCT_NEW_LINE &&
|
||||
(i>ii || doc_e->type_u8!=DOCT_SOFT_NEW_LINE) &&
|
||||
doc_e->flags1 & DOCEF1_WORD_WRAP &&
|
||||
doc_e->last!=doc)
|
||||
(i>ii || doc_e->type_u8!=DOCT_SOFT_NEW_LINE) &&
|
||||
doc_e->flags1 & DOCEF1_WORD_WRAP &&
|
||||
doc_e->last!=doc)
|
||||
doc_e=doc_e->last;
|
||||
x=doc_e->x; y=doc_e->y;
|
||||
doc->page_line_num=doc_e->page_line_num;
|
||||
}
|
||||
|
||||
s=DocSettingsLast(doc_e);
|
||||
if (doc_e==doc->root.next)
|
||||
s=&doc->settings_root;
|
||||
else
|
||||
s=DocSettingsLast(doc_e);
|
||||
doc->flags=doc_e->flags1& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) |
|
||||
doc->flags&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
doc->flags&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
cur_u8_attr=s->cur_text_attr;
|
||||
if (doc_e==doc->root.next) {
|
||||
doc->flags&=~DOCF_BACKWARD_MOVEMENT;
|
||||
@@ -282,7 +287,7 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL)
|
||||
doc->flags&=~DOCF_HAS_SONG;
|
||||
} else
|
||||
doc->flags=doc_e->flags1& DOCEF1_HIGHLIGHT |
|
||||
doc->flags&~DOCEF1_HIGHLIGHT;
|
||||
doc->flags&~DOCEF1_HIGHLIGHT;
|
||||
|
||||
if (doc->root.next==doc) {
|
||||
best_do_e=doc;
|
||||
@@ -352,10 +357,10 @@ word_wrap_start:
|
||||
}
|
||||
}
|
||||
if (doc_e->type_u8==DOCT_TEXT &&
|
||||
!(doc_e->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
!(doc_e->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc_e->flags1==doc_e2->flags1 && doc_e->flags2==doc_e2->flags2 &&
|
||||
doc_e->type==doc_e2->type) {
|
||||
doc_e->type==doc_e2->type) {
|
||||
j=StrLen(doc_e2->tag);
|
||||
ptr=MAlloc(k+j+1,mem_task);
|
||||
MemCpy(ptr,doc_e->tag,k);
|
||||
@@ -383,8 +388,8 @@ word_wrap2:
|
||||
if (doc_e->flags1 & DOCEF1_SCROLLING_X)
|
||||
k=doc_e->scroll_len;
|
||||
if (doc_e->flags1 &
|
||||
(DOCEF1_LEFT_X|DOCEF1_RIGHT_X|DOCEF1_CENTER_X|
|
||||
DOCEF1_TOP_Y|DOCEF1_BOTTOM_Y|DOCEF1_CENTER_Y)) {
|
||||
(DOCEF1_LEFT_X|DOCEF1_RIGHT_X|DOCEF1_CENTER_X|
|
||||
DOCEF1_TOP_Y|DOCEF1_BOTTOM_Y|DOCEF1_CENTER_Y)) {
|
||||
if (doc_e->flags1 & DOCEF1_MARGIN_REL_X) {
|
||||
if (doc_e->flags1 & DOCEF1_LEFT_X)
|
||||
x=left_margin-left;
|
||||
@@ -425,7 +430,7 @@ word_wrap2:
|
||||
else
|
||||
doc->page_line_num=doc->page_line_num%s->page_len;
|
||||
if (s->header!=DOC_DFT &&
|
||||
doc->page_line_num<s->header) {
|
||||
doc->page_line_num<s->header) {
|
||||
y+=s->header-doc->page_line_num;
|
||||
doc->page_line_num=s->header;
|
||||
}
|
||||
@@ -457,8 +462,8 @@ word_wrap2:
|
||||
i=right_margin+1-(x+left); //Space left on line
|
||||
ii=x+1-s->left_margin;
|
||||
if (doc_e->type_u8==DOCT_TEXT &&
|
||||
!(doc_e->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
!(doc_e->flags1&DOCEG1_DONT_EDIT) &&
|
||||
!(doc_e->flags2&DOCEG2_DONT_EDIT)) {
|
||||
if (doc->cur_entry==doc_e->next) {
|
||||
if (doc->cur_data_col==doc_e->next->min_col)
|
||||
i--;
|
||||
@@ -471,7 +476,7 @@ word_wrap2:
|
||||
if (k>i) {
|
||||
for (j=i;j>8-ii && j>=0;j--)
|
||||
if (doc_e->tag[j]==CH_SPACE ||
|
||||
doc_e->tag[j]==CH_SHIFT_SPACE) {
|
||||
doc_e->tag[j]==CH_SHIFT_SPACE) {
|
||||
i=j+1;
|
||||
break;
|
||||
}
|
||||
@@ -506,12 +511,12 @@ word_wrap2:
|
||||
if (k>=i) {
|
||||
doc_e2=doc_e->last;
|
||||
if (doc_e2->type_u8!=DOCT_SOFT_NEW_LINE &&
|
||||
doc_e2->type_u8!=DOCT_NEW_LINE &&
|
||||
doc_e2->type_u8!=DOCT_CURSOR_MOVEMENT) {
|
||||
doc_e2->type_u8!=DOCT_NEW_LINE &&
|
||||
doc_e2->type_u8!=DOCT_CURSOR_MOVEMENT) {
|
||||
doc_e2=CAlloc(sizeof(CDocEntryBase),mem_task);
|
||||
doc_e2->type=DOCT_SOFT_NEW_LINE | doc_e->type & 0xFFFFFF00;
|
||||
doc_e2->flags1=DOCEF1_WORD_WRAP |
|
||||
doc_e->flags1 & (DOCEF1_LOCK_TO_PAGE|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_CENTER|DOCG_BL_IV_UL|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP);
|
||||
doc_e->flags1 & (DOCEF1_LOCK_TO_PAGE|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_CENTER|DOCG_BL_IV_UL|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP);
|
||||
doc_e2->x=x;
|
||||
doc_e2->y=y;
|
||||
doc_e2->page_line_num=doc_e->last->page_line_num;
|
||||
@@ -540,40 +545,41 @@ skip_soft_cr:
|
||||
col2=0;
|
||||
|
||||
doc_e->flags1=doc->flags& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) |
|
||||
doc_e->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
doc_e->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
temp_u32_attr=(cur_u8_attr&0xF0)<<8|doc->flags&DOCG_BL_IV_UL|(s->shifted_x&0x1F)<<16|(s->shifted_y&0x1F)<<21;
|
||||
switch (doc_e->type_u8) {
|
||||
case DOCT_SPRITE:
|
||||
if (doc_e->flags1 & DOCEF1_LINK)
|
||||
temp_u32_attr.u8[1]|=s->link_attr&15;
|
||||
else if (doc_e->flags1 & (DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP))
|
||||
temp_u32_attr.u8[1]|=s->macro_attr&15;
|
||||
if (doc_e->flags1 & DOCEF1_LEFT_EXP)
|
||||
temp_u32_attr.u8[1]|=cur_u8_attr&15;
|
||||
else if (doc_e->flags1 & DOCEF1_LINK)
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_LINK;
|
||||
else if (doc_e->flags1 & DOCEF1_LEFT_MACRO)
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_MACRO;
|
||||
else if (doc_e->flags1 & DOCEF1_TREE)
|
||||
temp_u32_attr.u8[1]|=s->tree_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_TREE;
|
||||
else
|
||||
temp_u32_attr.u8[1]|=s->bin_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_BIN;
|
||||
break;
|
||||
case DOCT_HTML_IMG:
|
||||
case DOCT_HTML_VIDEO:
|
||||
case DOCT_HTML_CODE:
|
||||
temp_u32_attr.u8[1]|=s->bin_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_BIN;
|
||||
break;
|
||||
case DOCT_LINK:
|
||||
temp_u32_attr.u8[1]|=s->link_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_LINK;
|
||||
break;
|
||||
case DOCT_MACRO:
|
||||
case DOCT_MENU_VAL:
|
||||
temp_u32_attr.u8[1]|=s->macro_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_MACRO;
|
||||
break;
|
||||
case DOCT_ANCHOR:
|
||||
temp_u32_attr.u8[1]|=s->anchor_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_ANCHOR;
|
||||
break;
|
||||
case DOCT_TREE:
|
||||
temp_u32_attr.u8[1]|=s->tree_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_TREE;
|
||||
break;
|
||||
case DOCT_HIDE_START:
|
||||
case DOCT_HIDE_END:
|
||||
temp_u32_attr.u8[1]|=s->hidden_attr&15;
|
||||
temp_u32_attr.u8[1]|=DOC_COLOR_HIDDEN;
|
||||
break;
|
||||
default:
|
||||
temp_u32_attr.u8[1]|=cur_u8_attr&15;
|
||||
@@ -604,10 +610,10 @@ skip_soft_cr:
|
||||
}
|
||||
} else if (doc_e->flags1 & DOCEF1_HAS_BIN) {
|
||||
if (*ptr=='<') {
|
||||
temp_u32_attr=temp_u32_attr & 0xFFFFF000 | (s->bin_attr&0xF)<<8;
|
||||
temp_u32_attr=temp_u32_attr & 0xFFFFF000 | DOC_COLOR_BIN<<8;
|
||||
doc_e->type.u8[1]=temp_u32_attr.u8[1];
|
||||
if (doc_e==doc->cur_entry && doc_e->type_u8!=DOCT_TEXT)
|
||||
temp_u32_attr^=0x0F00;
|
||||
temp_u32_attr^=0x0F00;
|
||||
if (full_refresh && '0'<=ptr[1]<='9') {
|
||||
SPrintF(buf,"<%d>",doc_e->bin_num);
|
||||
k=StrLen(buf);
|
||||
@@ -646,7 +652,7 @@ skip_soft_cr:
|
||||
ijif=cur_time*FONT_WIDTH*DOC_SCROLL_SPEED;
|
||||
ijif%=j*FONT_WIDTH;
|
||||
temp_u32_attr=temp_u32_attr & 0xFFE0FF00|
|
||||
(FONT_WIDTH-1-ijif&(FONT_WIDTH-1))<<16;
|
||||
(FONT_WIDTH-1-ijif&(FONT_WIDTH-1))<<16;
|
||||
#assert FONT_WIDTH==8
|
||||
ijif>>=3;
|
||||
for (k=0;k<doc_e->scroll_len;k++) {
|
||||
@@ -654,14 +660,14 @@ skip_soft_cr:
|
||||
if (!Bt(displayable_chars_bitmap,ch)) ch='.';
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) {
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
else
|
||||
PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (find_cursor) {
|
||||
D=DocCharDist(doc,doc_e->x,doc_e->y);
|
||||
col=doc_e->min_col;
|
||||
@@ -669,18 +675,18 @@ skip_soft_cr:
|
||||
col2=doc_e->scroll_len; //TODO This is flawed
|
||||
} else {
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
while (ch=*ptr++) {
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW))
|
||||
PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
else
|
||||
if (find_cursor) {
|
||||
d2=DocCharDist(doc,x,y);
|
||||
if (d2<D) {
|
||||
D=d2;
|
||||
col=col2;
|
||||
if (d2<D) {
|
||||
D=d2;
|
||||
col=col2;
|
||||
}
|
||||
}
|
||||
}
|
||||
col2++;
|
||||
x++;
|
||||
}
|
||||
@@ -723,8 +729,8 @@ skip_soft_cr:
|
||||
nobound_switch (doc_e->type_u8) {
|
||||
case DOCT_TEXT:
|
||||
if (!col2 &&
|
||||
!(doc_e->flags1&(DOCEF1_TREE|DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) &&
|
||||
!(doc_e->flags2&DOCEF2_BIN_PTR_LINK))
|
||||
!(doc_e->flags1&(DOCEF1_TREE|DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) &&
|
||||
!(doc_e->flags2&DOCEF2_BIN_PTR_LINK))
|
||||
del_cl=TRUE;
|
||||
break;
|
||||
case DOCT_HEX_ED:
|
||||
@@ -742,7 +748,7 @@ skip_soft_cr:
|
||||
while (ch=*ptr++) {
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) {
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
else
|
||||
PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
@@ -763,7 +769,7 @@ skip_soft_cr:
|
||||
while (ch=*ptr++) {
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) {
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
else
|
||||
PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
@@ -787,7 +793,7 @@ skip_soft_cr:
|
||||
if (!Bt(displayable_chars_bitmap,ch)) ch='.';
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) {
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER))
|
||||
PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
else
|
||||
PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0);
|
||||
@@ -809,7 +815,7 @@ skip_soft_cr:
|
||||
case DOCT_TAB:
|
||||
k=(x+8) & ~7;
|
||||
if (doc_e->flags1 & DOCEF1_BORDER_PLOT &&
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
!Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
while (x<k) {
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW))
|
||||
PlotBorderU8(win_task,temp_u32_attr+CH_SPACE,x-x0,y-y0);
|
||||
@@ -842,9 +848,9 @@ skip_soft_cr:
|
||||
case DOCT_NEW_LINE:
|
||||
case DOCT_SOFT_NEW_LINE:
|
||||
if (recalc==DOC_RECALC_TO_SCREEN &&
|
||||
!(doc_e->flags1&DOCEF1_DONT_DRAW)&& y_plot_top<=y<=y_plot_bottom)
|
||||
!(doc_e->flags1&DOCEF1_DONT_DRAW)&& y_plot_top<=y<=y_plot_bottom)
|
||||
PlotWinAttr(win_task,width-(x-x0),
|
||||
cur_u8_attr<<8,x-x0,y-y0);
|
||||
cur_u8_attr<<8,x-x0,y-y0);
|
||||
if (doc_e->flags1&DOCEF1_HIGHLIGHT) {
|
||||
if (s->state&7==DOCSS_CPP_Z_COMMENT) {
|
||||
if (full_refresh) {
|
||||
@@ -1019,8 +1025,6 @@ adjust_xy:
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW))
|
||||
win_task->text_attr=cur_u8_attr;
|
||||
break;
|
||||
case DOCT_DFT_FOREGROUND:
|
||||
cur_u8_attr&=0xF0;
|
||||
@@ -1049,113 +1053,14 @@ adjust_xy:
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW))
|
||||
win_task->text_attr=cur_u8_attr;
|
||||
break;
|
||||
case DOCT_ALT_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->alt_text_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_LINK_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->link_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_MACRO_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->macro_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_ANCHOR_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->anchor_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_HIDDEN_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->hidden_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_TREE_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->tree_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_USER_FOREGROUND:
|
||||
if (doc_e->attr==DOC_DFT) {
|
||||
cur_u8_attr=cur_u8_attr&0xF0|s->user_attr&0x0F;
|
||||
if (y==cursor_y) {
|
||||
doc->cur_entry=doc_e->next;
|
||||
doc->cur_data_col=doc->cur_entry->min_col;
|
||||
}
|
||||
} else {
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->user_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
case DOCT_PMT:
|
||||
cur_u8_attr=cur_u8_attr&0xF0|DOC_COLOR_PMT;
|
||||
if (y==cursor_y) {
|
||||
doc->cur_entry=doc_e->next;
|
||||
doc->cur_data_col=doc->cur_entry->min_col;
|
||||
}
|
||||
break;
|
||||
case DOCT_BINARY_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->bin_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_KEYWORD_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->keyword_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_KEYWORD2_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->keyword2_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_COMMENT_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->comment_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_QUOTE_FOREGROUND:
|
||||
if (full_refresh) {
|
||||
s=DocSettingsIdentical(doc,s);
|
||||
s->quote_attr=doc_e->attr;
|
||||
QueIns(s,doc->settings_root.last);
|
||||
} else
|
||||
s=DocSettingsNext(doc_e->next);
|
||||
break;
|
||||
case DOCT_WORD_WRAP:
|
||||
if (doc_e->attr)
|
||||
doc->flags|=DOCF_WORD_WRAP;
|
||||
@@ -1347,7 +1252,10 @@ adjust_xy:
|
||||
doc_e->max_col=1;
|
||||
break;
|
||||
default:
|
||||
doc_e->max_col= doc_e->flags1 & DOCEF1_TREE ? 1:col2;
|
||||
if (doc_e->flags1 & DOCEF1_TREE)
|
||||
doc_e->max_col=1;
|
||||
else
|
||||
doc_e->max_col=col2;
|
||||
}
|
||||
|
||||
if (x>doc->max_x) doc->max_x=x;
|
||||
@@ -1441,7 +1349,7 @@ skip:
|
||||
doc_e2->settings=s;
|
||||
doc_e2->type.u8[1]=cur_u8_attr;
|
||||
doc_e2->flags1=doc->flags& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) |
|
||||
doc_e2->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
doc_e2->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER);
|
||||
}
|
||||
doc_e2=doc_e2->next;
|
||||
}
|
||||
@@ -1526,11 +1434,9 @@ skip:
|
||||
doc->cur_entry=best_do_e;
|
||||
doc->cur_data_col=best_col;
|
||||
DocFormBackward(doc);
|
||||
|
||||
//We need this because text coordinates are used
|
||||
//We need this because text coordinates are used
|
||||
if (best_d<FONT_WIDTH)
|
||||
best_d=0;
|
||||
|
||||
doc->best_d=best_d;
|
||||
}
|
||||
|
||||
@@ -1546,7 +1452,7 @@ skip:
|
||||
doc->x+=x>>1*3+x&1;
|
||||
else
|
||||
doc->x+=doc->cur_entry->hex_ed_width*3+
|
||||
(x-doc->cur_entry->hex_ed_width<<1);
|
||||
(x-doc->cur_entry->hex_ed_width<<1);
|
||||
}
|
||||
doc->line=doc->y+1;
|
||||
doc->col=doc->x+1;
|
||||
@@ -1589,8 +1495,8 @@ skip:
|
||||
x=doc->x-doc->line_start_col+left +scroll_x/FONT_WIDTH;
|
||||
y=doc->y-doc->cur_top_line_num+top+scroll_y/FONT_HEIGHT;
|
||||
if (0<=x<=right && 0<=y<=bottom &&
|
||||
x<TEXT_COLS && y<TEXT_ROWS &&
|
||||
!(doc->flags&DOCF_HIDE_CURSOR)) {
|
||||
x<TEXT_COLS && y<TEXT_ROWS &&
|
||||
!(doc->flags&DOCF_HIDE_CURSOR)) {
|
||||
u32_ptr=gr_text_base+y*TEXT_COLS+x;
|
||||
*u32_ptr|=DOCET_BLINK;
|
||||
*u32_ptr^=0xFF00;
|
||||
@@ -1646,11 +1552,11 @@ skip:
|
||||
|
||||
public U0 DocInsSafe(CDoc *doc,U8 *st)
|
||||
{ //This is necessary when hidden text might screw-up
|
||||
//inserts. It does them all-at-once.
|
||||
//inserts. It does them all-at-once.
|
||||
Bool unlock;
|
||||
I64 old_flags;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
@@ -1668,7 +1574,7 @@ public U0 DocBottom(CDoc *doc=NULL)
|
||||
{
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
@@ -1684,7 +1590,7 @@ public U0 DocTop(CDoc *doc=NULL)
|
||||
{
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
@@ -1700,7 +1606,7 @@ public U0 DocClear(CDoc *doc=NULL)
|
||||
{
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
@@ -1715,7 +1621,7 @@ public U0 DocClear(CDoc *doc=NULL)
|
||||
public Bool DocCursor(Bool show=OFF,CDoc *doc=NULL)
|
||||
{
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1725,62 +1631,19 @@ public Bool DocCursor(Bool show=OFF,CDoc *doc=NULL)
|
||||
public Bool DocScroll(Bool val=OFF,CDoc *doc=NULL)
|
||||
{
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return FALSE;
|
||||
}
|
||||
return !LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!val);
|
||||
}
|
||||
|
||||
I64 DocBkColor(CDoc *doc,I64 col)
|
||||
{
|
||||
CDocSettings *s=&doc->settings_root;
|
||||
I64 result=doc->start_text_attr>>4&15;
|
||||
col=(col&15)<<4;
|
||||
doc->start_text_attr=doc->start_text_attr&15+col;
|
||||
s->cur_text_attr =s->cur_text_attr&15+col;
|
||||
s->dft_text_attr =s->dft_text_attr&15+col;
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 DocCurAttr(I64 attr=WHITE<<4+BLUE,CTask *task=NULL)
|
||||
{
|
||||
CDoc *doc;
|
||||
I64 result=0;
|
||||
if (!task) task=Fs;
|
||||
result=task->text_attr;
|
||||
if (doc=DocCur(task)) {
|
||||
result=doc->start_text_attr;
|
||||
doc->start_text_attr=attr;
|
||||
DocBkColor(doc,attr>>4);
|
||||
}
|
||||
task->text_attr=attr;
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 DocAuxAttr(I64 attr=WHITE<<4+BLUE,CTask *task=NULL)
|
||||
{ //This will probably be ineffective since the
|
||||
//$LK,"DOCF_ATTR_BY_PRT","MN:DOCF_ATTR_BY_PRT"$ or $LK,"DOCF_ATTR_BY_FILENAME","MN:DOCF_ATTR_BY_FILENAME"$ flag is probably set
|
||||
//which means $LK,"SetDrvTextAttr","MN:SetDrvTextAttr"$() is overriding it.
|
||||
CDoc *doc;
|
||||
I64 result=0;
|
||||
if (!task) task=Fs;
|
||||
result=task->border_attr;
|
||||
if (doc=DocAux(task)) {
|
||||
result=doc->start_text_attr;
|
||||
doc->start_text_attr=attr;
|
||||
DocBkColor(doc,attr>>4);
|
||||
}
|
||||
task->border_attr=attr;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 DocCollapse(Bool collapse=TRUE,CDoc *doc=NULL)
|
||||
{
|
||||
CDocEntry *doc_e;
|
||||
Bool unlock;
|
||||
if (!doc) {
|
||||
doc=DocCur;
|
||||
doc=DocPut;
|
||||
if (!doc)
|
||||
return;
|
||||
}
|
||||
@@ -1800,43 +1663,38 @@ public U0 DocCollapse(Bool collapse=TRUE,CDoc *doc=NULL)
|
||||
U0 DocUpdateTaskDocs(CTask *task)
|
||||
{
|
||||
CPrt *p;
|
||||
I64 attr=task->border_attr;
|
||||
CDoc *doc=task->last_doc;
|
||||
CDoc *doc;
|
||||
CD3I64 saved_scroll;
|
||||
Bool old_preempt=Preempt(OFF),okay=TRUE;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc)) {
|
||||
if (!(doc->flags&DOCF_DONT_SHOW)) {
|
||||
if (doc->flags&DOCF_AUX_DOC) {
|
||||
if (attr&0xF!=attr>>4)
|
||||
doc->start_text_attr=attr;
|
||||
WinScrollNull(task,&saved_scroll);
|
||||
okay=DocRecalc(doc,FALSE,DOC_RECALC_TO_SCREEN);
|
||||
WinScrollRestore(task,&saved_scroll);
|
||||
} else {
|
||||
if (doc->flags&DOCF_ATTR_BY_PRT) {
|
||||
p=task->cur_prt;
|
||||
attr=p->text_attr;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
I64 border_attr;
|
||||
if (task->border_src==BDS_CUR_PRT && task->cur_prt) {
|
||||
border_attr=task->cur_prt->text_attr;
|
||||
if (border_attr&15!=border_attr>>4)
|
||||
task->border_attr=border_attr;
|
||||
}
|
||||
if (task->title_src==TTS_TASK_NAME)
|
||||
StrCpy(task->task_title,task->task_name);
|
||||
if ((doc=DocDisplay(task)) && !(doc->flags&DOCF_DONT_SHOW)) {
|
||||
if (task->border_src==BDS_ED_FILENAME_PRT) {
|
||||
try {
|
||||
if (p=Drv2Prt(*doc->filename.name)) {
|
||||
border_attr=p->text_attr;
|
||||
if (border_attr&15!=border_attr>>4)
|
||||
task->border_attr=border_attr;
|
||||
}
|
||||
if (doc->flags&DOCF_ATTR_BY_FILENAME) {
|
||||
try
|
||||
p=Drv2Prt(doc->filename.name[0]);
|
||||
catch {
|
||||
p=NULL;
|
||||
Fs->catch_except=TRUE;
|
||||
}
|
||||
if (p)
|
||||
attr=p->text_attr;
|
||||
}
|
||||
if (attr&0xF!=attr>>4)
|
||||
task->border_attr=attr;
|
||||
Preempt(old_preempt);
|
||||
okay=DocRecalc(doc,TRUE,DOC_RECALC_TO_SCREEN);
|
||||
Preempt(OFF);
|
||||
}
|
||||
} catch
|
||||
Fs->catch_except=TRUE;
|
||||
}
|
||||
if (!okay || doc->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL)
|
||||
break;
|
||||
doc=doc->last_doc;
|
||||
if (task->title_src==TTS_ED_FILENAME)
|
||||
MemCpy(task->task_title,doc->filename.name,TASK_TITLE_LEN);
|
||||
Preempt(old_preempt);
|
||||
DocRecalc(doc,TRUE,DOC_RECALC_TO_SCREEN);
|
||||
Preempt(OFF);
|
||||
}
|
||||
if ((doc=DocBorder(task)) && !(doc->flags&DOCF_DONT_SHOW)) {
|
||||
WinScrollNull(task,&saved_scroll);
|
||||
DocRecalc(doc,FALSE,DOC_RECALC_TO_SCREEN);
|
||||
WinScrollRestore(task,&saved_scroll);
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
@@ -118,13 +118,13 @@ public I64 ExeDoc(CDoc *doc,Bool just_load=FALSE)
|
||||
I64 result;
|
||||
Bool okay=TRUE,unlock_doc=DocLock(doc);
|
||||
CLex *lx;
|
||||
lx=LexNew("",LF_DONT_FREE_BUF,FileNameAbs(sys_temp_filename));
|
||||
lx=LexNew("",LF_DONT_FREE_BUF,sys_temp_filename);
|
||||
if (just_load)
|
||||
lx->flags|=LF_JUST_LOAD;
|
||||
if (Fs->last_lex!=&Fs->next_lex)
|
||||
lx->opts=Fs->last_lex->opts;
|
||||
QueIns(lx,Fs->last_lex);
|
||||
LexIncludeDoc(lx,NULL,doc);
|
||||
LexAttachDoc(lx,,doc);
|
||||
try {
|
||||
Lex(lx);
|
||||
result=ExeCmdLine(lx);
|
||||
|
||||
@@ -22,14 +22,15 @@ U0 LoadDocDefines()
|
||||
DefinePrintF(
|
||||
"DD_MP_VECT_END","%08X",MP_VECT_ADDR+SYS_MP_INIT_END-SYS_MP_INIT_START-1);
|
||||
|
||||
|
||||
DefinePrintF(
|
||||
"DD_TEMPLEOS_AGE","%h56D",GetCurTimeCDate-A2CDate("8/1/2003"));
|
||||
"DD_OS_NAME_VERSION","TempleOS V%0.2f",os_version);
|
||||
DefinePrintF(
|
||||
"DD_TEMPLEOS_AGE","%h56D",GetCurTimeDate-A2Date("8/1/2003"));
|
||||
|
||||
//This is cut and replaced when I generate a distro.
|
||||
//See $LK,"DD_TEMPLEOS_LOC","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP,DD_TEMPLEOS_LOC"$.
|
||||
$TR-C,"LineCnt"$
|
||||
$ID,4$DefinePrintF("DD_TEMPLEOS_LOC","139,640");
|
||||
$ID,4$DefinePrintF("DD_TEMPLEOS_LOC","122,808");
|
||||
$ID,-4$
|
||||
DefinePrintF(
|
||||
"DD_PAGE_TABLE_BASE","%08X",PAGE_TABLE_BASE);
|
||||
@@ -43,6 +44,11 @@ $ID,-4$
|
||||
DefinePrintF(
|
||||
"DD_SYS_HEAP_BASE2","%09,X",sys_heap_base);
|
||||
|
||||
DefinePrintF(
|
||||
"DD_SYS_HEAP_LIMIT","%08X",sys_heap_limit);
|
||||
DefinePrintF(
|
||||
"DD_SYS_HEAP_LIMIT2","%09,X",sys_heap_limit);
|
||||
|
||||
DefinePrintF(
|
||||
"DD_MAPPED_MEM_SPACE_GIG","%d Gig",MAPPED_MEM_SPACE/0x40000000);
|
||||
DefinePrintF(
|
||||
|
||||
@@ -11,7 +11,7 @@ Bool ChkDskConfirm(Bool *_fix,Bool *_confirm)
|
||||
return *_fix;
|
||||
}
|
||||
|
||||
I64 NativeFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc)
|
||||
I64 RedSeaFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc)
|
||||
{
|
||||
CDirEntry *tempm2;
|
||||
I64 i,j,errs=0;
|
||||
@@ -19,7 +19,7 @@ I64 NativeFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc)
|
||||
tempm2=tempm1->next;
|
||||
if (tempm1->attr & _ATTR_DIR) {
|
||||
if (tempm1->sub)
|
||||
errs+=NativeFSChkDskLst(tempm1->sub,bits,bits2,size,bpc);
|
||||
errs+=RedSeaFSChkDskLst(tempm1->sub,bits,bits2,size,bpc);
|
||||
}
|
||||
j=(tempm1->size+bpc-1)/bpc;
|
||||
for (i=0;i<j;i++) {
|
||||
@@ -46,7 +46,7 @@ I64 NativeFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc)
|
||||
return errs;
|
||||
}
|
||||
|
||||
I64 NativeFSChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm)
|
||||
I64 RedSeaFSChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm)
|
||||
{
|
||||
I64 i,j,bpc,size,errs=0;
|
||||
CPrt *p=Drv2Prt(drv_let),*old_prt=Fs->cur_prt;
|
||||
@@ -86,13 +86,13 @@ I64 NativeFSChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm)
|
||||
}
|
||||
}
|
||||
|
||||
errs+=NativeFSChkDskLst(FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc);
|
||||
errs+=RedSeaFSChkDskLst(FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc);
|
||||
for (i=1;i<size;i++)
|
||||
if (Bt(bits2,i)) {
|
||||
PrintFWarn("Shouldn't Alloc Cluster:%0X\n",i);
|
||||
errs++;
|
||||
if (ChkDskConfirm(_fix,_confirm))
|
||||
NativeFSFreeClusters(p,i,1);
|
||||
RedSeaFSFreeClusters(p,i,1);
|
||||
}
|
||||
|
||||
Free(files_find_mask);
|
||||
@@ -210,8 +210,8 @@ public I64 ChkDsk(U8 drv_let=0,Bool fix=FALSE,Bool confirm=TRUE)
|
||||
I64 errs=0;
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
switch (p->type) {
|
||||
case PT_NATIVE:
|
||||
errs=NativeFSChkDsk(drv_let,&fix,&confirm);
|
||||
case PT_REDSEA:
|
||||
errs=RedSeaFSChkDsk(drv_let,&fix,&confirm);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
errs=FAT32ChkDsk(drv_let,&fix,&confirm);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "Dsk2a"
|
||||
#include "Dsk2b"
|
||||
#include "DskCDDVD"
|
||||
#include "ChkDsk"
|
||||
#include "FileMgr"
|
||||
+12
-20
@@ -230,7 +230,7 @@ public I64 DelTree(U8 *files_find_mask,U8 *fu_flags=NULL)
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 TouchFile(U8 *filename,U8 *attr,CDate spdt=0) //Just one file
|
||||
U0 TouchFile(U8 *filename,U8 *attr,CDate cdt=0) //Just one file
|
||||
{
|
||||
CPrt *p=Drv2Prt(*filename);
|
||||
CDirEntry de;
|
||||
@@ -246,16 +246,16 @@ U0 TouchFile(U8 *filename,U8 *attr,CDate spdt=0) //Just one file
|
||||
if (!*cur_dir)
|
||||
StrCpy(cur_dir,"/");
|
||||
GetFFlags(&de.attr,Define("ST_FILE_ATTRS"),attr);
|
||||
if (spdt)
|
||||
de.datetime=spdt;
|
||||
if (cdt)
|
||||
de.datetime=cdt;
|
||||
else
|
||||
de.datetime=GetCurTimeCDate;
|
||||
de.datetime=GetCurTimeDate;
|
||||
CDirNew(p,cur_dir,&de,FALSE);
|
||||
}
|
||||
} else PutDefineErr("ST_FILE_NOT_FOUND");
|
||||
}
|
||||
|
||||
U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate spdt=0)
|
||||
U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate cdt=0)
|
||||
{
|
||||
CDirEntry *tempm2;
|
||||
while (tempm1) {
|
||||
@@ -263,16 +263,16 @@ U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate spdt=0)
|
||||
if (tempm1->attr & _ATTR_DIR) {
|
||||
if (tempm1->sub) {
|
||||
"%S%s\n","ST_SCANNING_DIR",tempm1->full_name;
|
||||
TouchLst(tempm1->sub,attr,spdt);
|
||||
TouchLst(tempm1->sub,attr,cdt);
|
||||
}
|
||||
} else
|
||||
TouchFile(tempm1->full_name,attr,spdt);
|
||||
TouchFile(tempm1->full_name,attr,cdt);
|
||||
CDirEntryDel(tempm1);
|
||||
tempm1=tempm2;
|
||||
}
|
||||
}
|
||||
|
||||
public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate spdt=0)
|
||||
public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate cdt=0)
|
||||
{
|
||||
//Attr "+?" =show
|
||||
// "+T" =resident
|
||||
@@ -280,7 +280,7 @@ public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate spdt=0
|
||||
// Touch(filename,"",,datetime);
|
||||
I64 fuf_flags=0;
|
||||
GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
|
||||
TouchLst(FilesFind(files_find_mask,fuf_flags),attr,spdt);
|
||||
TouchLst(FilesFind(files_find_mask,fuf_flags),attr,cdt);
|
||||
}
|
||||
|
||||
I64 FFLst(CDirEntry *tempm1)
|
||||
@@ -324,15 +324,7 @@ public U0 SetDrvTextAttr(U8 drv_let,U8 attr)
|
||||
Fs->catch_except=TRUE;
|
||||
}
|
||||
|
||||
U0 PrintFDrvTextAttr(U8 drv_let=0)
|
||||
{
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
U8 fg=p->text_attr&0xF,bg=p->text_attr>>4;
|
||||
if (fg!=bg)
|
||||
"$$FG,%d$$$$BG,%d$$",fg,bg;
|
||||
}
|
||||
|
||||
I64 NativeFSUnusedDrvSpace(U8 drv_let=0)
|
||||
I64 RedSeaFSUnusedDrvSpace(U8 drv_let=0)
|
||||
{
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
I64 result=0,i,l;
|
||||
@@ -377,8 +369,8 @@ public I64 UnusedDrvSpace(U8 drv_let=0)
|
||||
I64 result=0;
|
||||
Drv(drv_let);
|
||||
switch (p->type) {
|
||||
case PT_NATIVE:
|
||||
result=NativeFSUnusedDrvSpace(drv_let);
|
||||
case PT_REDSEA:
|
||||
result=RedSeaFSUnusedDrvSpace(drv_let);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
result=FAT32UnusedDrvSpace(drv_let);
|
||||
|
||||
+16
-14
@@ -67,8 +67,7 @@ public CDirEntry *CDirTreeUnflatten(U8 *src)
|
||||
return tempm;
|
||||
}
|
||||
|
||||
#help_index "Install;File/Install Related"
|
||||
#help_file "::/TempleOS/Doc/Install"
|
||||
#help_index "Install;File/Cmd Line (Typically);Cmd Line (Typically)"
|
||||
|
||||
#define ROUND_PRT_TO (63*255)
|
||||
#define PRT_HEADER 63
|
||||
@@ -157,8 +156,11 @@ public U0 PrtDsk(U8 drv_let=0)
|
||||
temppp=root.next;
|
||||
drv_let2=bdev->first_drv_let;
|
||||
while (temppp!=&root) {
|
||||
"Drive %C:%08X %s\n",drv_let2,temppp->size,
|
||||
temppp->pri ? "Primary":"Logical";
|
||||
"Drive %C:%08X ",drv_let2,temppp->size;
|
||||
if (temppp->pri)
|
||||
"Primary\n";
|
||||
else
|
||||
"Logical\n";
|
||||
temppp=temppp->next;
|
||||
drv_let2++;
|
||||
}
|
||||
@@ -174,7 +176,7 @@ public U0 PrtDsk(U8 drv_let=0)
|
||||
mbr.p[i].active=0x80;
|
||||
mbr.p[i].start_head=0;
|
||||
mbr.p[i].start_cyl=0x101;
|
||||
mbr.p[i].type=1; //Will get set to MBR_PT_NATIVE
|
||||
mbr.p[i].type=1; //Will get set to MBR_PT_REDSEA
|
||||
mbr.p[i].end_head=0xFE;
|
||||
mbr.p[i].end_cyl=0xFFFF;
|
||||
mbr.p[i].offset=PRT_HEADER+offset;
|
||||
@@ -205,7 +207,7 @@ public U0 PrtDsk(U8 drv_let=0)
|
||||
mbr.p[0].active=0x80;
|
||||
mbr.p[0].start_head=1;
|
||||
mbr.p[0].start_cyl=0x101;
|
||||
mbr.p[0].type=1; //Will get set to MBR_PT_NATIVE
|
||||
mbr.p[0].type=1; //Will get set to MBR_PT_REDSEA
|
||||
mbr.p[0].end_head=0xFE;
|
||||
mbr.p[0].end_cyl=0xFFFF;
|
||||
mbr.p[0].offset=PRT_HEADER;
|
||||
@@ -241,7 +243,7 @@ pd_done:
|
||||
|
||||
#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically)"
|
||||
|
||||
U0 NativeFSDrvView(U8 drv_let=0)
|
||||
U0 RedSeaFSDrvView(U8 drv_let=0)
|
||||
{
|
||||
CPrt *p=Drv2Prt(drv_let);
|
||||
I64 lohi,c1,i,x,y,l,s;
|
||||
@@ -335,8 +337,8 @@ public U0 DrvView(U8 drv_let=0)
|
||||
CPrt *p=Drv2Prt(drv_let),*p_old=Fs->cur_prt;
|
||||
Drv(drv_let);
|
||||
switch (p->type) {
|
||||
case PT_NATIVE:
|
||||
NativeFSDrvView(drv_let);
|
||||
case PT_REDSEA:
|
||||
RedSeaFSDrvView(drv_let);
|
||||
break;
|
||||
case PT_FAT32:
|
||||
FAT32DrvView(drv_let);
|
||||
@@ -366,7 +368,7 @@ public U0 DskView(U8 drv_let=0)
|
||||
radius=0.4*h;
|
||||
else
|
||||
radius=0.4*v;
|
||||
dc->color=ROP_EQU+BLACK;
|
||||
dc->color=BLACK;
|
||||
GrCircle(dc,h>>1,v>>1,radius);
|
||||
|
||||
j=1;
|
||||
@@ -375,7 +377,7 @@ public U0 DskView(U8 drv_let=0)
|
||||
if (bdev==p->bdev && p->type) {
|
||||
sect_start=-(p->offset*2*ã/(bdev->max_blk+1));
|
||||
sect_end =-((p->offset+p->size)*2*ã/(bdev->max_blk+1));
|
||||
dc->color=ROP_EQU+BLACK;
|
||||
dc->color=BLACK;
|
||||
GrLine(dc,h>>1,v>>1,
|
||||
h>>1+radius*Cos(sect_start),
|
||||
v>>1+radius*Sin(sect_start));
|
||||
@@ -383,7 +385,7 @@ public U0 DskView(U8 drv_let=0)
|
||||
h>>1+radius*Cos(sect_end),
|
||||
v>>1+radius*Sin(sect_end));
|
||||
|
||||
dc->color=ROP_EQU+j;
|
||||
dc->color=j;
|
||||
GrPrintF(dc,0,v-FONT_HEIGHT*j,"%C %-8Z",Prt2Drv(p),
|
||||
p->type.u16[0],"ST_PRT_TYPES");
|
||||
GrFloodFill(dc,
|
||||
@@ -393,13 +395,13 @@ public U0 DskView(U8 drv_let=0)
|
||||
}
|
||||
}
|
||||
|
||||
GetChar(NULL,FALSE);
|
||||
GetChar(,FALSE);
|
||||
SettingsPop;
|
||||
DCFill;
|
||||
DCDel(dc);
|
||||
}
|
||||
|
||||
#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);File/Install Related;Install"
|
||||
#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);Install"
|
||||
public U0 BlkDevRep()
|
||||
{
|
||||
I64 i;
|
||||
|
||||
@@ -153,10 +153,10 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode)
|
||||
CDocEntry *doc_ce;
|
||||
CDirEntry *tempm,*tempm1,*cur_tree_entry;
|
||||
if (!doc)
|
||||
parent_doc=DocCur;
|
||||
parent_doc=DocPut;
|
||||
else {
|
||||
parent_doc=doc->parent_doc;
|
||||
DocQueRem(doc);
|
||||
Fs->put_doc=Fs->display_doc=NULL;
|
||||
DocUnlock(doc);
|
||||
WinMgrSync;
|
||||
DocLock(doc);
|
||||
@@ -204,20 +204,21 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode)
|
||||
doc->flags|=DOCF_FORM;
|
||||
switch (mode) {
|
||||
case FM_NORMAL:
|
||||
DocPutS(doc,"$$FG,PURPLE$$File Manager$$FG$$\n\n$$LK,\"Click for Help\",\"FI:::/TempleOS/Doc/FileMgr.TXT\"$$\n\n");
|
||||
DocPutS(doc,"$$FG,PURPLE$$File Manager\n\n$$LK,\"Click for Help\",\"FI:::/TempleOS/Doc/FileMgr.TXT\"$$\n\n");
|
||||
break;
|
||||
case FM_PICK_FILE:
|
||||
DocPutS(doc,"$$FG,PURPLE$$Pick file and press <ESC>$$FG$$\n\n");
|
||||
DocPutS(doc,"$$FG,PURPLE$$Pick file and press <ESC>\n\n");
|
||||
doc->flags|=DOCF_MIN_SIZE;
|
||||
break;
|
||||
case FM_PICK_DIR:
|
||||
DocPutS(doc,"$$FG,PURPLE$$Pick directory and press <ESC>$$FG$$\n\n");
|
||||
DocPutS(doc,"$$FG,PURPLE$$Pick directory and press <ESC>\n\n");
|
||||
doc->flags|=DOCF_MIN_SIZE;
|
||||
break;
|
||||
}
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
for (i=0;i<NUM_PRTS;i++) {
|
||||
p=&sys_prts[i];
|
||||
if (p->type==PT_NATIVE||p->type==PT_FAT32)
|
||||
if (p->type==PT_REDSEA||p->type==PT_FAT32)
|
||||
FMRebuildDocDrv(Prt2Drv(p),doc,_root,TRUE);
|
||||
else if (p->type==PT_ISO9660) {
|
||||
if (p->bdev->flags&BDF_INITIALIZED)
|
||||
@@ -238,8 +239,7 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode)
|
||||
Free(next_entry);
|
||||
*_doc=doc;
|
||||
DocLock(doc);
|
||||
DocQueRem(DocCur);
|
||||
DocQueIns(doc,Fs->last_doc);
|
||||
Fs->put_doc=Fs->display_doc=doc;
|
||||
}
|
||||
|
||||
U0 FMRename(CDoc *doc)
|
||||
@@ -550,7 +550,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL)
|
||||
{
|
||||
CDirEntry *root=NULL,*tempm,*tempm1,*tempm2;
|
||||
I64 sc,ch,p1,p2,msg_code;
|
||||
CDoc *doc=NULL,*old_doc=DocCur;
|
||||
CDoc *doc=NULL,*old_put_doc=DocPut,*old_display_doc=DocDisplay;
|
||||
U8 *result=NULL,*st,*st2,*old_cur_dir=CurDir;
|
||||
CDocEntry *doc_ce=NULL,*doc_e;
|
||||
Bool okay;
|
||||
@@ -559,7 +559,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL)
|
||||
fp_old_final_screen_update=fp_final_screen_update;
|
||||
MenuFilePush("::/TempleOS/Doc/FileMgrPullDown.TXT");
|
||||
FMRebuildDoc(&doc,&root,mode);
|
||||
if (tempm1=CdDir(root,old_cur_dir))
|
||||
if (tempm1=Cd2DirEntry(root,old_cur_dir))
|
||||
doc->cur_entry=tempm1->user_data;
|
||||
while (tempm1) {
|
||||
if (tempm1->attr&_ATTR_DIR)
|
||||
@@ -750,8 +750,8 @@ regular_key:
|
||||
}
|
||||
} while (ch!=CH_ESC && ch!=CH_SHIFT_ESC);
|
||||
fp_final_screen_update=fp_old_final_screen_update;
|
||||
DocQueRem(doc);
|
||||
DocQueIns(old_doc,Fs->last_doc);
|
||||
Fs->put_doc =old_put_doc;
|
||||
Fs->display_doc=old_display_doc;
|
||||
SettingsPop;
|
||||
DocDel(doc);
|
||||
CDirLstDel(root);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#define GEBM_END 0
|
||||
#define GEBM_CONT 1
|
||||
#define GEBM_EXIT 0
|
||||
#define GEBM_MAIN_MENU 1
|
||||
#define GEBM_COLOR 2
|
||||
#define GEBM_DITHER_COLOR 3
|
||||
#define GEBM_WIDTH 4
|
||||
#define GEBM_SNAP 5
|
||||
#define GEBM_PT 6
|
||||
#define GEBM_PT 6
|
||||
#define GEBM_LINE 7
|
||||
#define GEBM_ARROW 8
|
||||
#define GEBM_RECT 9
|
||||
@@ -16,13 +16,26 @@
|
||||
#define GEBM_FLOOD_FILL_NOT 15
|
||||
#define GEBM_POLYLINE 16
|
||||
#define GEBM_POLYPT 17
|
||||
#define GEBM_CUT 18
|
||||
#define GEBM_COPY 18
|
||||
#define GEBM_DELETE 19
|
||||
#define GEBM_PASTE 20
|
||||
#define GEBM_PASTE_TRANSPARENT 21
|
||||
#define GEBM_FIND_AND_REPLACE 22
|
||||
#define GEBM_TRIM_TO_EXTENTS 23
|
||||
#define GEBM_UNDO 24
|
||||
#define GEBM_ADD_OUTLINE 24
|
||||
#define GEBM_ETCH 25
|
||||
#define GEBM_UNDO 26
|
||||
|
||||
U0 GrInit3()
|
||||
{
|
||||
DefineLstLoad("ST_SPRITE_BITMAP_MENU",
|
||||
"Exit\0Main Menu\0Color\0Dither Color\0Width\0Snap\0Point\0Line\0Arrow\0"
|
||||
"Rect\0Circle\0Text\0Text Box\0Text Diamond\0Flood Fill\0"
|
||||
"Flood Fill Not Color\0PolyLine\0PolyPoint\0Copy\0Delete\0Paste\0"
|
||||
"Paste Transparent\0Find and Replace\0Trim to Extents\0Add Outline\0"
|
||||
"Etch\0Undo\0");
|
||||
}
|
||||
GrInit3;
|
||||
|
||||
I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler)
|
||||
{
|
||||
@@ -39,16 +52,17 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler)
|
||||
st2="";
|
||||
}
|
||||
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"BitMap Menu\"$$$$FG$$\n"
|
||||
"$$FG,RED$$Settings$$FG$$\n"
|
||||
"$$MU-UL,\"Color %s\",GEBM_COLOR$$\n"
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite BitMap Menu\"$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteBitMap.TXT.Z\"$$\n"
|
||||
"\n$$FG,LTBLUE$$$$MU-UL,\"Color %s\",GEBM_COLOR$$\n"
|
||||
"$$MU-UL,\"Dither Color %s\",GEBM_DITHER_COLOR$$\n"
|
||||
"$$MU-UL,\"Width %d\",GEBM_WIDTH$$\n"
|
||||
"$$MU-UL,\"Snap %d %5.3f\",GEBM_SNAP$$\n"
|
||||
"$$MU-UL,\"Find & Replace Color\",GEBM_FIND_AND_REPLACE$$\n"
|
||||
"$$MU-UL,\"Trim to Extents\",GEBM_TRIM_TO_EXTENTS$$\n"
|
||||
"\n$$FG,RED$$Objects$$FG$$\n"
|
||||
"$$MU-UL,\"Point\",GEBM_PT$$\n"
|
||||
"$$MU-UL,\"Add Outline\",GEBM_ADD_OUTLINE$$\n"
|
||||
"$$MU-UL,\"Etch\",GEBM_ETCH$$\n"
|
||||
"\n$$MU-UL,\"Point\",GEBM_PT$$\n"
|
||||
"$$MU-UL,\"Line\",GEBM_LINE$$\n"
|
||||
"$$MU-UL,\"Arrow\",GEBM_ARROW$$\n"
|
||||
"$$MU-UL,\"Rect\",GEBM_RECT$$\n"
|
||||
@@ -60,15 +74,15 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler)
|
||||
"$$MU-UL,\"Flood Fill Not Color\",GEBM_FLOOD_FILL_NOT$$\n"
|
||||
"$$MU-UL,\"PolyLine\",GEBM_POLYLINE$$\n"
|
||||
"$$MU-UL,\"PolyPoint\",GEBM_POLYPT$$\n"
|
||||
"\n$$FG,RED$$Clipboard$$FG$$\n"
|
||||
"$$MU-UL,\"Cut\",GEBM_CUT$$\n"
|
||||
"$$MU-UL,\"Delete\",GEBM_DELETE$$\n"
|
||||
"$$MU-UL,\"Paste\",GEBM_PASTE$$\n"
|
||||
"$$MU-UL,\"Paste Transparent\",GEBM_PASTE_TRANSPARENT$$\n"
|
||||
"\n$$MU-UL,\"Copy to Clipboard\",GEBM_COPY$$\n"
|
||||
"$$MU-UL,\"Delete to Clipboard\",GEBM_DELETE$$\n"
|
||||
"$$MU-UL,\"Paste Clipboard\",GEBM_PASTE$$\n"
|
||||
"$$MU-UL,\"Paste Transparent Clipboard\",GEBM_PASTE_TRANSPARENT$$\n"
|
||||
"\n$$MU-UL,\"Undo\",GEBM_UNDO$$\n"
|
||||
"\n$$FM,PURPLE$$$$MU-UL,\"+] Vect Object Menu\",GEBM_CONT$$$$FM,LTBLUE$$\n"
|
||||
"$$MU-UL,\"End\",GEBM_END$$\n"
|
||||
"$$MU-UL,\"Cancel\",DOCM_CANCEL$$\n",st1,st2,width,snap,ip_scaler);
|
||||
"\n$$FG,PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",GEBM_MAIN_MENU$$$$FG,LTBLUE$$\n"
|
||||
"$$MU-UL,\"Exit Sprite\",GEBM_EXIT$$\n"
|
||||
"$$MU-UL,\"Abort Sprite\",DOCM_CANCEL$$\n",st1,st2,width,snap,ip_scaler);
|
||||
DocPutS(doc,"\nRight-Click to get back to this menu.");
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
@@ -80,17 +94,6 @@ U0 GrBMEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img)
|
||||
GrBlot(dc,xx1,yy1,img);
|
||||
}
|
||||
|
||||
U0 GrBMEFindReplaceColor(CDC *img,I64 pattern,I64 replace)
|
||||
{
|
||||
U8 *dst=img->body;
|
||||
I64 d0=img->height*img->width_internal;
|
||||
while (d0--) {
|
||||
if (*dst==pattern)
|
||||
*dst=replace;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor)
|
||||
{
|
||||
CDC *img=*_img;
|
||||
@@ -138,40 +141,95 @@ tr_done:
|
||||
DCDel(img);
|
||||
}
|
||||
|
||||
I64 SpriteBitMap(CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor,I64 *_import_snap=NULL,F64 *_import_ip_scaler=NULL)
|
||||
|
||||
U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
|
||||
{
|
||||
I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,new_snap=1,
|
||||
result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2;
|
||||
I64 i,j,k,c;
|
||||
CColorROPU32 old_color;
|
||||
CDC *src;
|
||||
if (img->width && img->height) {
|
||||
old_color=img->color;
|
||||
img->color=color;
|
||||
while (width-->0) {
|
||||
src=DCExtract(img,0,0,img->width-1,img->height-1);
|
||||
for (i=0;i<img->height;i++)
|
||||
for (j=0;j<img->width;j++)
|
||||
if (GrPeek(src,j,i)==bkcolor)
|
||||
for (k=0;k<8;k++) {
|
||||
c=GrPeek(src,j+gr_x_offsets[k],i+gr_y_offsets[k]);
|
||||
if (c>=0 && c!=bkcolor) {
|
||||
GrPlot(img,j,i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DCDel(src);
|
||||
}
|
||||
img->color=old_color;
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
|
||||
{
|
||||
I64 i,j,k,c;
|
||||
CColorROPU32 old_color;
|
||||
CDC *src;
|
||||
if (img->width && img->height) {
|
||||
old_color=img->color;
|
||||
img->color=bkcolor;
|
||||
while (width-->0) {
|
||||
src=DCExtract(img,0,0,img->width-1,img->height-1);
|
||||
for (i=0;i<img->height;i++)
|
||||
for (j=0;j<img->width;j++)
|
||||
if (GrPeek(src,j,i)!=bkcolor)
|
||||
for (k=0;k<8;k++) {
|
||||
c=GrPeek(src,j+gr_x_offsets[k],i+gr_y_offsets[k]);
|
||||
if (c<0 || c==bkcolor) {
|
||||
GrPlot(img,j,i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DCDel(src);
|
||||
}
|
||||
img->color=old_color;
|
||||
}
|
||||
}
|
||||
|
||||
I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor,I64 *_ip_snap,F64 *_ip_scaler)
|
||||
{
|
||||
I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,ip_snap=1,
|
||||
result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2,
|
||||
old_e_flags1=doc_e->flags1;
|
||||
Bool down=FALSE;
|
||||
F64 new_ip_scaler=1.0;
|
||||
F64 ip_scaler=1.0;
|
||||
U8 *st=NULL;
|
||||
CDC *img=*_img,
|
||||
*clipboard=NULL,*undo=NULL,*dc2;
|
||||
*clipboard=NULL,*undo=NULL,*dc2;
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
|
||||
if (_import_snap) new_snap=*_import_snap;
|
||||
if (_import_ip_scaler) new_ip_scaler=*_import_ip_scaler;
|
||||
SetSnap(&Fs->snap,new_snap,new_ip_scaler);
|
||||
if (_ip_snap) ip_snap=*_ip_snap;
|
||||
if (_ip_scaler) ip_scaler=*_ip_scaler;
|
||||
SetSnap(&Fs->snap,ip_snap,ip_scaler);
|
||||
|
||||
doc_e->flags1|=DOCEF1_DONT_DRAW;
|
||||
goto bm_menu;
|
||||
|
||||
while (TRUE) {
|
||||
if (sys_cur_scan_code&SCF_CTRL)//grab scroll update?
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
|
||||
dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK;
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often.
|
||||
|
||||
while (msg_code=ScanMsg(&p1,&p2,1<<MSG_IP_L_DOWN|1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|
|
||||
1<<MSG_IP_MOVE|1<<MSG_KEY_DOWN)) {
|
||||
1<<MSG_IP_MOVE|1<<MSG_KEY_DOWN)) {
|
||||
switch (msg_code) {
|
||||
case MSG_KEY_DOWN:
|
||||
if (p1==CH_SHIFT_ESC) {
|
||||
result=GE_CANCEL;
|
||||
result=GE_ABORT;
|
||||
goto bm_key_up_done;
|
||||
} else if (p1==CH_ESC) {
|
||||
result=GE_OKAY_CONT;
|
||||
result=GE_CONT;
|
||||
goto bm_key_up_done;
|
||||
}
|
||||
break;
|
||||
@@ -179,15 +237,19 @@ I64 SpriteBitMap(CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CCol
|
||||
case MSG_IP_R_DOWN:
|
||||
bm_menu:
|
||||
DCFill(dc);
|
||||
switch (i=PopUpSpriteBitMap(color,width,new_snap,new_ip_scaler)) {
|
||||
StrCpy(Fs->task_title,"Sprite BitMap Menu");
|
||||
i=PopUpSpriteBitMap(color,width,ip_snap,ip_scaler);
|
||||
if (i>=0)
|
||||
StrCpy(Fs->task_title,DefineSub(i,"ST_SPRITE_BITMAP_MENU"));
|
||||
switch (i) {
|
||||
case DOCM_CANCEL:
|
||||
result=GE_CANCEL;
|
||||
result=GE_ABORT;
|
||||
goto bm_done;
|
||||
case GEBM_END:
|
||||
result=GE_OKAY_DONE;
|
||||
case GEBM_EXIT:
|
||||
result=GE_EXIT;
|
||||
goto bm_done;
|
||||
case GEBM_CONT:
|
||||
result=GE_OKAY_CONT;
|
||||
case GEBM_MAIN_MENU:
|
||||
result=GE_CONT;
|
||||
goto bm_done;
|
||||
|
||||
case GEBM_COLOR:
|
||||
@@ -200,7 +262,7 @@ bm_menu:
|
||||
if (i>=0) {
|
||||
j=PopUpColor("Replace Color\n",,FALSE);
|
||||
if (j>=0) {
|
||||
GrBMEFindReplaceColor(img,i,j);
|
||||
DCColorChg(img,i,j);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
}
|
||||
@@ -211,9 +273,24 @@ bm_menu:
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_ADD_OUTLINE:
|
||||
i=PopUpRangeI64(1,16,1,"Outline Width\n");
|
||||
if (i>=0) {
|
||||
GrBMEAddOutline(img,i,color,bkcolor);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_ETCH:
|
||||
i=PopUpRangeI64(1,16,1,"Etch Width\n");
|
||||
if (i>=0) {
|
||||
GrBMEEtch(img,i,bkcolor);
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
}
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_DITHER_COLOR:
|
||||
i=PopUpDitherColor;
|
||||
i=PopUpColorDither;
|
||||
if (i>=0) color=i;
|
||||
goto bm_menu;
|
||||
|
||||
@@ -224,8 +301,8 @@ bm_menu:
|
||||
|
||||
case GEBM_SNAP:
|
||||
PopUpSnap(&Fs->snap);
|
||||
new_snap=Fs->snap.x;
|
||||
new_ip_scaler=Fs->snap.dx;
|
||||
ip_snap=Fs->snap.x;
|
||||
ip_scaler=Fs->snap.dx;
|
||||
goto bm_menu;
|
||||
|
||||
case GEBM_UNDO:
|
||||
@@ -247,7 +324,7 @@ bm_menu:
|
||||
case GEBM_FLOOD_FILL_NOT:
|
||||
case GEBM_POLYPT:
|
||||
case GEBM_POLYLINE:
|
||||
case GEBM_CUT:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
case GEBM_PASTE:
|
||||
case GEBM_PASTE_TRANSPARENT:
|
||||
@@ -285,7 +362,7 @@ bm_menu:
|
||||
case GEBM_ARROW:
|
||||
case GEBM_RECT:
|
||||
case GEBM_CIRCLE:
|
||||
case GEBM_CUT:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
if (down)
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
@@ -306,9 +383,9 @@ bm_menu:
|
||||
case GEBM_CIRCLE:
|
||||
GrCircle3(dc,x1,y1,0,1);
|
||||
break;
|
||||
case GEBM_CUT:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK;
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,x1,y1,x1,y1);
|
||||
break;
|
||||
@@ -410,7 +487,7 @@ bm_menu:
|
||||
GrRect(dc,x11,y11,x22-x11+1,y22-y11+1);
|
||||
}
|
||||
break;
|
||||
case GEBM_CUT:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
if (down) {
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
@@ -428,7 +505,7 @@ bm_menu:
|
||||
y11=p2;
|
||||
y22=y1;
|
||||
}
|
||||
dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK;
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
|
||||
dc->pen_width=1;
|
||||
GrLineRect4(dc,x11,y11,x22,y22);
|
||||
}
|
||||
@@ -521,7 +598,7 @@ bm_menu:
|
||||
down=FALSE;
|
||||
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
|
||||
break;
|
||||
case GEBM_CUT:
|
||||
case GEBM_COPY:
|
||||
case GEBM_DELETE:
|
||||
if (x1<p1) {
|
||||
x11=x1;
|
||||
@@ -595,8 +672,9 @@ bm_done:
|
||||
Free(st);
|
||||
DCFill(dc);
|
||||
SettingsPop;
|
||||
if (_import_snap) *_import_snap=new_snap;
|
||||
if (_import_ip_scaler) *_import_ip_scaler=new_ip_scaler;
|
||||
doc_e->flags1=old_e_flags1;
|
||||
if (_ip_snap) *_ip_snap=ip_snap;
|
||||
if (_ip_scaler) *_ip_scaler=ip_scaler;
|
||||
*_img=img;
|
||||
*_xx1=xx1,*_yy1=yy1,*_xx2=xx2,*_yy2=yy2;
|
||||
return result;
|
||||
|
||||
+315
-266
@@ -1,5 +1,92 @@
|
||||
#help_index "Graphics/CSprite"
|
||||
|
||||
#define CSPRITE_WIF (WIF_ALL-WIF_BORDER-WIF_GRAB_SCROLL)
|
||||
|
||||
U8 GrSpOffset[9]={0,1,2,3,0,4,5,6,7};
|
||||
|
||||
Bool GrPolyPtPlot(CSprite *root,I64 x,I64 y,I64)
|
||||
{
|
||||
CSprite *tempg=CAlloc(gr_sprite_qued_base_size[GRST_PT]);
|
||||
tempg->type=GRST_PT;
|
||||
tempg->x1=x;
|
||||
tempg->y1=y;
|
||||
QueIns(tempg,root->last);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
CSprite *GrNum2Que(CSprite *root,I64 num,I64 *x=NULL,I64 *y=NULL)
|
||||
{
|
||||
I64 xx=0,yy=0;
|
||||
CSprite *result=root->next;
|
||||
while (result!=root && num--) {
|
||||
if (result->type==GRST_SHIFT) {
|
||||
xx+=result->x1;
|
||||
yy+=result->y1;
|
||||
}
|
||||
result=result->next;
|
||||
}
|
||||
if (x) *x=xx;
|
||||
if (y) *y=yy;
|
||||
return result;
|
||||
}
|
||||
|
||||
CSprite *Sprite2Que(U8 *elems)
|
||||
{
|
||||
I64 s;
|
||||
CSprite *result=CAlloc(sizeof(CSprite)),
|
||||
*tempg=elems-offset(CSprite.start),
|
||||
*tempg1;
|
||||
result->next=result->last=result;
|
||||
while (tempg->type) {
|
||||
tempg1=MAlloc(SpriteElemSize(tempg)+offset(CSprite.start));
|
||||
s=SpriteElemSize(tempg);
|
||||
MemCpy(&tempg1->start,&tempg->start,s);
|
||||
QueIns(tempg1,result->last);
|
||||
tempg(U8 *)+=s;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 SpriteCntQue(CSprite *root)
|
||||
{
|
||||
CSprite *tempg=root->next;
|
||||
I64 result=0;
|
||||
while (tempg->type) {
|
||||
result++;
|
||||
tempg=tempg->next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 GrEdUpdate(CDoc *doc,CDocBin *tempb,CSprite *root)
|
||||
{
|
||||
I64 i,size=gr_sprite_base_size[GRST_END];
|
||||
CSprite *tempg=root->next;
|
||||
U8 *dst;
|
||||
Bool unlock=DocLock(doc);
|
||||
|
||||
while (tempg!=root) {
|
||||
size+=SpriteElemSize(tempg);
|
||||
tempg=tempg->next;
|
||||
}
|
||||
|
||||
Free(tempb->data);
|
||||
tempb->data=dst=MAlloc(size);
|
||||
tempb->size=size;
|
||||
|
||||
tempg=root->next;
|
||||
while (tempg!=root) {
|
||||
i=SpriteElemSize(tempg);
|
||||
MemCpy(dst,&tempg->start,i);
|
||||
dst+=i;
|
||||
tempg=tempg->next;
|
||||
}
|
||||
*dst=GRST_END;
|
||||
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
}
|
||||
|
||||
U0 GrSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz)
|
||||
{
|
||||
I64 i;
|
||||
@@ -24,7 +111,7 @@ U0 GrSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz)
|
||||
break;
|
||||
case GRST_BITMAP8:
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
tempg->x2+=dx;
|
||||
tempg->y2+=dy;
|
||||
break;
|
||||
@@ -117,7 +204,7 @@ CSprite *GrTransformEllipse(I64 r[4][4],CSprite *tempg)
|
||||
F64 m1,a1,m2,a2,s,c,x_radius=tempg->width<<16,y_radius=tempg->height<<16;
|
||||
CSprite *tempg1=CAlloc(gr_sprite_qued_base_size[tempg->type]);
|
||||
tempg1->type=tempg->type;
|
||||
if (tempg->type==GRST_REG_POLY)
|
||||
if (tempg->type==GRST_POLYGON)
|
||||
tempg1->sides=tempg->sides;
|
||||
|
||||
x=tempg->x2; y=tempg->y2; z=0;
|
||||
@@ -351,7 +438,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root)
|
||||
tempg=tempg1;
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
tempg1=GrTransformEllipse(r,tempg);
|
||||
QueIns(tempg1,tempg);
|
||||
QueRem(tempg);
|
||||
@@ -449,7 +536,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root)
|
||||
tempg->x1=x;
|
||||
tempg->y1=y;
|
||||
tempg->z1=z;
|
||||
p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
for (i=0;i<tempg->shiftable_vertex_cnt;i++,p++) {
|
||||
x=p->x; y=p->y; z=p->z;
|
||||
GrRot(r,&x,&y,&z);
|
||||
@@ -473,7 +560,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root)
|
||||
}
|
||||
}
|
||||
|
||||
CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num)
|
||||
CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *_cur_num)
|
||||
{
|
||||
CSprite *result=CAlloc(sizeof(CSprite)),*tempg;
|
||||
CDocEntry *doc_e=doc->root.next;
|
||||
@@ -485,8 +572,8 @@ CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num)
|
||||
tempg=GrNum2Que(root,doc_e->left_exp);
|
||||
if (tempg!=root) {
|
||||
tempg=MAllocIdentical(tempg);
|
||||
if (*cur_num==doc_e->left_exp) {
|
||||
*cur_num=num;
|
||||
if (*_cur_num==doc_e->left_exp) {
|
||||
*_cur_num=num;
|
||||
found=TRUE;
|
||||
}
|
||||
QueIns(tempg,result->last);
|
||||
@@ -496,7 +583,7 @@ CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num)
|
||||
doc_e=doc_e->next;
|
||||
}
|
||||
if (!found)
|
||||
*cur_num=num;
|
||||
*_cur_num=num;
|
||||
QueDel(root);
|
||||
Free(root);
|
||||
return result;
|
||||
@@ -509,24 +596,27 @@ U0 PickSpriteDocNew(CDoc *doc,CSprite *root,I64 old_num)
|
||||
I64 cur_num=0;
|
||||
U8 *st;
|
||||
|
||||
DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite SideBar\"$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteSideBar.TXT.Z\"$$\n\n");
|
||||
|
||||
tempg=root->next;
|
||||
while (tempg!=root) {
|
||||
st=Sprite2Text(tempg);
|
||||
if (cur_num==old_num) {
|
||||
DocPutS(doc,"$$FM,LTRED$$");
|
||||
DocPutS(doc,"$$FG,LTRED$$");
|
||||
doc_e=DocPrintF(doc,"$$MU-UL,\"%Q\",%d$$\n",st,cur_num++);
|
||||
} else {
|
||||
DocPutS(doc,"$$FM,LTBLUE$$");
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
DocPrintF(doc,"$$MU-UL,\"%Q\",%d$$\n",st,cur_num++);
|
||||
}
|
||||
Free(st);
|
||||
tempg=tempg->next;
|
||||
}
|
||||
if (cur_num==old_num) {
|
||||
DocPutS(doc,"$$FM,LTRED$$");
|
||||
DocPutS(doc,"$$FG,LTRED$$");
|
||||
doc_e=DocPrintF(doc,"$$MU-UL,\"END\",%d$$\n",cur_num);
|
||||
} else {
|
||||
DocPutS(doc,"$$FM,LTBLUE$$");
|
||||
DocPutS(doc,"$$FG,LTBLUE$$");
|
||||
DocPrintF(doc,"$$MU-UL,\"END\",%d$$\n",cur_num);
|
||||
}
|
||||
if (doc_e)
|
||||
@@ -549,24 +639,24 @@ U0 SpriteSideBarTask2(CTask *grand_parent)
|
||||
}
|
||||
}
|
||||
|
||||
U0 SpriteSideBarTask(CTask *parent,CSprite **_root,I64 *cur_num)
|
||||
U0 SpriteSideBarTask(CTask *parent,CSprite **_root,I64 *_cur_num)
|
||||
{
|
||||
CDocEntry *doc_e;
|
||||
CDoc *doc=DocCur;
|
||||
Spawn(&SpriteSideBarTask2,parent,"CSpriteTask",Fs);
|
||||
CDoc *doc=DocPut;
|
||||
Spawn(&SpriteSideBarTask2,parent,"CSpriteTask",,Fs);
|
||||
doc->flags|=DOCF_MIN_SIZE|DOCF_FORM;
|
||||
while (TRUE) {
|
||||
PickSpriteDocNew(doc,*_root,*cur_num);
|
||||
PickSpriteDocNew(doc,*_root,*_cur_num);
|
||||
View;
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e->type_u8==DOCT_MENU_VAL)
|
||||
*cur_num=doc_e->left_exp;
|
||||
*_root=SpriteDoc2Que(doc,*_root,cur_num);
|
||||
*_cur_num=doc_e->left_exp;
|
||||
*_root=SpriteDoc2Que(doc,*_root,_cur_num);
|
||||
DocClear(doc);
|
||||
}
|
||||
}
|
||||
|
||||
U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL)
|
||||
U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *_cur_num,CTask *mem_task=NULL)
|
||||
{
|
||||
I64 num=0,size=gr_sprite_base_size[GRST_END];
|
||||
U8 *result,*dst;
|
||||
@@ -577,13 +667,13 @@ U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL)
|
||||
size+=doc_e->len;
|
||||
doc_e=doc_e->next;
|
||||
}
|
||||
*cur_num=0;
|
||||
*_cur_num=0;
|
||||
dst=result=MAlloc(size,mem_task);
|
||||
doc_e=doc->root.next;
|
||||
while (doc_e!=doc) {
|
||||
if (doc_e->type_u8==DOCT_HEX_ED) {
|
||||
if (doc_e==doc->cur_entry)
|
||||
*cur_num=num;
|
||||
*_cur_num=num;
|
||||
MemCpy(dst,doc_e->data,doc_e->len);
|
||||
dst+=doc_e->len;
|
||||
num++;
|
||||
@@ -596,7 +686,7 @@ U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL)
|
||||
return result;
|
||||
}
|
||||
|
||||
Bool SpriteTextEd(CSprite **_root,I64 *cur_num)
|
||||
Bool SpriteTextEd(CSprite **_root,I64 *_cur_num)
|
||||
{
|
||||
Bool result;
|
||||
U8 *st;
|
||||
@@ -604,6 +694,8 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num)
|
||||
CSprite *root=*_root,*tempg;
|
||||
CDocEntry *doc_e;
|
||||
doc->flags|=DOCF_FORM;
|
||||
DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite Edit as Text\"$$$$FG$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteEdText.TXT.Z\"$$\n\n");
|
||||
tempg=root->next;
|
||||
while (tempg!=root) {
|
||||
st=Sprite2Text(tempg);
|
||||
@@ -613,8 +705,8 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num)
|
||||
doc_e->data=&tempg->start;
|
||||
tempg=tempg->next;
|
||||
}
|
||||
if (result=ServantUser("DocDo(0x%X,0x%X);",doc,0)) {
|
||||
tempg=SpriteHexDoc2Sprite(doc,cur_num);
|
||||
if (result=SrvUser("DocDo(0x%X,0x%X);",doc,0)) {
|
||||
tempg=SpriteHexDoc2Sprite(doc,_cur_num);
|
||||
QueDel(root);
|
||||
Free(root);
|
||||
root=Sprite2Que(tempg);
|
||||
@@ -631,29 +723,30 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num)
|
||||
#define GED_SHIFT_RECTS 4
|
||||
#define GED_TRANSFORM 5
|
||||
#define GED_SHIFT_SUB_ORIGIN 6
|
||||
#define GED_VECT 7
|
||||
#define GED_MAIN_MENU 7
|
||||
#define GED_INS_CLIPBOARD 8
|
||||
#define GED_DELETE 9
|
||||
#define GED_ED 10
|
||||
#define GED_TEXT_ED 10
|
||||
#define GED_SNAP 11
|
||||
#define GED_END 12
|
||||
#define GED_EXIT 12
|
||||
|
||||
U0 GrInit2()
|
||||
{
|
||||
DefineLstLoad("ST_CSPRITE_ED_MENU"," \0Pick Graphically\0Set Origin\0"
|
||||
"Shift Origin\0Shift Points\0Shift Rects\0Transform\0Shift SubOrigin\0Insert Object\0"
|
||||
"Insert Clipboard\0Delete Object\0Edit\0Snap\0");
|
||||
DefineLstLoad("ST_SPRITE_ED_MENU","Pick Graphically\0Set Origin\0"
|
||||
"Shift Origin\0Shift Points\0Shift Rects\0Transform\0Shift SubOrigin\0Main Menu\0"
|
||||
"Insert Clipboard\0Delete Object\0Edit as Text\0Snap\0");
|
||||
}
|
||||
GrInit2;
|
||||
|
||||
I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *cur_num)
|
||||
I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *_cur_num)
|
||||
{
|
||||
U8 *st;
|
||||
CTask *pu_task;
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Edit Menu\"$$$$FG$$\n"
|
||||
"$$MU-UL,\"Shift Points\",GED_SHIFT_PTS$$\n"
|
||||
DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite Edit Menu\"$$\n"
|
||||
"$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteEd.TXT.Z\"$$\n\n"
|
||||
"$$FG,LTBLUE$$$$MU-UL,\"Shift Points\",GED_SHIFT_PTS$$\n"
|
||||
"$$MU-UL,\"Shift Points with Rects\",GED_SHIFT_RECTS$$\n"
|
||||
"$$MU-UL,\"Shift Origin\",GED_SHIFT_ORIGIN$$\n"
|
||||
"$$MU-UL,\"Set Origin\",GED_SET_ORIGIN$$\n"
|
||||
@@ -662,17 +755,17 @@ I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *cur_num)
|
||||
"$$MU-UL,\"Pick or Delete Objects Graphically\",GED_PICK_GRAPHICALLY$$\n"
|
||||
"$$MU-UL,\"Transform\",GED_TRANSFORM$$\n"
|
||||
"$$MU-UL,\"Delete\",GED_DELETE$$\n"
|
||||
"$$MU-UL,\"Edit as Text\",GED_ED$$\n"
|
||||
"\n$$FM,PURPLE$$$$MU-UL,\"+] Vect Object Menu\",GED_VECT$$$$FM,LTBLUE$$\n"
|
||||
"$$MU-UL,\"Insert Clipboard CSprite's\",GED_INS_CLIPBOARD$$\n"
|
||||
"\n$$MU-UL,\"End\",GED_END$$\n"
|
||||
"$$MU-UL,\"Cancel\",DOCM_CANCEL$$",snap,ip_scaler);
|
||||
st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,cur_num);
|
||||
"$$MU-UL,\"Edit as Text\",GED_TEXT_ED$$\n"
|
||||
"$$MU-UL,\"Insert Clipboard Sprite's\",GED_INS_CLIPBOARD$$\n"
|
||||
"\n$$FG,PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",GED_MAIN_MENU$$$$FG,LTBLUE$$\n"
|
||||
"$$MU-UL,\"Exit Sprite\",GED_EXIT$$\n"
|
||||
"$$MU-UL,\"Abort Sprite\",DOCM_CANCEL$$",snap,ip_scaler);
|
||||
st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,_cur_num);
|
||||
PopUp(st,NULL,&pu_task);
|
||||
Free(st);
|
||||
i=PopUpMenu(doc);
|
||||
if (TaskValidate(pu_task)) {
|
||||
*_root=SpriteDoc2Que(DocCur(pu_task),*_root,cur_num);
|
||||
*_root=SpriteDoc2Que(DocPut(pu_task),*_root,_cur_num);
|
||||
Kill(pu_task);
|
||||
}
|
||||
DocDel(doc);
|
||||
@@ -693,7 +786,7 @@ class CSpritePt
|
||||
|
||||
U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
{
|
||||
I64 i,cur_num=0;
|
||||
I64 i,num=0;
|
||||
I32 *ptr;
|
||||
CD3I32 *p;
|
||||
CSpritePt *temppe;
|
||||
@@ -712,7 +805,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->yy=y;
|
||||
temppe->x=&tempg->x2;
|
||||
temppe->y=&tempg->y2;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
case GRST_TEXT:
|
||||
case GRST_TEXT_BOX:
|
||||
@@ -727,7 +820,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->yy=y;
|
||||
temppe->x=&tempg->x1;
|
||||
temppe->y=&tempg->y1;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
break;
|
||||
case GRST_SHIFT:
|
||||
@@ -735,7 +828,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
y+=tempg->y1;
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
temppe=CAlloc(sizeof(CSpritePt));
|
||||
temppe->type=GESPT_WIDTH_HEIGHT;
|
||||
temppe->xx=x;
|
||||
@@ -744,7 +837,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->y=&tempg->y2;
|
||||
temppe->w=&tempg->width;
|
||||
temppe->h=&tempg->height;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
case GRST_BITMAP8:
|
||||
temppe=CAlloc(sizeof(CSpritePt));
|
||||
@@ -753,7 +846,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->yy=y;
|
||||
temppe->x=&tempg->x2;
|
||||
temppe->y=&tempg->y2;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
break;
|
||||
case GRST_POLYLINE:
|
||||
@@ -765,7 +858,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->yy=y;
|
||||
temppe->x=&ptr[i<<1];
|
||||
temppe->y=&ptr[i<<1+1];
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
}
|
||||
break;
|
||||
@@ -777,7 +870,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->yy=y;
|
||||
temppe->x=&ptr[0];
|
||||
temppe->y=&ptr[1];
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
break;
|
||||
case GRST_BSPLINE2:
|
||||
@@ -793,7 +886,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->x=&p[i].x;
|
||||
temppe->y=&p[i].y;
|
||||
temppe->z=&p[i].z;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
}
|
||||
break;
|
||||
@@ -807,12 +900,12 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root)
|
||||
temppe->x=&tempg->x1;
|
||||
temppe->y=&tempg->y1;
|
||||
temppe->z=&tempg->z1;
|
||||
temppe->num=cur_num;
|
||||
temppe->num=num;
|
||||
QueIns(temppe,root->last);
|
||||
break;
|
||||
}
|
||||
tempg(U8 *)+=SpriteElemSize(tempg);
|
||||
cur_num++;
|
||||
num++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -909,10 +1002,7 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_num,I64 mode)
|
||||
xx2=xx=p1; yy2=yy=p2;
|
||||
while (TRUE) {
|
||||
GESPCtrlPtsDraw(dc,&root);
|
||||
if (Blink)
|
||||
dc->color=ROPF_DITHER+RED<<16+WHITE;
|
||||
else
|
||||
dc->color=ROPF_DITHER+WHITE<<16+RED;
|
||||
dc->color=ROPF_DITHER+WHITE<<16+RED;
|
||||
GrLineRect4(dc,xx,yy,xx2,yy2);
|
||||
if (msg_code=ScanMsg(&p1,&p2,1<<MSG_IP_MOVE|1<<MSG_IP_L_UP)) {
|
||||
if (msg_code==MSG_IP_MOVE) {
|
||||
@@ -993,227 +1083,186 @@ gs_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 EdExistingGraphic(CDoc *doc,I64 x,I64 y,I64 *_import_snap=NULL,F64 *_import_ip_scaler=NULL)
|
||||
I64 SpriteEd(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y,CSprite **_root,I64 *_cur_num,I64 *_ip_snap,F64 *_ip_scaler)
|
||||
{
|
||||
CDocEntry *doc_e,*doc_ce;
|
||||
CDocEntry *doc_e2;
|
||||
CDocBin *tempb;
|
||||
Bool unlock=DocLock(doc),unlock2,del_down;
|
||||
I64 i,r[16],cur_num=0,msg_code,p1,p2,old_size,xx,yy,new_snap=1,
|
||||
old_doc_flags=doc->flags&(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME),
|
||||
old_ce_flags1;
|
||||
F64 new_ip_scaler=1.0;
|
||||
CSprite *cur_elem,*old_CSprite,
|
||||
*root,*root2,*next,*last,*tempg,*insert_pt;
|
||||
Fs->task_title[TASK_TITLE_LEN]=0;
|
||||
U8 *old_desc=StrNew(Fs->task_title),
|
||||
*old_filename=StrNew(doc->filename.name);
|
||||
Bool unlock,del_down;
|
||||
I64 i,r[16],msg_code,p1,p2,xx,yy,ip_snap=1,
|
||||
old_e_flags1;
|
||||
F64 ip_scaler=1.0;
|
||||
CSprite *cur_elem,*root2,*next,*last,*tempg,*insert_pt;
|
||||
|
||||
WinMgrSync(2,TRUE);
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
WordStat;
|
||||
if (_import_snap) new_snap=*_import_snap;
|
||||
if (_import_ip_scaler) new_ip_scaler=*_import_ip_scaler;
|
||||
SetSnap(&Fs->snap,new_snap,new_ip_scaler);
|
||||
Fs->win_inhibit=CSPRITE_WIF;
|
||||
doc_ce=doc->cur_entry;
|
||||
old_ce_flags1=doc_ce->flags1;
|
||||
tempb=doc_ce->bin_data;
|
||||
old_size=tempb->size;
|
||||
old_CSprite=tempb->data;
|
||||
root=Sprite2Que(old_CSprite);
|
||||
|
||||
cur_num=SpriteCntQue(root);
|
||||
tempb->data=MAllocIdentical(old_CSprite);
|
||||
if (_ip_snap) ip_snap=*_ip_snap;
|
||||
if (_ip_scaler) ip_scaler=*_ip_scaler;
|
||||
SetSnap(&Fs->snap,ip_snap,ip_scaler);
|
||||
old_e_flags1=doc_e->flags1;
|
||||
tempb=doc_e->bin_data;
|
||||
DocUnlock(doc);
|
||||
do {
|
||||
StrCpy(Fs->task_title,old_desc);
|
||||
StrCpy(doc->filename.name,old_filename);
|
||||
doc->flags|=old_doc_flags;
|
||||
doc_ce->flags1|=DOCEF1_DONT_DRAW;
|
||||
i=PopUpSpriteEd(&root,new_snap,new_ip_scaler,&cur_num);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
if (i>=0) {
|
||||
StrCpy(Fs->task_title,DefineSub(i,"ST_CSPRITE_ED_MENU"));
|
||||
StrCpy(doc->filename.name,Fs->task_title);
|
||||
doc->flags&=~(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME);
|
||||
}
|
||||
switch (i) {
|
||||
case GED_PICK_GRAPHICALLY:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_PICK_GRAPHICALLY,
|
||||
"You can delete elements by\n"
|
||||
"holding $$FG,GREEN$$Delete$$FG$$ and clicking.\n");
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
doc->cur_sprite=tempb->data;
|
||||
doc->cur_sprite_elem_num=0;
|
||||
del_down=FALSE;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,1<<MSG_IP_L_UP|1<<MSG_IP_R_UP|1<<MSG_KEY_DOWN|1<<MSG_KEY_UP);
|
||||
if (p2.u8[0]==SC_DELETE&& !(p2&SCF_IP_L_DOWN)) {
|
||||
if (msg_code==MSG_KEY_DOWN)
|
||||
del_down=TRUE;
|
||||
else if (msg_code==MSG_KEY_UP)
|
||||
del_down=FALSE;
|
||||
}
|
||||
if (msg_code==MSG_IP_L_UP && sys_cur_scan_code&SCF_DELETE ||
|
||||
msg_code==MSG_KEY_DOWN && p2&SCF_IP_L_DOWN && p2.u8[0]==SC_DELETE) {
|
||||
cur_num=doc->cur_sprite_elem_num;
|
||||
cur_elem=GrNum2Que(root,cur_num);
|
||||
if (cur_elem!=root) {
|
||||
QueRem(cur_elem);
|
||||
Free(cur_elem);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
if (win_actual_refresh<10)
|
||||
doc_e->flags1|=DOCEF1_DONT_DRAW;
|
||||
StrCpy(Fs->task_title,"Sprite Edit Menu");
|
||||
i=PopUpSpriteEd(_root,ip_snap,ip_scaler,_cur_num);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
if (0<=i<GED_EXIT) {
|
||||
StrCpy(Fs->task_title,DefineSub(i,"ST_SPRITE_ED_MENU"));
|
||||
switch (i) {
|
||||
case GED_PICK_GRAPHICALLY:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_PICK_GRAPHICALLY,
|
||||
"You can delete elements by\n"
|
||||
"holding $$FG,GREEN$$Delete$$FG$$ and clicking.\n");
|
||||
doc_e->flags1=old_e_flags1;
|
||||
doc->cur_sprite=tempb->data;
|
||||
doc->cur_sprite_elem_num=0;
|
||||
del_down=FALSE;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,1<<MSG_IP_L_UP|1<<MSG_IP_R_UP|1<<MSG_KEY_DOWN|1<<MSG_KEY_UP);
|
||||
if (p2.u8[0]==SC_DELETE&& !(p2&SCF_IP_L_DOWN)) {
|
||||
if (msg_code==MSG_KEY_DOWN)
|
||||
del_down=TRUE;
|
||||
else if (msg_code==MSG_KEY_UP)
|
||||
del_down=FALSE;
|
||||
}
|
||||
doc->cur_sprite=tempb->data;
|
||||
doc->cur_sprite_elem_num=0;
|
||||
if (msg_code==MSG_KEY_DOWN)
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_UP);
|
||||
}
|
||||
} while (del_down || msg_code!=MSG_IP_L_UP && msg_code!=MSG_IP_R_UP);
|
||||
cur_num=doc->cur_sprite_elem_num;
|
||||
doc->cur_sprite=NULL;
|
||||
break;
|
||||
case GED_SNAP:
|
||||
PopUpSnap(&Fs->snap);
|
||||
new_snap=Fs->snap.x;
|
||||
new_ip_scaler=Fs->snap.dx;
|
||||
break;
|
||||
case GED_SET_ORIGIN:
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_UP);
|
||||
GrSetOrigin(root,x-p1,y-p2,0);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
break;
|
||||
case GED_SHIFT_ORIGIN:
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_DOWN);
|
||||
xx=p1; yy=p2;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,
|
||||
1<<MSG_IP_L_UP+1<<MSG_IP_MOVE);
|
||||
GrSetOrigin(root,p1-xx,p2-yy,0);
|
||||
xx=p1; yy=p2;
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
} while (msg_code!=MSG_IP_L_UP);
|
||||
break;
|
||||
case GED_SHIFT_PTS:
|
||||
case GED_SHIFT_RECTS:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_PTS_RECTANGLES,
|
||||
"You can switch between points\n"
|
||||
"and rectangles with '$$FG,GREEN$$p$$FG$$' and '$$FG,GREEN$$r$$FG$$'.\n"
|
||||
"Press '$$FG,GREEN$$r$$FG$$' after one rectangle\n"
|
||||
"to OR another rectangle.\n");
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
if (SpriteShiftPts(tempb->data,x,y,&cur_num,i)) {
|
||||
QueDel(root);
|
||||
Free(root);
|
||||
root=Sprite2Que(tempb->data);
|
||||
} else
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
break;
|
||||
case GED_TRANSFORM:
|
||||
if (PopUpTransform(r)) {
|
||||
SpriteTransform(r,root);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
}
|
||||
break;
|
||||
case GED_SHIFT_SUB_ORIGIN:
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
insert_pt=GrNum2Que(root,cur_num);
|
||||
tempg=MAlloc(gr_sprite_qued_base_size[GRST_SHIFT]);
|
||||
tempg->type=GRST_SHIFT;
|
||||
tempg->x1=0;
|
||||
tempg->y1=0;
|
||||
QueIns(tempg,insert_pt->last);
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_DOWN);
|
||||
xx=p1; yy=p2;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,
|
||||
1<<MSG_IP_L_UP+1<<MSG_IP_MOVE);
|
||||
tempg->x1=p1-xx;
|
||||
tempg->y1=p2-yy;
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
} while (msg_code!=MSG_IP_L_UP);
|
||||
cur_num++;
|
||||
break;
|
||||
case GED_INS_CLIPBOARD:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_INS_CLIPBOARD,
|
||||
"You will probably want to shift around\n"
|
||||
"the location of element groups. Use\n"
|
||||
"'Insert shift sub-origin' after picking the\n"
|
||||
"element to insert before. Or,\n"
|
||||
"use 'shift points'.\n");
|
||||
insert_pt=GrNum2Que(root,cur_num);
|
||||
unlock2=DocLock(sys_clipboard_doc);
|
||||
doc_e=sys_clipboard_doc->root.next;
|
||||
while (doc_e!=sys_clipboard_doc) {
|
||||
if (doc_e->type_u8==DOCT_SPRITE) {
|
||||
root2=Sprite2Que(doc_e->bin_data->data);
|
||||
if (root2->next!=root2) {
|
||||
tempg=root2->next;
|
||||
while (tempg!=root2) {
|
||||
cur_num++;
|
||||
tempg=tempg->next;
|
||||
if (msg_code==MSG_IP_L_UP && sys_cur_scan_code&SCF_DELETE ||
|
||||
msg_code==MSG_KEY_DOWN && p2&SCF_IP_L_DOWN && p2.u8[0]==SC_DELETE) {
|
||||
*_cur_num=doc->cur_sprite_elem_num;
|
||||
cur_elem=GrNum2Que(*_root,*_cur_num);
|
||||
if (cur_elem!=*_root) {
|
||||
QueRem(cur_elem);
|
||||
Free(cur_elem);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
}
|
||||
next=root2->next;
|
||||
last=root2->last;
|
||||
insert_pt->last->next=next;
|
||||
next->last=insert_pt->last;
|
||||
insert_pt->last=last;
|
||||
last->next=insert_pt;
|
||||
doc->cur_sprite=tempb->data;
|
||||
doc->cur_sprite_elem_num=0;
|
||||
if (msg_code==MSG_KEY_DOWN)
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_UP);
|
||||
}
|
||||
Free(root2);
|
||||
} while (del_down || msg_code!=MSG_IP_L_UP && msg_code!=MSG_IP_R_UP);
|
||||
*_cur_num=doc->cur_sprite_elem_num;
|
||||
doc->cur_sprite=NULL;
|
||||
break;
|
||||
case GED_SNAP:
|
||||
PopUpSnap(&Fs->snap);
|
||||
ip_snap=Fs->snap.x;
|
||||
ip_scaler=Fs->snap.dx;
|
||||
break;
|
||||
case GED_SET_ORIGIN:
|
||||
doc_e->flags1=old_e_flags1;
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_UP);
|
||||
GrSetOrigin(*_root,x-p1,y-p2,0);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
break;
|
||||
case GED_SHIFT_ORIGIN:
|
||||
doc_e->flags1=old_e_flags1;
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_DOWN);
|
||||
xx=p1; yy=p2;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,
|
||||
1<<MSG_IP_L_UP+1<<MSG_IP_MOVE);
|
||||
GrSetOrigin(*_root,p1-xx,p2-yy,0);
|
||||
xx=p1; yy=p2;
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
} while (msg_code!=MSG_IP_L_UP);
|
||||
break;
|
||||
case GED_SHIFT_PTS:
|
||||
case GED_SHIFT_RECTS:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_PTS_RECTANGLES,
|
||||
"You can switch between points\n"
|
||||
"and rectangles with '$$FG,GREEN$$p$$FG$$' and '$$FG,GREEN$$r$$FG$$'.\n"
|
||||
"Press '$$FG,GREEN$$r$$FG$$' after one rectangle\n"
|
||||
"to OR another rectangle.\n");
|
||||
doc_e->flags1=old_e_flags1;
|
||||
if (SpriteShiftPts(tempb->data,x,y,_cur_num,i)) {
|
||||
QueDel(*_root);
|
||||
Free(*_root);
|
||||
*_root=Sprite2Que(tempb->data);
|
||||
} else
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
break;
|
||||
case GED_TRANSFORM:
|
||||
if (PopUpTransform(r)) {
|
||||
SpriteTransform(r,*_root);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
}
|
||||
doc_e=doc_e->next;
|
||||
}
|
||||
if (unlock2)
|
||||
DocUnlock(sys_clipboard_doc);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
break;
|
||||
case GED_VECT:
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
switch (SpriteVect(doc,doc_ce,&root,&cur_num,x,y,FALSE,&new_snap,&new_ip_scaler)) {
|
||||
case GE_OKAY_DONE:
|
||||
i=GED_END;
|
||||
break;
|
||||
case GE_CANCEL:
|
||||
i=DOCM_CANCEL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case GED_DELETE:
|
||||
cur_elem=GrNum2Que(root,cur_num);
|
||||
if (cur_elem!=root) {
|
||||
QueRem(cur_elem);
|
||||
Free(cur_elem);
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
}
|
||||
break;
|
||||
case GED_ED:
|
||||
if (SpriteTextEd(&root,&cur_num))
|
||||
GrEdUpdate(doc,tempb,root);
|
||||
break;
|
||||
break;
|
||||
case GED_SHIFT_SUB_ORIGIN:
|
||||
doc_e->flags1=old_e_flags1;
|
||||
insert_pt=GrNum2Que(*_root,*_cur_num);
|
||||
tempg=MAlloc(gr_sprite_qued_base_size[GRST_SHIFT]);
|
||||
tempg->type=GRST_SHIFT;
|
||||
tempg->x1=0;
|
||||
tempg->y1=0;
|
||||
QueIns(tempg,insert_pt->last);
|
||||
GetMsg(&p1,&p2,1<<MSG_IP_L_DOWN);
|
||||
xx=p1; yy=p2;
|
||||
do {
|
||||
msg_code=GetMsg(&p1,&p2,
|
||||
1<<MSG_IP_L_UP+1<<MSG_IP_MOVE);
|
||||
tempg->x1=p1-xx;
|
||||
tempg->y1=p2-yy;
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
} while (msg_code!=MSG_IP_L_UP);
|
||||
*_cur_num+=1;
|
||||
break;
|
||||
case GED_INS_CLIPBOARD:
|
||||
AcctOneTimePopUp(ARf_CSPRITE_INS_CLIPBOARD,
|
||||
"You will probably want to shift around\n"
|
||||
"the location of element groups. Use\n"
|
||||
"'Insert shift sub-origin' after picking the\n"
|
||||
"element to insert before. Or,\n"
|
||||
"use 'shift points'.\n");
|
||||
insert_pt=GrNum2Que(*_root,*_cur_num);
|
||||
unlock=DocLock(sys_clipboard_doc);
|
||||
doc_e2=sys_clipboard_doc->root.next;
|
||||
while (doc_e2!=sys_clipboard_doc) {
|
||||
if (doc_e2->type_u8==DOCT_SPRITE) {
|
||||
root2=Sprite2Que(doc_e2->bin_data->data);
|
||||
if (root2->next!=root2) {
|
||||
tempg=root2->next;
|
||||
while (tempg!=root2) {
|
||||
*_cur_num+=1;
|
||||
tempg=tempg->next;
|
||||
}
|
||||
next=root2->next;
|
||||
last=root2->last;
|
||||
insert_pt->last->next=next;
|
||||
next->last=insert_pt->last;
|
||||
insert_pt->last=last;
|
||||
last->next=insert_pt;
|
||||
}
|
||||
Free(root2);
|
||||
}
|
||||
doc_e2=doc_e2->next;
|
||||
}
|
||||
if (unlock)
|
||||
DocUnlock(sys_clipboard_doc);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
break;
|
||||
case GED_DELETE:
|
||||
cur_elem=GrNum2Que(*_root,*_cur_num);
|
||||
if (cur_elem!=*_root) {
|
||||
QueRem(cur_elem);
|
||||
Free(cur_elem);
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
}
|
||||
break;
|
||||
case GED_TEXT_ED:
|
||||
if (SpriteTextEd(_root,_cur_num))
|
||||
GrEdUpdate(doc,tempb,*_root);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (i!=DOCM_CANCEL && i!=GED_END);
|
||||
doc_ce->flags1=old_ce_flags1;
|
||||
DocLock(doc);
|
||||
if (i==GED_END)
|
||||
Free(old_CSprite);
|
||||
else {
|
||||
Free(tempb->data);
|
||||
tempb->data=old_CSprite;
|
||||
tempb->size=old_size;
|
||||
} while (i!=DOCM_CANCEL && i!=GED_EXIT && i!=GED_MAIN_MENU);
|
||||
doc_e->flags1=old_e_flags1;
|
||||
|
||||
if (_ip_snap) *_ip_snap=ip_snap;
|
||||
if (_ip_scaler) *_ip_scaler=ip_scaler;
|
||||
switch (i) {
|
||||
case DOCM_CANCEL: return GE_ABORT;
|
||||
case GED_EXIT: return GE_EXIT;
|
||||
case GED_MAIN_MENU: return GE_CONT;
|
||||
}
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
if (_import_snap) *_import_snap=new_snap;
|
||||
if (_import_ip_scaler) *_import_ip_scaler=new_ip_scaler;
|
||||
QueDel(root);
|
||||
Free(root);
|
||||
StrCpy(Fs->task_title,old_desc);
|
||||
Free(old_desc);
|
||||
StrCpy(doc->filename.name,old_filename);
|
||||
Free(old_filename);
|
||||
SettingsPop;
|
||||
doc->flags|=old_doc_flags;
|
||||
}
|
||||
|
||||
#help_index "Graphics"
|
||||
File diff suppressed because it is too large.
Load diff
@@ -28,7 +28,7 @@ class CGrMTri
|
||||
CMeshTri mt;
|
||||
U0 end;
|
||||
|
||||
I32 cpu_num,flags; //Draw different triangles with different cores.
|
||||
I32 cpu_num,flags; //Draw different tris with different cores.
|
||||
CGrMVertex *t[3];
|
||||
};
|
||||
|
||||
@@ -40,13 +40,13 @@ class CGrMFrame
|
||||
I64 mode,cx,cy;
|
||||
CColorROPU32 cur_color;
|
||||
Bool grid_on,flip_y,select_rect,vertex_on,pad[4];
|
||||
I64 mp_done_flags; //Used for multiprocessing signaling.
|
||||
I64 mp_not_done_flags; //Used for multiprocessing signaling.
|
||||
F64 view_scale;
|
||||
CDC *dc;
|
||||
I64 *w2s,*s2w; //Screen-to-world and world-to-screen transform matrices.
|
||||
I64 vertex_cnt,triangle_cnt; //Set by GrMSize
|
||||
I64 vertex_cnt,tri_cnt; //Set by GrMSize
|
||||
CGrMVertex vertex_root,*cur_vertex;
|
||||
CGrMTri triangle_root,*cur_triangle;
|
||||
CGrMTri tri_root,*cur_tri;
|
||||
I64 x1,y1,x2,y2,cur_snap;
|
||||
};
|
||||
|
||||
@@ -69,7 +69,7 @@ CGrMTri *GrMTriNew(CGrMFrame *e,CColorROPU32 color,CGrMVertex *v1,CGrMVertex *v2
|
||||
tempt->t[0]=v1;
|
||||
tempt->t[1]=v2;
|
||||
tempt->t[2]=v3;
|
||||
QueIns(tempt,e->triangle_root.last);
|
||||
QueIns(tempt,e->tri_root.last);
|
||||
return tempt;
|
||||
}
|
||||
|
||||
@@ -103,11 +103,11 @@ CGrMVertex *GrMVertexFindNum(CGrMFrame *e,I64 num)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
U0 GrMTriangleDel(CGrMFrame *e,CGrMTri *tempt)
|
||||
U0 GrMTriDel(CGrMFrame *e,CGrMTri *tempt)
|
||||
{
|
||||
if (tempt) {
|
||||
if (tempt==e->cur_triangle)
|
||||
e->cur_triangle=NULL;
|
||||
if (tempt==e->cur_tri)
|
||||
e->cur_tri=NULL;
|
||||
QueRem(tempt);
|
||||
Free(tempt);
|
||||
}
|
||||
@@ -118,14 +118,14 @@ U0 GrMVertexDel(CGrMFrame *e,CGrMVertex *tempv)
|
||||
I64 i;
|
||||
CGrMTri *tempt,*tempt1;
|
||||
if (tempv) {
|
||||
tempt=e->triangle_root.next;
|
||||
while (tempt!=&e->triangle_root) {
|
||||
tempt=e->tri_root.next;
|
||||
while (tempt!=&e->tri_root) {
|
||||
tempt1=tempt->next;
|
||||
for (i=0;i<3;i++)
|
||||
if (tempt->t[i]==tempv)
|
||||
break;
|
||||
if (i<3)
|
||||
GrMTriangleDel(e,tempt);
|
||||
GrMTriDel(e,tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
if (tempv==e->cur_vertex)
|
||||
@@ -147,10 +147,10 @@ U0 GrMVertexSelectAll(CGrMFrame *e,Bool val)
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrMTriangleSelectAll(CGrMFrame *e,Bool val)
|
||||
U0 GrMTriSelectAll(CGrMFrame *e,Bool val)
|
||||
{
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
while (tempt!=&e->triangle_root) {
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (val)
|
||||
tempt->flags|=TF_SELECTED;
|
||||
else
|
||||
@@ -213,12 +213,12 @@ U0 GrMVertexSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2)
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrMTriangleSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2)
|
||||
U0 GrMTriSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2)
|
||||
{
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
if (x1>x2) SwapU64(&x1,&x2);
|
||||
if (y1>y2) SwapU64(&y1,&y2);
|
||||
while (tempt!=&e->triangle_root) {
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (x1<=tempt->t[0]->pt.x<=x2 &&
|
||||
y1<=tempt->t[0]->pt.y<=y2 &&
|
||||
x1<=tempt->t[1]->pt.x<=x2 &&
|
||||
@@ -250,13 +250,13 @@ I64 GrMSelectCnt(CGrMFrame *e)
|
||||
{
|
||||
I64 result=0;
|
||||
CGrMVertex *tempv=e->vertex_root.next;
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
while (tempv!=&e->vertex_root) {
|
||||
if (tempv->flags&VF_SELECTED)
|
||||
result++;
|
||||
tempv=tempv->next;
|
||||
}
|
||||
while (tempt!=&e->triangle_root) {
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (tempt->flags&TF_SELECTED)
|
||||
result++;
|
||||
tempt=tempt->next;
|
||||
@@ -324,22 +324,22 @@ U0 GrMTransformSelect(CGrMFrame *e)
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrMFlipTriangles(CGrMFrame *e)
|
||||
U0 GrMFlipTris(CGrMFrame *e)
|
||||
{
|
||||
Bool unselect;
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
if (!GrMSelectCnt(e)) {
|
||||
GrMTriangleSelectAll(e,TRUE);
|
||||
GrMTriSelectAll(e,TRUE);
|
||||
unselect=TRUE;
|
||||
} else
|
||||
unselect=FALSE;
|
||||
while (tempt!=&e->triangle_root) {
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (tempt->flags & TF_SELECTED)
|
||||
SwapU64(&tempt->t[1],&tempt->t[2]);
|
||||
tempt=tempt->next;
|
||||
}
|
||||
if (unselect)
|
||||
GrMTriangleSelectAll(e,FALSE);
|
||||
GrMTriSelectAll(e,FALSE);
|
||||
}
|
||||
|
||||
U0 GrMRecalcCxCy(CTask *task,CGrMFrame *e)
|
||||
@@ -383,7 +383,7 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core.
|
||||
//Makes a copy of e->dc so we can change dc->color member and stuff.
|
||||
CDC *dc=DCAlias(e->dc,e->dc->win_task);
|
||||
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
I64 i,*old_r=dc->r;
|
||||
|
||||
//$LK,"DCAlias","MN:DCAlias"$() allocates a new identity rotation matrix.
|
||||
@@ -425,17 +425,17 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core.
|
||||
GrLine3(dc,0,0,-500,0,0,0);
|
||||
}
|
||||
|
||||
while (tempt!=&e->triangle_root) {
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (tempt->cpu_num==Gs->num) {
|
||||
if (tempt->flags & TF_SELECTED) {
|
||||
if (Blink)
|
||||
dc->color=ROPF_DITHER+WHITE<<16+RED;
|
||||
else
|
||||
dc->color=ROPF_DITHER+RED<<16+WHITE;
|
||||
GrFillTriangle0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt);
|
||||
GrFillTri0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt);
|
||||
} else {
|
||||
(*dc->lighting)(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt,tempt->mt.color);
|
||||
GrFillTriangle0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt);
|
||||
GrFillTri0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt);
|
||||
}
|
||||
}
|
||||
tempt=tempt->next;
|
||||
@@ -446,7 +446,7 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core.
|
||||
dc->depth_buf=NULL;
|
||||
|
||||
DCDel(dc);
|
||||
LBts(&e->mp_done_flags,Gs->num);
|
||||
LBtr(&e->mp_not_done_flags,Gs->num);
|
||||
}
|
||||
|
||||
I64 *GrMW2S(CGrMFrame *e,CTask *task)
|
||||
@@ -519,25 +519,25 @@ U0 GrMCursorW(CGrMFrame *e,CTask *task,I64 *_x,I64 *_y,I64 *_z)
|
||||
|
||||
|
||||
CGrMVertex sys_vertex_root;
|
||||
CGrMTri sys_triangle_root;
|
||||
CGrMTri sys_tri_root;
|
||||
|
||||
U0 GrMClipBoardInit()
|
||||
{
|
||||
QueInit(&sys_vertex_root);
|
||||
QueInit(&sys_triangle_root);
|
||||
QueInit(&sys_tri_root);
|
||||
}
|
||||
|
||||
U0 GrMClipBoardRst()
|
||||
{
|
||||
QueDel(&sys_vertex_root,TRUE);
|
||||
QueDel(&sys_triangle_root,TRUE);
|
||||
QueDel(&sys_tri_root,TRUE);
|
||||
GrMClipBoardInit;
|
||||
}
|
||||
|
||||
U0 GrMClipBoardCopy(CGrMFrame *e)
|
||||
{
|
||||
CGrMVertex *tempv=e->vertex_root.next,*tempv2;
|
||||
CGrMTri *tempt=e->triangle_root.next,*tempt2;
|
||||
CGrMTri *tempt=e->tri_root.next,*tempt2;
|
||||
|
||||
GrMClipBoardRst;
|
||||
while (tempv!=&e->vertex_root) {
|
||||
@@ -553,7 +553,7 @@ U0 GrMClipBoardCopy(CGrMFrame *e)
|
||||
}
|
||||
tempv=tempv->next;
|
||||
}
|
||||
while (tempt!=&e->triangle_root) {
|
||||
while (tempt!=&e->tri_root) {
|
||||
if (tempt->flags&TF_SELECTED &&
|
||||
tempt->t[0]->copy && tempt->t[1]->copy && tempt->t[2]->copy) {
|
||||
tempt2=ACAlloc(sizeof(CGrMTri));
|
||||
@@ -561,7 +561,7 @@ U0 GrMClipBoardCopy(CGrMFrame *e)
|
||||
tempt2->t[1]=tempt->t[1]->copy;
|
||||
tempt2->t[2]=tempt->t[2]->copy;
|
||||
tempt2->mt.color=tempt->mt.color;
|
||||
QueIns(tempt2,sys_triangle_root.last);
|
||||
QueIns(tempt2,sys_tri_root.last);
|
||||
tempt->flags|=TF_COPIED;
|
||||
tempt->flags&=~TF_SELECTED;
|
||||
} else
|
||||
@@ -573,47 +573,47 @@ U0 GrMClipBoardCopy(CGrMFrame *e)
|
||||
U0 GrMClipBoardCut(CGrMFrame *e)
|
||||
{
|
||||
CGrMVertex *tempv=e->vertex_root.next,*tempv1;
|
||||
CGrMTri *tempt=e->triangle_root.next,*tempt1;
|
||||
CGrMTri *tempt=e->tri_root.next,*tempt1;
|
||||
GrMClipBoardCopy(e);
|
||||
while (tempt!=&e->tri_root) {
|
||||
tempt1=tempt->next;
|
||||
if (tempt->flags&TF_COPIED)
|
||||
GrMTriDel(e,tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
while (tempv!=&e->vertex_root) {
|
||||
tempv1=tempv->next;
|
||||
if (tempv->flags&VF_COPIED)
|
||||
GrMVertexDel(e,tempv);
|
||||
tempv=tempv1;
|
||||
}
|
||||
while (tempt!=&e->triangle_root) {
|
||||
tempt1=tempt->next;
|
||||
if (tempt->flags&TF_COPIED)
|
||||
GrMTriangleDel(e,tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrMClipBoardDel(CGrMFrame *e)
|
||||
{//Technically not clipboard
|
||||
CGrMVertex *tempv=e->vertex_root.next,*tempv1;
|
||||
CGrMTri *tempt=e->triangle_root.next,*tempt1;
|
||||
CGrMTri *tempt=e->tri_root.next,*tempt1;
|
||||
while (tempt!=&e->tri_root) {
|
||||
tempt1=tempt->next;
|
||||
if (tempt->flags&TF_SELECTED)
|
||||
GrMTriDel(e,tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
while (tempv!=&e->vertex_root) {
|
||||
tempv1=tempv->next;
|
||||
if (tempv->flags&VF_SELECTED)
|
||||
GrMVertexDel(e,tempv);
|
||||
tempv=tempv1;
|
||||
}
|
||||
while (tempt!=&e->triangle_root) {
|
||||
tempt1=tempt->next;
|
||||
if (tempt->flags&TF_SELECTED)
|
||||
GrMTriangleDel(e,tempt);
|
||||
tempt=tempt1;
|
||||
}
|
||||
}
|
||||
|
||||
U0 GrMClipBoardPaste(CGrMFrame *e)
|
||||
{
|
||||
CGrMVertex *tempv2=sys_vertex_root.next,*tempv;
|
||||
CGrMTri *tempt2=sys_triangle_root.next,*tempt;
|
||||
CGrMTri *tempt2=sys_tri_root.next,*tempt;
|
||||
|
||||
GrMVertexSelectAll(e,FALSE);
|
||||
GrMTriangleSelectAll(e,FALSE);
|
||||
GrMTriSelectAll(e,FALSE);
|
||||
while (tempv2!=&sys_vertex_root) {
|
||||
tempv2->copy=tempv=CAlloc(sizeof(CGrMVertex));
|
||||
MemCpy(&tempv->p,&tempv2->p,sizeof(CD3I32));
|
||||
@@ -622,7 +622,7 @@ U0 GrMClipBoardPaste(CGrMFrame *e)
|
||||
tempv2=tempv2->next;
|
||||
}
|
||||
|
||||
while (tempt2!=&sys_triangle_root) {
|
||||
while (tempt2!=&sys_tri_root) {
|
||||
tempt=GrMTriNew(e,tempt2->mt.color,tempt2->t[0]->copy,tempt2->t[1]->copy,tempt2->t[2]->copy);
|
||||
tempt->flags|=TF_SELECTED;
|
||||
tempt2=tempt2->next;
|
||||
@@ -679,11 +679,10 @@ U0 DrawIt(CTask *task,CDC *dc)
|
||||
tempv=tempv->next;
|
||||
}
|
||||
|
||||
e->mp_done_flags=0; //Issue jobs to all cores.
|
||||
e->mp_not_done_flags=1<<mp_cnt-1; //Issue jobs to all cores.
|
||||
e->dc=dc;
|
||||
for (i=1;i<mp_cnt;i++)
|
||||
MPJob(&MPDrawIt,e,i);
|
||||
MPDrawIt(e); //Do one job ourself.
|
||||
for (i=0;i<mp_cnt;i++)
|
||||
JobQue(&MPDrawIt,e,i);
|
||||
|
||||
tempv=e->vertex_root.next;
|
||||
while (tempv!=&e->vertex_root) {
|
||||
@@ -743,7 +742,7 @@ U0 DrawIt(CTask *task,CDC *dc)
|
||||
GrLineRect4(dc,e->x1,e->y1,e->x2,e->y2);
|
||||
}
|
||||
//Wait for all cores to complete.
|
||||
while (e->mp_done_flags!=1<<mp_cnt-1)
|
||||
while (e->mp_not_done_flags)
|
||||
Yield;
|
||||
}
|
||||
|
||||
@@ -752,7 +751,7 @@ U0 GrMInit(CGrMFrame *e,Bool flip_y)
|
||||
MemSet(e,0,sizeof(CGrMFrame));
|
||||
e->task=Fs;
|
||||
e->vertex_root.next=e->vertex_root.last=&e->vertex_root;
|
||||
e->triangle_root.next=e->triangle_root.last=&e->triangle_root;
|
||||
e->tri_root.next=e->tri_root.last=&e->tri_root;
|
||||
e->mode='v';
|
||||
e->grid_on=TRUE;
|
||||
e->vertex_on=TRUE;
|
||||
@@ -764,7 +763,7 @@ U0 GrMInit(CGrMFrame *e,Bool flip_y)
|
||||
e->cur_snap=5;
|
||||
e->flip_y=flip_y;
|
||||
e->select_rect=FALSE;
|
||||
e->cur_triangle=NULL;
|
||||
e->cur_tri=NULL;
|
||||
e->cur_vertex=NULL;
|
||||
}
|
||||
|
||||
@@ -775,10 +774,10 @@ U0 GrMLoad(CGrMFrame *e,U8 *src)
|
||||
CGrMVertex *tempv,*va[3];
|
||||
|
||||
e->vertex_root.next=e->vertex_root.last=&e->vertex_root;
|
||||
e->triangle_root.next=e->triangle_root.last=&e->triangle_root;
|
||||
e->tri_root.next=e->tri_root.last=&e->tri_root;
|
||||
|
||||
e->vertex_cnt =*src(I32 *)++;
|
||||
e->triangle_cnt=*src(I32 *)++;
|
||||
e->tri_cnt=*src(I32 *)++;
|
||||
for (i=0;i<e->vertex_cnt;i++) {
|
||||
x=*src(I32 *)++;
|
||||
y=*src(I32 *)++;
|
||||
@@ -786,7 +785,7 @@ U0 GrMLoad(CGrMFrame *e,U8 *src)
|
||||
tempv=GrMVertexNew(e,x,y,z);
|
||||
tempv->num=i;
|
||||
}
|
||||
for (i=0;i<e->triangle_cnt;i++) {
|
||||
for (i=0;i<e->tri_cnt;i++) {
|
||||
color=*src(I32 *)++;
|
||||
for (j=0;j<3;j++)
|
||||
va[j]=GrMVertexFindNum(e,*src(I32 *)++);
|
||||
@@ -798,7 +797,7 @@ I64 GrMSize(CGrMFrame *e)
|
||||
{
|
||||
I64 i;
|
||||
CGrMVertex *tempv=e->vertex_root.next;
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
|
||||
e->vertex_cnt=0;
|
||||
while (tempv!=&e->vertex_root) {
|
||||
@@ -806,16 +805,16 @@ I64 GrMSize(CGrMFrame *e)
|
||||
tempv=tempv->next;
|
||||
}
|
||||
|
||||
e->triangle_cnt=0;
|
||||
while (tempt!=&e->triangle_root) {
|
||||
e->triangle_cnt++;
|
||||
e->tri_cnt=0;
|
||||
while (tempt!=&e->tri_root) {
|
||||
e->tri_cnt++;
|
||||
for (i=0;i<3;i++)
|
||||
tempt->mt.nums[i]=tempt->t[i]->num;
|
||||
tempt=tempt->next;
|
||||
}
|
||||
return sizeof(I32)*2+
|
||||
(offset(CGrMVertex.end)-offset(CGrMVertex.start))*e->vertex_cnt+
|
||||
(offset(CGrMTri.end)-offset(CGrMTri.start))*e->triangle_cnt;
|
||||
(offset(CGrMTri.end)-offset(CGrMTri.start))*e->tri_cnt;
|
||||
}
|
||||
|
||||
I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL)
|
||||
@@ -823,10 +822,10 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL)
|
||||
I64 size=GrMSize(e);
|
||||
U8 *result=MAlloc(size),*dst=result;
|
||||
CGrMVertex *tempv=e->vertex_root.next;
|
||||
CGrMTri *tempt=e->triangle_root.next;
|
||||
CGrMTri *tempt=e->tri_root.next;
|
||||
|
||||
*dst(I32 *)++=e->vertex_cnt;
|
||||
*dst(I32 *)++=e->triangle_cnt;
|
||||
*dst(I32 *)++=e->tri_cnt;
|
||||
|
||||
e->vertex_cnt=0;
|
||||
while (tempv!=&e->vertex_root) {
|
||||
@@ -835,8 +834,8 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL)
|
||||
tempv=tempv->next;
|
||||
}
|
||||
|
||||
e->triangle_cnt=0;
|
||||
while (tempt!=&e->triangle_root) {
|
||||
e->tri_cnt=0;
|
||||
while (tempt!=&e->tri_root) {
|
||||
MemCpy(dst,&tempt->start,offset(CGrMTri.end)-offset(CGrMTri.start));
|
||||
dst+=offset(CGrMTri.end)-offset(CGrMTri.start);
|
||||
tempt=tempt->next;
|
||||
@@ -848,7 +847,7 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL)
|
||||
U0 GrMCleanUp(CGrMFrame *e)
|
||||
{
|
||||
QueDel(&e->vertex_root,TRUE);
|
||||
QueDel(&e->triangle_root,TRUE);
|
||||
QueDel(&e->tri_root,TRUE);
|
||||
Free(e->w2s);
|
||||
Free(e->s2w);
|
||||
}
|
||||
@@ -866,7 +865,7 @@ U0 GrMUpdateMenu(CGrMFrame *e)
|
||||
tempse->checked=ToBool(e->mode=='m');
|
||||
if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MoveVertexZ"))
|
||||
tempse->checked=ToBool(e->mode=='M');
|
||||
if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MakeTriangle"))
|
||||
if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MakeTri"))
|
||||
tempse->checked=ToBool(e->mode=='t');
|
||||
if (tempse=MenuEntryFind(Fs->cur_menu,"View/FlipY"))
|
||||
tempse->checked=ToBool(e->flip_y);
|
||||
@@ -878,9 +877,9 @@ I32 *CSpriteMesh(I32 *root=NULL,I64 *_size=NULL,Bool flip_y=FALSE)
|
||||
Fmt for mesh:
|
||||
{
|
||||
I32 vertex_cnt;
|
||||
I32 triangle_cnt;
|
||||
I32 tri_cnt;
|
||||
CD3I32 vertices[];
|
||||
CMeshTri triangles[];
|
||||
CMeshTri tris[];
|
||||
}
|
||||
|
||||
If root points to a mesh, it will load it.
|
||||
@@ -940,7 +939,7 @@ $WW,0$*/
|
||||
" PlaceVertex(,'v');"
|
||||
" MoveVertex(,'m');"
|
||||
" MoveVertexZ(,'M');"
|
||||
" MakeTriangle(,'t');"
|
||||
" MakeTri(,'t');"
|
||||
"}"
|
||||
"Settings {"
|
||||
" Color(,'c');"
|
||||
@@ -967,12 +966,13 @@ $WW,0$*/
|
||||
"}");
|
||||
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
WordStat;
|
||||
Preempt(OFF); //We don't really want window update while modifying links
|
||||
AcctOneTimePopUp(ARf_MESH_ED,
|
||||
"$$FG,GREEN$$Right Mouse$$FG$$: Hold and move to shift cursor z\n"
|
||||
"$$FG,GREEN$$'j'$$FG$$: Jump cursor Z to nearest vertex's Z\n"
|
||||
"$$FG,GREEN$$'v'$$FG$$: Place Vertex Mode\n"
|
||||
"$$FG,GREEN$$'t'$$FG$$: Make Triangle Mode\n"
|
||||
"$$FG,GREEN$$'t'$$FG$$: Make Tri Mode\n"
|
||||
"$$FG,GREEN$$'m'$$FG$$: Move Vertex Mode\n"
|
||||
"$$FG,GREEN$$'M'$$FG$$: Move Vertex Z\n"
|
||||
"$$FG,GREEN$$'c'$$FG$$: Set color\n"
|
||||
@@ -982,7 +982,6 @@ $WW,0$*/
|
||||
Fs->win_inhibit=WIF_ALL|WIF_DOC-WIF_BORDER-WIF_CTRLS-WIF_MENU-WIF_GRAB_SCROLL;
|
||||
Fs->horz_scroll.pos=0;
|
||||
Fs->vert_scroll.pos=0;
|
||||
WordStat;
|
||||
GrMInit(&e,flip_y);
|
||||
if (root)
|
||||
GrMLoad(&e,root);
|
||||
@@ -1013,7 +1012,7 @@ gm_restart:
|
||||
else if (e.mode!='t')
|
||||
GrMVertexDel(&e,GrMVertexFindS(&e,ipx_presnap-Fs->win_pixel_left-Fs->win_scroll_x,ipy_presnap-Fs->win_pixel_top-Fs->win_scroll_y));
|
||||
GrMVertexSelectAll(&e,FALSE);
|
||||
GrMTriangleSelectAll(&e,FALSE);
|
||||
GrMTriSelectAll(&e,FALSE);
|
||||
vn=0;
|
||||
}
|
||||
break;
|
||||
@@ -1039,16 +1038,16 @@ gm_restart:
|
||||
case 't':
|
||||
if (vn) {
|
||||
GrMVertexSelectAll(&e,FALSE);
|
||||
GrMTriangleSelectAll(&e,FALSE);
|
||||
GrMTriSelectAll(&e,FALSE);
|
||||
vn=0;
|
||||
} else
|
||||
GrMTriangleDel(&e,e.cur_triangle);
|
||||
GrMTriDel(&e,e.cur_tri);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
GrMVertexSelectAll(&e,FALSE);
|
||||
GrMTriangleSelectAll(&e,FALSE);
|
||||
GrMTriSelectAll(&e,FALSE);
|
||||
case 'v':
|
||||
case 'm':
|
||||
case 'M':
|
||||
@@ -1062,7 +1061,7 @@ gm_restart:
|
||||
GrMTransformSelect(&e);
|
||||
break;
|
||||
case 'A':
|
||||
GrMTriangleSelectAll(&e,TRUE);
|
||||
GrMTriSelectAll(&e,TRUE);
|
||||
if (e.mode!='t')
|
||||
GrMVertexSelectAll(&e,TRUE);
|
||||
else
|
||||
@@ -1070,7 +1069,7 @@ gm_restart:
|
||||
vn=0;
|
||||
break;
|
||||
case 'U':
|
||||
GrMTriangleSelectAll(&e,FALSE);
|
||||
GrMTriSelectAll(&e,FALSE);
|
||||
GrMVertexSelectAll(&e,FALSE);
|
||||
vn=0;
|
||||
break;
|
||||
@@ -1104,7 +1103,7 @@ gm_restart:
|
||||
}
|
||||
}
|
||||
e.select_rect=FALSE;
|
||||
GrMTriangleSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2);
|
||||
GrMTriSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2);
|
||||
if (e.mode!='t')
|
||||
GrMVertexSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2);
|
||||
else
|
||||
@@ -1147,7 +1146,7 @@ gm_restart:
|
||||
GrMScaleZoom(&e,1/1.5);
|
||||
break;
|
||||
case 'c':
|
||||
e.cur_color=PopUpLightingColor;
|
||||
e.cur_color=PopUpColorLighting;
|
||||
break;
|
||||
case 's':
|
||||
i=PopUpRangeI64(1,25,1,"New Snap\n");
|
||||
@@ -1210,11 +1209,11 @@ gm_restart:
|
||||
GrMInvertAxis(&e,offset(CD3I32.z));
|
||||
break;
|
||||
case 'f':
|
||||
if (e.cur_triangle)
|
||||
SwapU64(&e.cur_triangle->t[1],&e.cur_triangle->t[2]);
|
||||
if (e.cur_tri)
|
||||
SwapU64(&e.cur_tri->t[1],&e.cur_tri->t[2]);
|
||||
break;
|
||||
case 'F':
|
||||
GrMFlipTriangles(&e);
|
||||
GrMFlipTris(&e);
|
||||
break;
|
||||
|
||||
}
|
||||
@@ -1283,7 +1282,7 @@ gm_restart:
|
||||
GrMCursorW(&e,Fs,&x,&y,&z);
|
||||
GrMP0Offset(&e,x-p0a.x,y-p0a.y,z-p0a.z);
|
||||
}
|
||||
GrMTriangleSelectAll(&e,FALSE);
|
||||
GrMTriSelectAll(&e,FALSE);
|
||||
GrMVertexSelectAll(&e,FALSE);
|
||||
moving=FALSE;
|
||||
}
|
||||
@@ -1300,7 +1299,7 @@ gm_restart:
|
||||
va[vn++]=tempv;
|
||||
tempv->flags|=VF_SELECTED;
|
||||
if (vn==3) {
|
||||
e.cur_triangle=GrMTriNew(&e,e.cur_color,va[0],va[1],va[2]);
|
||||
e.cur_tri=GrMTriNew(&e,e.cur_color,va[0],va[1],va[2]);
|
||||
for (i=0;i<vn;i++)
|
||||
va[i]->flags&=~VF_SELECTED;
|
||||
vn=0;
|
||||
|
||||
@@ -28,12 +28,12 @@ offset(CSprite.linespeed)-offset(CSprite.start), //GRST_BITMAP8
|
||||
1,
|
||||
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT
|
||||
offset(CSprite.sides)-offset(CSprite.start), //GRST_ELLIPSE
|
||||
sizeof(CSprite)-offset(CSprite.start), //GRST_REG_POLY
|
||||
sizeof(CSprite)-offset(CSprite.start), //GRST_POLYGON
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_PLANAR_SYMMETRY
|
||||
2+offset(CSprite.dither_color8)-offset(CSprite.start), //GRST_DITHER_COLOR8
|
||||
offset(CSprite.sides)-offset(CSprite.start), //GRST_ROTATED_RECT
|
||||
offset(CSprite.x2)-offset(CSprite.start), //GRST_MESH
|
||||
offset(CSprite.shiftable_triangle_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH
|
||||
offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH
|
||||
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_ON
|
||||
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_OFF
|
||||
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_ARROW
|
||||
@@ -68,12 +68,12 @@ offset(CSprite.linespeed), //GRST_BITMAP8
|
||||
1,
|
||||
offset(CSprite.st), //GRST_TEXT
|
||||
offset(CSprite.sides), //GRST_ELLIPSE
|
||||
sizeof(CSprite), //GRST_REG_POLY
|
||||
sizeof(CSprite), //GRST_POLYGON
|
||||
offset(CSprite.linespeed), //GRST_PLANAR_SYMMETRY
|
||||
2+offset(CSprite.dither_color8), //GRST_DITHER_COLOR8
|
||||
offset(CSprite.sides), //GRST_ROTATED_RECT
|
||||
offset(CSprite.x2), //GRST_MESH
|
||||
offset(CSprite.shiftable_triangle_cnt)+sizeof(I32), //GRST_SHIFTABLE_MESH
|
||||
offset(CSprite.shiftable_tri_cnt)+sizeof(I32), //GRST_SHIFTABLE_MESH
|
||||
offset(CSprite.x1), //GRST_TRANSFORM_ON
|
||||
offset(CSprite.x1), //GRST_TRANSFORM_OFF
|
||||
offset(CSprite.linespeed), //GRST_ARROW
|
||||
@@ -107,10 +107,10 @@ I64 SpriteElemSize(CSprite *tempg)
|
||||
i+=tempg->num*sizeof(CD3I32);
|
||||
break;
|
||||
case GRST_MESH:
|
||||
i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->triangle_cnt*sizeof(CMeshTri);
|
||||
i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->tri_cnt*sizeof(CMeshTri);
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_triangle_cnt*sizeof(CMeshTri);
|
||||
i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_tri_cnt*sizeof(CMeshTri);
|
||||
break;
|
||||
}
|
||||
return i;
|
||||
@@ -171,7 +171,7 @@ public U8 *Sprite2Text(CSprite *tempg)
|
||||
{ //Study $LK-A,"::/TempleOS/Demo/Graphics/SpriteText.CPP"$.
|
||||
U8 buf[256],buf2[256],buf3[136];
|
||||
I32 *ptr;
|
||||
SPrintF(buf,"%Z",tempg->type,"ST_CSPRITE_TYPES");
|
||||
SPrintF(buf,"%Z",tempg->type,"ST_SPRITE_TYPES");
|
||||
*buf2=0;
|
||||
switch (tempg->type) {
|
||||
case GRST_COLOR8:
|
||||
@@ -212,7 +212,7 @@ public U8 *Sprite2Text(CSprite *tempg)
|
||||
SPrintF(buf2," %d %d,%d",tempg->num,ptr[0],ptr[1]);
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
case GRST_BITMAP8:
|
||||
SPrintF(buf2," %dW,%dH:%d,%d",
|
||||
tempg->width,tempg->height,tempg->x2,tempg->y2);
|
||||
@@ -224,10 +224,10 @@ public U8 *Sprite2Text(CSprite *tempg)
|
||||
SPrintF(buf2," %d",tempg->num);
|
||||
break;
|
||||
case GRST_MESH:
|
||||
SPrintF(buf2," %dV,%dT",tempg->vertex_cnt,tempg->triangle_cnt);
|
||||
SPrintF(buf2," %dV,%dT",tempg->vertex_cnt,tempg->tri_cnt);
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
SPrintF(buf2," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_triangle_cnt);
|
||||
SPrintF(buf2," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_tri_cnt);
|
||||
break;
|
||||
}
|
||||
StrCat(buf,buf2);
|
||||
|
||||
+12
-15
@@ -1,15 +1,15 @@
|
||||
#help_index "Graphics"
|
||||
U0 GrInit()
|
||||
U0 GrInit1()
|
||||
{
|
||||
DefineLstLoad("ST_CSPRITE_TYPES","End\0 \0Color 8Bit\0 \0Point\0"
|
||||
DefineLstLoad("ST_SPRITE_TYPES","End\0 \0Color 8Bit\0 \0Point\0"
|
||||
"Line\0PolyLine\0PolyPoint\0Width\0Shift\0"
|
||||
"BSpline2\0BSpline3\0BSpline2 Closed\0BSpline3 Closed\0"
|
||||
" \0 \0 \0Rect\0Circle\0Flood Fill Not Color\0Flood Fill\0BitMap 8Bit\0"
|
||||
" \0Text\0Ellipse\0Reg Polygon\0Planar Symmetry\0"
|
||||
" \0Text\0Ellipse\0Polygon\0Planar Symmetry\0"
|
||||
"Dither Color 8Bit\0Rotated Rect\0Mesh\0Shiftable Mesh\0"
|
||||
"Transform On\0Transform Off\0Arrow\0Text Box\0Text Diamond\0");
|
||||
}
|
||||
GrInit;
|
||||
GrInit1;
|
||||
|
||||
#help_index "Graphics/CSprite"
|
||||
#define GRST_END 0
|
||||
@@ -37,7 +37,7 @@ GrInit;
|
||||
//Unused
|
||||
#define GRST_TEXT 23
|
||||
#define GRST_ELLIPSE 24
|
||||
#define GRST_REG_POLY 25
|
||||
#define GRST_POLYGON 25
|
||||
#define GRST_PLANAR_SYMMETRY 26
|
||||
#define GRST_DITHER_COLOR8 27
|
||||
#define GRST_ROTATED_RECT 28
|
||||
@@ -75,7 +75,7 @@ public class CSprite
|
||||
union {
|
||||
I32 y1;
|
||||
I32 height;
|
||||
I32 triangle_cnt; //Mesh
|
||||
I32 tri_cnt; //Mesh
|
||||
}
|
||||
union {
|
||||
I32 z1;
|
||||
@@ -89,7 +89,7 @@ public class CSprite
|
||||
union {
|
||||
F64 linespeed;
|
||||
F64 rot_angle;
|
||||
I32 shiftable_triangle_cnt //Shiftable Mesh
|
||||
I32 shiftable_tri_cnt //Shiftable Mesh
|
||||
}
|
||||
I32 sides;
|
||||
};
|
||||
@@ -99,9 +99,7 @@ public class CSprite
|
||||
extern CDC *DCNew(I64 type,I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE);
|
||||
extern CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL);
|
||||
extern U0 DCDel(CDC *dc);
|
||||
extern U0 EdExistingGraphic(CDoc *doc,I64 x,I64 y,I64 *import_snap=NULL,F64 *import_ip_scaler=NULL);
|
||||
extern CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num);
|
||||
extern Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img);
|
||||
extern I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img);
|
||||
extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
|
||||
|
||||
#include "GrCfg"
|
||||
@@ -114,16 +112,15 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
|
||||
#include "GrComposites"
|
||||
#include "GrChar"
|
||||
|
||||
#define GE_CANCEL (-1)
|
||||
#define GE_OKAY_DONE 0
|
||||
#define GE_OKAY_CONT 1
|
||||
#define GE_ABORT (-1)
|
||||
#define GE_EXIT 0
|
||||
#define GE_CONT 1
|
||||
|
||||
#include "CSpriteNew"
|
||||
#include "GrSpritePlot"
|
||||
#include "CSpriteMesh"
|
||||
#include "CSpriteBitMap"
|
||||
#include "CSpriteVect"
|
||||
#include "CSpriteEd"
|
||||
#include "GrVectMap"
|
||||
#include "CSpriteMain"
|
||||
#help_index ""
|
||||
|
||||
@@ -613,7 +613,7 @@ _IS_PIXEL_COVERED0::
|
||||
RET1 24
|
||||
// ************************************
|
||||
_GR_ROP_EQU_U8_NO_CLIPPING::
|
||||
//Puts foreground char shape onto gr_dc.
|
||||
//Puts foreground char shape onto gr_dc2.
|
||||
//ch.u8[1] is color as a whole byte
|
||||
//ch DOCEt_UNDERLINE attr flag is used.
|
||||
ENTER 0
|
||||
|
||||
+105
-57
@@ -73,7 +73,7 @@ public I64 GrPeek0(CDC *dc,I64 x,I64 y)
|
||||
|
||||
#help_index "Graphics;Graphics/DCs"
|
||||
|
||||
public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
public I64 GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
{ //Clipping but not transformation
|
||||
I64 i,j,k,k1,kk,kk1,w1,h1,w2,h2,
|
||||
leading_bits,leading_bit_mask,whole_bytes,trailing_bits,trailing_bit_mask,
|
||||
@@ -90,8 +90,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
x+=win_task->win_scroll_x;
|
||||
y+=win_task->win_scroll_y;
|
||||
}
|
||||
w1=x<0 ?-x:0;
|
||||
h1=y<0 ?-y:0;
|
||||
if (x<0)
|
||||
w1=-x;
|
||||
else
|
||||
w1=0;
|
||||
if (y<0)
|
||||
h1=-y;
|
||||
else
|
||||
h1=0;
|
||||
w2=img->width;
|
||||
h2=img->height;
|
||||
if (dc->flags & DCF_SCREEN_BITMAP) {
|
||||
@@ -126,7 +132,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (y+h2-1>dc->max_y) dc->max_y=y+h2-1;
|
||||
}
|
||||
if (dc->flags & DCF_DONT_DRAW)
|
||||
return TRUE;
|
||||
return 1;
|
||||
old_color=dc->color;
|
||||
db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
@@ -171,7 +177,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
}
|
||||
kk = h1 *img ->width_internal+w1;
|
||||
@@ -186,7 +197,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
*src(I64 *)++&~leading_bit_mask&color_mask;
|
||||
@@ -198,7 +209,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
if (win_z_num>=*win_z_buf_ptr++)
|
||||
*dst(I64 *)++=(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask;
|
||||
*dst(I64 *)++=(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask;
|
||||
else {
|
||||
src(I64 *)++;
|
||||
dst(I64 *)++;
|
||||
@@ -214,7 +225,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (trailing_bits && win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
*src(I64 *)++&~trailing_bit_mask&color_mask;
|
||||
@@ -233,14 +244,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (leading_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
*src(I64 *)++&~leading_bit_mask&color_mask;
|
||||
}
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++=(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask;
|
||||
*dst(I64 *)++=(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask;
|
||||
else
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++=*src(I64 *)++&color_mask;
|
||||
@@ -248,7 +259,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (trailing_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
*src(I64 *)++&~trailing_bit_mask&color_mask;
|
||||
@@ -268,7 +279,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
} else {
|
||||
win_z_num =win_task->win_z_num;
|
||||
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (win_z_num>=*win_z_buf_ptr++)
|
||||
@@ -302,7 +318,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
}
|
||||
kk = h1 *img ->width_internal+w1;
|
||||
@@ -317,7 +338,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
*src(I64 *)++&~leading_bit_mask;
|
||||
@@ -329,7 +350,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
if (win_z_num>=*win_z_buf_ptr++)
|
||||
*dst(I64 *)++=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
*dst(I64 *)++=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
else {
|
||||
src(I64 *)++;
|
||||
dst(I64 *)++;
|
||||
@@ -345,7 +366,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (trailing_bits && win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
*src(I64 *)++&~trailing_bit_mask;
|
||||
@@ -364,14 +385,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (leading_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
*src(I64 *)++&~leading_bit_mask;
|
||||
}
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
*dst(I64 *)++=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
else
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++=*src(I64 *)++;
|
||||
@@ -379,7 +400,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img)
|
||||
if (trailing_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask;
|
||||
(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
*src(I64 *)++&~trailing_bit_mask;
|
||||
@@ -404,7 +425,12 @@ here1a:
|
||||
} else {
|
||||
win_z_num =win_task->win_z_num;
|
||||
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
for (j=h1;j<h2;j++) {
|
||||
if (win_z_num>=*win_z_buf_ptr++)
|
||||
@@ -443,7 +469,12 @@ here1a:
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
}
|
||||
kk = h1 *img ->width_internal +w1;
|
||||
@@ -458,7 +489,7 @@ here1a:
|
||||
if (win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask;
|
||||
(*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask;
|
||||
@@ -470,7 +501,7 @@ here1a:
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
if (win_z_num>=*win_z_buf_ptr++)
|
||||
*dst(I64 *)++^=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
*dst(I64 *)++^=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
else {
|
||||
src(I64 *)++;
|
||||
dst(I64 *)++;
|
||||
@@ -486,7 +517,7 @@ here1a:
|
||||
if (trailing_bits && win_z_num>=*win_z_buf_ptr++) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask;
|
||||
(*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask;
|
||||
@@ -505,21 +536,21 @@ here1a:
|
||||
if (leading_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask;
|
||||
(*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask;
|
||||
else
|
||||
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|
|
||||
(*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask;
|
||||
}
|
||||
if (bit_shift)
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++^=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
*dst(I64 *)++^=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift);
|
||||
else
|
||||
for (i=0;i<whole_bytes;i++)
|
||||
*dst(I64 *)++^=*src(I64 *)++;
|
||||
if (trailing_bits) {
|
||||
if (bit_shift)
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask;
|
||||
(*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask;
|
||||
else
|
||||
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|
|
||||
(*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask;
|
||||
@@ -534,9 +565,9 @@ here1a:
|
||||
}
|
||||
dc->depth_buf=db;
|
||||
dc->color=old_color;
|
||||
return TRUE;
|
||||
return 1;
|
||||
} else
|
||||
return FALSE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor)
|
||||
@@ -587,7 +618,7 @@ public CDC *DCExtract(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL)
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
|
||||
public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch)
|
||||
public I64 GrPutChar(CDC *dc,I64 x,I64 y,U8 ch)
|
||||
{ //Clipping but not transformation
|
||||
U8 reg *src,reg *dst,*font_ptr;
|
||||
I64 i,m,leading_bits,trailing_bits,leading_bit_mask,trailing_bit_mask,
|
||||
@@ -601,8 +632,14 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch)
|
||||
y+=win_task->win_scroll_y;
|
||||
}
|
||||
|
||||
w1=x<0 ?-x:0;
|
||||
h1=y<0 ?-y:0;
|
||||
if (x<0)
|
||||
w1=-x;
|
||||
else
|
||||
w1=0;
|
||||
if (y<0)
|
||||
h1=-y;
|
||||
else
|
||||
h1=0;
|
||||
w2=FONT_WIDTH;
|
||||
h2=FONT_HEIGHT;
|
||||
|
||||
@@ -638,7 +675,7 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch)
|
||||
if (y+h2-1>dc->max_y) dc->max_y=y+h2-1;
|
||||
}
|
||||
if (dc->flags & DCF_DONT_DRAW)
|
||||
return TRUE;
|
||||
return 1;
|
||||
color=dc->color;
|
||||
if (dc->type==DCT_COLOR8) {
|
||||
leading_bits=-(w1+x)&7;
|
||||
@@ -789,16 +826,17 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch)
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return 1;
|
||||
} else
|
||||
return FALSE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Bool GrPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
public I64 GrPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
{
|
||||
I64 x0=x,ch;
|
||||
Bool result=FALSE,first=TRUE;
|
||||
if (!_s) return FALSE;
|
||||
I64 x0,ch,result;
|
||||
if (!_s) return 0;
|
||||
x0=x;
|
||||
result=0;
|
||||
while (ch=*_s++) {
|
||||
if (ch=='\n') {
|
||||
x=x0;
|
||||
@@ -806,23 +844,21 @@ public Bool GrPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
} else if (ch=='\t')
|
||||
x=x0+CeilU64(x-x0+FONT_WIDTH,8*FONT_WIDTH);
|
||||
else {
|
||||
if (first) {
|
||||
result=GrPutChar(dc,x,y,ch);
|
||||
first=FALSE;
|
||||
} else
|
||||
GrPutChar(dc,x,y,ch);
|
||||
result+=GrPutChar(dc,x,y,ch);
|
||||
x+=FONT_WIDTH;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
public I64 GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
{ //Vertical text
|
||||
I64 y0=y;
|
||||
I64 y0,result;
|
||||
U8 buf[2];
|
||||
Bool result=FALSE,first=TRUE;
|
||||
if (!_s) return FALSE;
|
||||
if (!_s) return 0;
|
||||
y0=y;
|
||||
result=0;
|
||||
|
||||
buf[1]=0;
|
||||
while (*buf=*_s++) {
|
||||
if (*buf=='\n') {
|
||||
@@ -831,11 +867,7 @@ public Bool GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s)
|
||||
} else if (*buf=='\t')
|
||||
y=y0+CeilU64(y-y0+FONT_HEIGHT,8*FONT_HEIGHT);
|
||||
else {
|
||||
if (first) {
|
||||
result=GrPutS(dc,x,y,buf);
|
||||
first=FALSE;
|
||||
} else
|
||||
GrPutS(dc,x,y,buf);
|
||||
result+=GrPutS(dc,x,y,buf);
|
||||
y+=FONT_HEIGHT;
|
||||
}
|
||||
}
|
||||
@@ -875,8 +907,14 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h)
|
||||
y+=win_task->win_scroll_y;
|
||||
}
|
||||
|
||||
w1=x<0 ?-x:0;
|
||||
h1=y<0 ?-y:0;
|
||||
if (x<0)
|
||||
w1=-x;
|
||||
else
|
||||
w1=0;
|
||||
if (y<0)
|
||||
h1=-y;
|
||||
else
|
||||
h1=0;
|
||||
w2=w;
|
||||
h2=h;
|
||||
|
||||
@@ -972,7 +1010,12 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h)
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
}
|
||||
kk1=(h1+y)*dc->width_internal+x+w1;
|
||||
@@ -1118,7 +1161,12 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h)
|
||||
else {
|
||||
win_z_num=win_task->win_z_num;
|
||||
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
|
||||
win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16);
|
||||
win_z_buf_line_dec=whole_bytes;
|
||||
if (leading_bits)
|
||||
win_z_buf_line_dec++;
|
||||
if (trailing_bits)
|
||||
win_z_buf_line_dec++;
|
||||
win_z_buf_line_dec*=sizeof(U16);
|
||||
win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec;
|
||||
}
|
||||
color_mask=gr_1_to_8_colors[color.c0.color];
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#help_index "Graphics"
|
||||
public U0 GrLineRect4(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{
|
||||
//Can be used with ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK
|
||||
//Can be used with ROPF_DITHER+WHITE<<16+BLACK
|
||||
//for dotted rect.
|
||||
GrLine3(dc,x1,y1,0,x2,y1,0,step,start);
|
||||
GrLine3(dc,x2,y1,0,x2,y2,0,step,start);
|
||||
@@ -9,9 +9,9 @@ public U0 GrLineRect4(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0
|
||||
GrLine3(dc,x1,y2,0,x1,y1,0,step,start);
|
||||
}
|
||||
|
||||
public U0 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
|
||||
public I64 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
|
||||
{ //transformation with pen width
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy;
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy,result=0;
|
||||
F64 d;
|
||||
Bool was_transform=FALSE,was_symmetry=FALSE;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -26,40 +26,43 @@ public U0 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,
|
||||
_x2=x2; _y2=y2; _z2=z2;
|
||||
GrReflect(dc,&_x2,&_y2,&_z2);
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start);
|
||||
result=Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start);
|
||||
dx=_x2-_x1; dy=_y2-_y1;
|
||||
if (d=Sqrt(dx*dx+dy*dy)) {
|
||||
d=w*dc->pen_width/d;
|
||||
Line(dc,_x2-dx*d+dy*d+0.5,_y2-dy*d-dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step);
|
||||
Line(dc,_x2-dx*d-dy*d+0.5,_y2-dy*d+dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step);
|
||||
result+=Line(dc,_x2-dx*d+dy*d+0.5,_y2-dy*d-dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step);
|
||||
result+=Line(dc,_x2-dx*d-dy*d+0.5,_y2-dy*d+dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step);
|
||||
}
|
||||
was_symmetry=TRUE;
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start);
|
||||
result+=Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start);
|
||||
dx=x2-x1; dy=y2-y1;
|
||||
if (d=Sqrt(dx*dx+dy*dy)) {
|
||||
d=w*dc->pen_width/d;
|
||||
Line(dc,x2-dx*d+dy*d+0.5,y2-dy*d-dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step);
|
||||
Line(dc,x2-dx*d-dy*d+0.5,y2-dy*d+dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step);
|
||||
result+=Line(dc,x2-dx*d+dy*d+0.5,y2-dy*d-dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step);
|
||||
result+=Line(dc,x2-dx*d-dy*d+0.5,y2-dy*d+dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step);
|
||||
}
|
||||
gr_done:
|
||||
if (was_transform)
|
||||
dc->flags|=DCF_TRANSFORMATION;
|
||||
if (was_symmetry)
|
||||
dc->flags|=DCF_SYMMETRY;
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
|
||||
public Bool GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
public I64 GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
Bool result;
|
||||
U8 ch,*ptr=s;
|
||||
I64 w=0,w_max=0,h=FONT_HEIGHT;
|
||||
if (!s) return FALSE;
|
||||
U8 ch,*ptr;
|
||||
I64 w,w_max,h,result;
|
||||
if (!s) return 0;
|
||||
ptr=s;
|
||||
w=0; w_max=0; h=FONT_HEIGHT; result=0;
|
||||
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
(*dc->transform)(dc,&x1,&y1,&z1);
|
||||
while (ch=*ptr++) {
|
||||
@@ -74,21 +77,21 @@ public Bool GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
|
||||
}
|
||||
if (w>w_max) w_max=w;
|
||||
result=GrPutS(dc,x1,y1,s);
|
||||
GrLine(dc,x1-border ,y1-border ,x1+w_max+border,y1-border);
|
||||
GrLine(dc,x1-border ,y1+h+border,x1+w_max+border,y1+h+border);
|
||||
GrLine(dc,x1-border ,y1-border ,x1-border,y1+h+border);
|
||||
GrLine(dc,x1+w_max+border,y1-border ,x1+w_max+border,y1+h+border);
|
||||
result+=GrLine(dc,x1-border ,y1-border ,x1+w_max+border,y1-border);
|
||||
result+=GrLine(dc,x1-border ,y1+h+border,x1+w_max+border,y1+h+border);
|
||||
result+=GrLine(dc,x1-border ,y1-border ,x1-border,y1+h+border);
|
||||
result+=GrLine(dc,x1+w_max+border,y1-border ,x1+w_max+border,y1+h+border);
|
||||
return result;
|
||||
}
|
||||
|
||||
#define MAX_DIAMOND_SLOPE 2.75
|
||||
|
||||
public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
public I64 GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
{ //transformation
|
||||
//DCF_SYMMETRY is silly.
|
||||
Bool result=FALSE,first=TRUE;
|
||||
Bool first=TRUE;
|
||||
U8 ch,*ptr,*ptr_end,*st,*s;
|
||||
I64 y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT;
|
||||
I64 y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT,result=0;
|
||||
F64 m;
|
||||
if (!_s) return FALSE;
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
@@ -96,7 +99,7 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
|
||||
ptr=s=StrNew(_s);
|
||||
while (ch=*ptr) {
|
||||
if (ch==CH_CARRIAGE_RETURN||ch=='\t')
|
||||
if (ch=='\r'||ch=='\t')
|
||||
*ptr=CH_SPACE;
|
||||
if (ch=='\n') {
|
||||
*ptr=0;
|
||||
@@ -117,10 +120,10 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
|
||||
w=(StrLen(st)*FONT_WIDTH)>>1;
|
||||
if (first) {
|
||||
result=GrPutS(dc,x1-w,y,st);
|
||||
result+=GrPutS(dc,x1-w,y,st);
|
||||
first=FALSE;
|
||||
} else
|
||||
GrPutS(dc,x1-w,y,st);
|
||||
result+=GrPutS(dc,x1-w,y,st);
|
||||
if (w) {
|
||||
w+=border;
|
||||
do {
|
||||
@@ -141,10 +144,10 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
|
||||
}
|
||||
Free(s);
|
||||
|
||||
GrLine(dc,x1,y1-dy,x1+dx,y1);
|
||||
GrLine(dc,x1+dx,y1,x1,y1+dy);
|
||||
GrLine(dc,x1,y1+dy,x1-dx,y1);
|
||||
GrLine(dc,x1-dx,y1,x1,y1-dy);
|
||||
result+=GrLine(dc,x1,y1-dy,x1+dx,y1);
|
||||
result+=GrLine(dc,x1+dx,y1,x1,y1+dy);
|
||||
result+=GrLine(dc,x1,y1+dy,x1-dx,y1);
|
||||
result+=GrLine(dc,x1-dx,y1,x1,y1-dy);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public U0 DCRst(CDC *dc)
|
||||
public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL)
|
||||
{
|
||||
CDC *result;
|
||||
if (!dc) dc=gr_dc2;
|
||||
if (!dc) dc=gr_dc;
|
||||
if (!task) task=Fs;
|
||||
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
|
||||
Dbg;
|
||||
@@ -255,9 +255,9 @@ public CDC *GRARead(U8 *filename,CTask *task=NULL)
|
||||
}
|
||||
|
||||
#help_index "Graphics/CSprite;Graphics/DCs;Doc/Output"
|
||||
public U0 DocPutGRAFile(CDoc *doc=NULL,U8 *fname)
|
||||
public U0 DocPutGRAFile(CDoc *doc=NULL,U8 *filename)
|
||||
{
|
||||
CDC *dc=GRARead(fname);
|
||||
CDC *dc=GRARead(filename);
|
||||
CSprite *elems=DC2Sprite(dc);
|
||||
DocPutSprite(doc,elems);
|
||||
Free(elems);
|
||||
|
||||
@@ -434,28 +434,32 @@ Bool GrLinePlot(CDC *dc,I64 x,I64 y,I64 z)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public U0 GrLine(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
public I64 GrLine(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
|
||||
{
|
||||
I64 result=0;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
if (step==1 && !start && !dc->brush && !dc->depth_buf) {
|
||||
if (DCClipLine(dc,&x1,&y1,&x2,&y2))
|
||||
Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
|
||||
result=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
|
||||
} else
|
||||
Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot,step,start);
|
||||
result=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot,step,start);
|
||||
dc->depth_buf=db;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 GrCircle(CDC *dc,I64 cx,I64 cy,I64 radius,
|
||||
public I64 GrCircle(CDC *dc,I64 cx,I64 cy,I64 radius,
|
||||
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
|
||||
{
|
||||
I64 result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
Circle(dc,cx,cy,0,radius,&GrLinePlot,step,start_radians,len_radians);
|
||||
result=Circle(dc,cx,cy,0,radius,&GrLinePlot,step,start_radians,len_radians);
|
||||
dc->depth_buf=db;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 GrEllipse(CDC *dc,
|
||||
public I64 GrEllipse(CDC *dc,
|
||||
I64 cx,I64 cy,
|
||||
I64 x_radius,I64 y_radius,
|
||||
F64 rot_angle=0,
|
||||
@@ -463,13 +467,15 @@ public U0 GrEllipse(CDC *dc,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
Ellipse(dc,cx,cy,0,x_radius,y_radius,&GrLinePlot,rot_angle,step,start_radians,len_radians);
|
||||
result=Ellipse(dc,cx,cy,0,x_radius,y_radius,&GrLinePlot,rot_angle,step,start_radians,len_radians);
|
||||
dc->depth_buf=db;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 GrRegPoly(CDC *dc,
|
||||
public I64 GrRegPoly(CDC *dc,
|
||||
I64 cx,I64 cy,
|
||||
I64 x_radius,I64 y_radius,I64 sides,
|
||||
F64 rot_angle=0,
|
||||
@@ -477,36 +483,38 @@ public U0 GrRegPoly(CDC *dc,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 result;
|
||||
I32 *db=dc->depth_buf;
|
||||
dc->depth_buf=NULL;
|
||||
RegPoly(dc,cx,cy,0,x_radius,y_radius,sides,
|
||||
result=RegPoly(dc,cx,cy,0,x_radius,y_radius,sides,
|
||||
&GrLinePlot,rot_angle,step,start_radians,len_radians);
|
||||
dc->depth_buf=db;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 Gr2Bezier(CDC *dc,CD3I32 *ctrl)
|
||||
public I64 Gr2Bezier(CDC *dc,CD3I32 *ctrl)
|
||||
{
|
||||
Bezier2(dc,ctrl,&GrLinePlot);
|
||||
return Bezier2(dc,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public U0 Gr3Bezier(CDC *dc,CD3I32 *ctrl)
|
||||
public I64 Gr3Bezier(CDC *dc,CD3I32 *ctrl)
|
||||
{
|
||||
Bezier3(dc,ctrl,&GrLinePlot);
|
||||
return Bezier3(dc,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public U0 Gr2BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
public I64 Gr2BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
BSpline2(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
return BSpline2(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public U0 Gr3BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
public I64 Gr3BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
BSpline3(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
return BSpline3(dc,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public U0 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
|
||||
public I64 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
|
||||
{
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2;
|
||||
I64 _x1,_y1,_z1,_x2,_y2,_z2,result=0;
|
||||
Bool was_transform=FALSE,was_symmetry=FALSE;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
(*dc->transform)(dc,&x1,&y1,&z1);
|
||||
@@ -522,23 +530,24 @@ public U0 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
|
||||
if (DCClipLine(dc,&_x1,&_y1,&_x2,&_y2))
|
||||
Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start);
|
||||
result=Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start);
|
||||
} else
|
||||
Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start);
|
||||
result=Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start);
|
||||
was_symmetry=TRUE;
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
|
||||
if (DCClipLine(dc,&x1,&y1,&x2,&y2))
|
||||
Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
|
||||
result+=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
|
||||
} else
|
||||
Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start);
|
||||
result+=Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start);
|
||||
gr_done:
|
||||
if (was_transform)
|
||||
dc->flags|=DCF_TRANSFORMATION;
|
||||
if (was_symmetry)
|
||||
dc->flags|=DCF_SYMMETRY;
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Char;Char/Graphics"
|
||||
@@ -584,7 +593,7 @@ public U0 GrVPrintF3(CDC *dc,I64 x,I64 y,I64 z,U8 *fmt,...)
|
||||
|
||||
#help_index "Graphics"
|
||||
|
||||
public U0 GrEllipse3(CDC *dc,
|
||||
public I64 GrEllipse3(CDC *dc,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,
|
||||
F64 rot_angle=0,
|
||||
@@ -592,7 +601,7 @@ public U0 GrEllipse3(CDC *dc,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 x,y,z,xx,yy,zz;
|
||||
I64 x,y,z,xx,yy,zz,result;
|
||||
F64 m1,a1,m2,a2,s,c;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
dc->flags&=~DCF_TRANSFORMATION;
|
||||
@@ -628,23 +637,24 @@ public U0 GrEllipse3(CDC *dc,
|
||||
R2P(&m2,&a2,x,y);
|
||||
m2*=Abs(Sin(a2-a1));
|
||||
|
||||
Ellipse(dc,cx,cy,cz,
|
||||
result=Ellipse(dc,cx,cy,cz,
|
||||
m1/0x10000,m2/0x10000,&GrPlot3,-a1,step,start_radians,len_radians);
|
||||
dc->flags|=DCF_TRANSFORMATION;
|
||||
} else
|
||||
Ellipse(dc,cx,cy,cz,x_radius,y_radius,&GrPlot3,rot_angle,step,start_radians,len_radians);
|
||||
result=Ellipse(dc,cx,cy,cz,x_radius,y_radius,&GrPlot3,rot_angle,step,start_radians,len_radians);
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 GrCircle3(CDC *dc,I64 cx,I64 cy,I64 cz,I64 radius,
|
||||
public I64 GrCircle3(CDC *dc,I64 cx,I64 cy,I64 cz,I64 radius,
|
||||
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
|
||||
{ //transformation with pen width
|
||||
if (dc->flags & DCF_TRANSFORMATION)
|
||||
GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians);
|
||||
return GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians);
|
||||
else
|
||||
Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians);
|
||||
return Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians);
|
||||
}
|
||||
|
||||
public U0 GrRegPoly3(CDC *dc,
|
||||
public I64 GrRegPoly3(CDC *dc,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,I64 sides,
|
||||
F64 rot_angle=0,
|
||||
@@ -652,7 +662,7 @@ public U0 GrRegPoly3(CDC *dc,
|
||||
F64 start_radians=0,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 x,y,z,xx,yy,zz;
|
||||
I64 x,y,z,xx,yy,zz,result;
|
||||
F64 m1,a1,m2,a2,s,c;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
dc->flags&=~DCF_TRANSFORMATION;
|
||||
@@ -688,11 +698,12 @@ public U0 GrRegPoly3(CDC *dc,
|
||||
R2P(&m2,&a2,x,y);
|
||||
m2*=Abs(Sin(a2-a1));
|
||||
|
||||
RegPoly(dc,cx,cy,cz,
|
||||
result=RegPoly(dc,cx,cy,cz,
|
||||
m1/0x10000,m2/0x10000,sides,&GrPlot3,-a1,step,start_radians,len_radians);
|
||||
dc->flags|=DCF_TRANSFORMATION;
|
||||
} else
|
||||
RegPoly(dc,cx,cy,cz,x_radius,y_radius,sides,&GrPlot3,rot_angle,step,start_radians,len_radians);
|
||||
result=RegPoly(dc,cx,cy,cz,x_radius,y_radius,sides,&GrPlot3,rot_angle,step,start_radians,len_radians);
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrFloodFill3(CDC *dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE)
|
||||
@@ -720,9 +731,9 @@ gr_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
public I64 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
{ //Clipping and transformation
|
||||
I64 x2,y2,z2,x3,y3,z3;
|
||||
I64 x2,y2,z2,x3,y3,z3,result=0;
|
||||
CDC *old_brush=dc->brush;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
dc->brush=NULL;
|
||||
@@ -733,21 +744,21 @@ public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
(*dc->transform)(dc,&x3,&y3,&z3);
|
||||
if (!(dc->flags&DCF_JUST_MIRROR) ||
|
||||
!(dc->flags&DCF_SYMMETRY))
|
||||
Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
result=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x2,&y2,&z2);
|
||||
GrReflect(dc,&x3,&y3,&z3);
|
||||
Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
result+=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
}
|
||||
dc->brush=old_brush;
|
||||
} else {
|
||||
if (!(dc->flags&DCF_JUST_MIRROR)||
|
||||
!(dc->flags&DCF_SYMMETRY)) {
|
||||
if (dc->depth_buf)
|
||||
Rect(dc,x,y,z,x+w,y,z,x,y+h,z,&GrLinePlot);
|
||||
result=Rect(dc,x,y,z,x+w,y,z,x,y+h,z,&GrLinePlot);
|
||||
else
|
||||
GrRect(dc,x,y,w,h);
|
||||
result=GrRect(dc,x,y,w,h);
|
||||
}
|
||||
if (dc->flags & DCF_SYMMETRY) {
|
||||
dc->brush=NULL;
|
||||
@@ -756,15 +767,16 @@ public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h)
|
||||
GrReflect(dc,&x,&y,&z);
|
||||
GrReflect(dc,&x2,&y2,&z2);
|
||||
GrReflect(dc,&x3,&y3,&z3);
|
||||
Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
result+=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
dc->brush=old_brush;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics;Graphics/DCs"
|
||||
|
||||
public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
public I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
{ //Clipping and transformation
|
||||
//This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$.
|
||||
CColorROPU32 old_color=dc->color;
|
||||
@@ -775,8 +787,8 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
adx2,ady2,adz2,
|
||||
x2,y2,z2,x3,y3,z3,
|
||||
dw,reg dh,x,y,_x1,_y1,_z1,_x2,_y2,_z2,_x3,_y3,_z3,
|
||||
last_x,last_y;
|
||||
Bool first,result=FALSE;
|
||||
last_x,last_y,result=0;
|
||||
Bool first;
|
||||
CDC *old_brush=dc->brush;
|
||||
|
||||
if (dc->depth_buf || dc->flags & (DCF_TRANSFORMATION | DCF_SYMMETRY)) {
|
||||
@@ -799,14 +811,28 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
adx1=AbsI64(dx1); ady1=AbsI64(dy1); adz1=AbsI64(dz1);
|
||||
adx2=AbsI64(dx2); ady2=AbsI64(dy2); adz2=AbsI64(dz2);
|
||||
|
||||
if (adx1>=ady1)
|
||||
d1=adx1>=adz1 ? adx1:adz1;
|
||||
else
|
||||
d1=ady1>=adz1 ? ady1:adz1;
|
||||
if (adx2>=ady2)
|
||||
d2=adx2>=adz2 ? adx2:adz2;
|
||||
else
|
||||
d2=ady2>=adz2 ? ady2:adz2;
|
||||
if (adx1>=ady1) {
|
||||
if (adx1>=adz1)
|
||||
d1=adx1;
|
||||
else
|
||||
d1=adz1;
|
||||
} else {
|
||||
if (ady1>=adz1)
|
||||
d1=ady1;
|
||||
else
|
||||
d1=adz1;
|
||||
}
|
||||
if (adx2>=ady2) {
|
||||
if (adx2>=adz2)
|
||||
d2=adx2;
|
||||
else
|
||||
d2=adz2;
|
||||
} else {
|
||||
if (ady2>=adz2)
|
||||
d2=ady2;
|
||||
else
|
||||
d2=adz2;
|
||||
}
|
||||
|
||||
if (AbsI64(d1)!=w ||AbsI64(d2)!=h) {
|
||||
d1<<=1;
|
||||
@@ -866,7 +892,7 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img)
|
||||
_x1+=dx1; _y1+=dy1; _z1+=dz1;
|
||||
x+=dw;
|
||||
}
|
||||
result=TRUE;
|
||||
result=1;
|
||||
normal_image:
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
@@ -876,14 +902,28 @@ normal_image:
|
||||
adx1=AbsI64(dx1); ady1=AbsI64(dy1); adz1=AbsI64(dz1);
|
||||
adx2=AbsI64(dx2); ady2=AbsI64(dy2); adz2=AbsI64(dz2);
|
||||
|
||||
if (adx1>=ady1)
|
||||
d1=adx1>=adz1 ? adx1:adz1;
|
||||
else
|
||||
d1=ady1>=adz1 ? ady1:adz1;
|
||||
if (adx2>=ady2)
|
||||
d2=adx2>=adz2 ? adx2:adz2;
|
||||
else
|
||||
d2=ady2>=adz2 ? ady2:adz2;
|
||||
if (adx1>=ady1) {
|
||||
if (adx1>=adz1)
|
||||
d1=adx1;
|
||||
else
|
||||
d1=adz1;
|
||||
} else {
|
||||
if (ady1>=adz1)
|
||||
d1=ady1;
|
||||
else
|
||||
d1=adz1;
|
||||
}
|
||||
if (adx2>=ady2) {
|
||||
if (adx2>=adz2)
|
||||
d2=adx2;
|
||||
else
|
||||
d2=adz2;
|
||||
} else {
|
||||
if (ady2>=adz2)
|
||||
d2=ady2;
|
||||
else
|
||||
d2=adz2;
|
||||
}
|
||||
if (AbsI64(d1)!=w ||AbsI64(d2)!=h) {
|
||||
d1<<=1;
|
||||
d2<<=1;
|
||||
@@ -942,7 +982,7 @@ normal_image:
|
||||
x1+=dx1; y1+=dy1; z1+=dz1;
|
||||
x+=dw;
|
||||
}
|
||||
result=TRUE; //TODO: check off screen
|
||||
result=1; //TODO: check off screen
|
||||
} else
|
||||
result=GrBlot(dc,x1,y1,img);
|
||||
gr_done:
|
||||
@@ -953,9 +993,9 @@ gr_done:
|
||||
|
||||
#help_index "Graphics"
|
||||
|
||||
public U0 Gr2Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
public I64 Gr2Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
{
|
||||
I64 i,x,y,z,
|
||||
I64 i,x,y,z,result=0,
|
||||
old_flags=dc->flags;
|
||||
CD3I32 *ctrl2=NULL,*ctrl3=NULL;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -984,21 +1024,22 @@ public U0 Gr2Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
ctrl3[i].z=z;
|
||||
}
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
Bezier2(dc,ctrl3,&GrPlot3);
|
||||
result=Bezier2(dc,ctrl3,&GrPlot3);
|
||||
if (dc->flags & DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
|
||||
Bezier2(dc,ctrl,&GrPlot3);
|
||||
result+=Bezier2(dc,ctrl,&GrPlot3);
|
||||
gr_done:
|
||||
Free(ctrl2);
|
||||
Free(ctrl3);
|
||||
dc->flags=old_flags;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 Gr3Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
public I64 Gr3Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
{
|
||||
I64 i,x,y,z,
|
||||
I64 i,x,y,z,result=0,
|
||||
old_flags=dc->flags;
|
||||
CD3I32 *ctrl2=NULL,*ctrl3=NULL;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -1027,21 +1068,22 @@ public U0 Gr3Bezier3(CDC *dc,CD3I32 *ctrl)
|
||||
ctrl3[i].z=z;
|
||||
}
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
Bezier3(dc,ctrl3,&GrPlot3);
|
||||
result=Bezier3(dc,ctrl3,&GrPlot3);
|
||||
if (dc->flags & DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
|
||||
Bezier3(dc,ctrl,&GrPlot3);
|
||||
result+=Bezier3(dc,ctrl,&GrPlot3);
|
||||
gr_done:
|
||||
Free(ctrl2);
|
||||
Free(ctrl3);
|
||||
dc->flags=old_flags;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
public I64 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
I64 i,x,y,z,
|
||||
I64 i,x,y,z,result=0,
|
||||
old_flags=dc->flags;
|
||||
CD3I32 *ctrl2=NULL,*ctrl3=NULL;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -1070,21 +1112,22 @@ public U0 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
ctrl3[i].z=z;
|
||||
}
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
BSpline2(dc,ctrl3,cnt,&GrPlot3,closed);
|
||||
result=BSpline2(dc,ctrl3,cnt,&GrPlot3,closed);
|
||||
if (dc->flags & DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
|
||||
BSpline2(dc,ctrl,cnt,&GrPlot3,closed);
|
||||
result+=BSpline2(dc,ctrl,cnt,&GrPlot3,closed);
|
||||
gr_done:
|
||||
Free(ctrl2);
|
||||
Free(ctrl3);
|
||||
dc->flags=old_flags;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
public I64 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
{
|
||||
I64 i,x,y,z,
|
||||
I64 i,x,y,z,result=0,
|
||||
old_flags=dc->flags;
|
||||
CD3I32 *ctrl2=NULL,*ctrl3=NULL;
|
||||
if (dc->flags & DCF_TRANSFORMATION) {
|
||||
@@ -1113,19 +1156,20 @@ public U0 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
|
||||
ctrl3[i].z=z;
|
||||
}
|
||||
dc->flags&=~DCF_SYMMETRY;
|
||||
BSpline3(dc,ctrl3,cnt,&GrPlot3,closed);
|
||||
result=BSpline3(dc,ctrl3,cnt,&GrPlot3,closed);
|
||||
if (dc->flags & DCF_JUST_MIRROR)
|
||||
goto gr_done;
|
||||
}
|
||||
|
||||
BSpline3(dc,ctrl,cnt,&GrPlot3,closed);
|
||||
result+=BSpline3(dc,ctrl,cnt,&GrPlot3,closed);
|
||||
gr_done:
|
||||
Free(ctrl2);
|
||||
Free(ctrl3);
|
||||
dc->flags=old_flags;
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 GrFillTriangle0(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3)
|
||||
public I64 GrFillTri0(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3)
|
||||
{
|
||||
//This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$.
|
||||
//Returns cnt of pixels changed
|
||||
@@ -1383,7 +1427,7 @@ public I64 GrFillPoly3(CDC *dc,I64 n,CD3I32 *poly)
|
||||
GrReflect(dc,&x2,&y2,&z2);
|
||||
tri[2].x=x2; tri[2].y=y2; tri[2].z=z2;
|
||||
|
||||
result+=GrFillTriangle0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
}
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
@@ -1413,14 +1457,14 @@ public I64 GrFillPoly3(CDC *dc,I64 n,CD3I32 *poly)
|
||||
(*dc->transform)(dc,&x2,&y2,&z2);
|
||||
tri[2].x=x2; tri[2].y=y2; tri[2].z=z2;
|
||||
|
||||
result+=GrFillTriangle0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Mesh"
|
||||
|
||||
public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 triangle_cnt,CMeshTri *tri)
|
||||
public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri)
|
||||
{
|
||||
//Returns cnt of pixels changed
|
||||
CColorROPU32 old_color=dc->color;
|
||||
@@ -1447,17 +1491,17 @@ public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 triangle_cnt,CMeshTri *t
|
||||
dst->x=x; dst->y=y; dst->z=z;
|
||||
}
|
||||
p_sym=pt_sym;
|
||||
for (i=0;i<triangle_cnt;i++,tri_sym++) {
|
||||
for (i=0;i<tri_cnt;i++,tri_sym++) {
|
||||
(*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color);
|
||||
result+=GrFillTriangle0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
|
||||
result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
|
||||
}
|
||||
Free(pt_sym);
|
||||
if (dc->flags&DCF_JUST_MIRROR)
|
||||
goto mesh_done;
|
||||
}
|
||||
for (i=0;i<triangle_cnt;i++,tri++) {
|
||||
for (i=0;i<tri_cnt;i++,tri++) {
|
||||
(*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color);
|
||||
result+=GrFillTriangle0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
|
||||
result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
|
||||
}
|
||||
mesh_done:
|
||||
dc->color=old_color;
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
public CDC *gr_screen_image; //This is read only
|
||||
|
||||
#help_index "Graphics/DCs"
|
||||
public CDC *gr_dc=NULL, //This is updated every refresh
|
||||
*gr_dc_cache,
|
||||
*gr_dc1=NULL,
|
||||
*gr_dc2=NULL;
|
||||
public CDC *gr_dc=NULL, //Persistent
|
||||
*gr_dc1=NULL,
|
||||
*gr_dc2=NULL, //Updated every refresh
|
||||
*gr_dc_cache;
|
||||
|
||||
CDC *gr_zoomed_dc;
|
||||
U16 *gr_win_uncovered_bitmap=NULL,gr_highest_uncovered;
|
||||
|
||||
@@ -13,7 +14,7 @@ U16 *gr_vga_text_cache;
|
||||
|
||||
public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT)
|
||||
{
|
||||
if (!dc) dc=gr_dc2;
|
||||
if (!dc) dc=gr_dc;
|
||||
nobound_switch (dc->type) {
|
||||
case DCT_COLOR4:
|
||||
MemSet(dc->body,val,(dc->width_internal*dc->height)>>1);
|
||||
@@ -26,7 +27,7 @@ public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT)
|
||||
|
||||
public U0 DCClear(CDC *dc=NULL)
|
||||
{
|
||||
if (!dc) dc=gr_dc2;
|
||||
if (!dc) dc=gr_dc;
|
||||
DCFill(dc,0);
|
||||
}
|
||||
|
||||
@@ -40,32 +41,48 @@ public U0 (*fp_wall_paper)(CTask *task)=NULL;
|
||||
|
||||
U0 WinZBufFill(CTask *task)
|
||||
{ //Not public
|
||||
I64 y,t,dc,l,r,w;
|
||||
I64 y,t,b,l,r,w;
|
||||
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER)) {
|
||||
t= task->win_top-1>0
|
||||
? task->win_top-1 : 0,
|
||||
dc= task->win_bottom+1<TEXT_ROWS
|
||||
? task->win_bottom+1 : TEXT_ROWS-1,
|
||||
l= task->win_left-1>0
|
||||
? task->win_left-1 : 0,
|
||||
r= task->win_right+1<TEXT_COLS
|
||||
? task->win_right+1 : TEXT_COLS-1;
|
||||
if (task->win_top-1>0)
|
||||
t=task->win_top-1;
|
||||
else
|
||||
t=0;
|
||||
if (task->win_bottom+1<TEXT_ROWS)
|
||||
b=task->win_bottom+1;
|
||||
else
|
||||
b=TEXT_ROWS-1;
|
||||
if (task->win_left-1>0)
|
||||
l=task->win_left-1;
|
||||
else
|
||||
l=0;
|
||||
if (task->win_right+1<TEXT_COLS)
|
||||
r=task->win_right+1;
|
||||
else
|
||||
r=TEXT_COLS-1;
|
||||
} else {
|
||||
t= task->win_top>0
|
||||
? task->win_top : 0,
|
||||
dc= task->win_bottom<TEXT_ROWS
|
||||
? task->win_bottom : TEXT_ROWS-1,
|
||||
l= task->win_left>0
|
||||
? task->win_left : 0,
|
||||
r= task->win_right<TEXT_COLS
|
||||
? task->win_right : TEXT_COLS-1;
|
||||
if (task->win_top>0)
|
||||
t=task->win_top;
|
||||
else
|
||||
t=0;
|
||||
if (task->win_bottom<TEXT_ROWS)
|
||||
b=task->win_bottom;
|
||||
else
|
||||
b=TEXT_ROWS-1;
|
||||
if (task->win_left>0)
|
||||
l=task->win_left;
|
||||
else
|
||||
l=0;
|
||||
if (task->win_right<TEXT_COLS)
|
||||
r=task->win_right;
|
||||
else
|
||||
r=TEXT_COLS-1;
|
||||
}
|
||||
t=LimitI64(t,0,TEXT_ROWS-1);
|
||||
dc=LimitI64(dc,t,TEXT_ROWS-1);
|
||||
b=LimitI64(b,t,TEXT_ROWS-1);
|
||||
l=LimitI64(l,0,TEXT_COLS-1);
|
||||
r=LimitI64(r,l,TEXT_COLS-1);
|
||||
if (w=r-l+1)
|
||||
for (y=t;y<=dc;y++)
|
||||
for (y=t;y<=b;y++)
|
||||
MemSetU16(gr_win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16),
|
||||
task->win_z_num,w);
|
||||
}
|
||||
@@ -101,36 +118,29 @@ public U0 WinZBufUpdate()
|
||||
#help_index "Graphics/Char;Char"
|
||||
public U0 WinTextFill(I64 d,CTask *task=NULL)
|
||||
{
|
||||
I64 y,w,t,b,l,r;
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) return;
|
||||
I64 y,w,
|
||||
t= task->win_top>0
|
||||
? task->win_top : 0,
|
||||
dc= task->win_bottom<TEXT_ROWS
|
||||
? task->win_bottom : TEXT_ROWS-1,
|
||||
l= task->win_left>0
|
||||
? task->win_left : 0,
|
||||
r= task->win_right<TEXT_COLS
|
||||
? task->win_right : TEXT_COLS-1;
|
||||
if (task->win_top>0)
|
||||
t=task->win_top;
|
||||
else
|
||||
t=0;
|
||||
if (task->win_bottom<TEXT_ROWS)
|
||||
b=task->win_bottom;
|
||||
else
|
||||
b=TEXT_ROWS-1;
|
||||
if (task->win_left>0)
|
||||
l=task->win_left;
|
||||
else
|
||||
l=0;
|
||||
if (task->win_right<TEXT_COLS)
|
||||
r=task->win_right;
|
||||
else
|
||||
r=TEXT_COLS-1;
|
||||
if (w=r-l+1)
|
||||
for (y=t;y<=dc;y++)
|
||||
for (y=t;y<=b;y++)
|
||||
MemSetU32(gr_text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),
|
||||
d,w);
|
||||
}
|
||||
|
||||
public U0 WinTextClear(CTask *task=NULL)
|
||||
{
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) return;
|
||||
WinTextFill(task->text_attr<<8,task);
|
||||
}
|
||||
|
||||
public U0 SetWinBkColor(I64 c,CTask *task=NULL)
|
||||
{
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) return;
|
||||
task->text_attr=task->text_attr&0x0F | c<<4;
|
||||
WinTextFill(c<<12,task);
|
||||
d,w);
|
||||
}
|
||||
|
||||
#help_index "Graphics/Color"
|
||||
@@ -340,7 +350,7 @@ U0 GrSetUpTables()
|
||||
gr_refresh_time_stamps[i]=tT;
|
||||
}
|
||||
|
||||
U0 GrInit()
|
||||
U0 GrInit4()
|
||||
{
|
||||
SetStdPalette;
|
||||
fp_set_std_palette=&SetStdPalette;
|
||||
@@ -355,12 +365,12 @@ U0 GrInit()
|
||||
gr_win_uncovered_bitmap=CAlloc(65536/8);
|
||||
gr_highest_uncovered=0;
|
||||
|
||||
gr_dc=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc->flags|=DCF_SCREEN_BITMAP;
|
||||
gr_dc_cache=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT);
|
||||
|
||||
gr_dc2=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc2->flags|=DCF_SCREEN_BITMAP;
|
||||
gr_dc_cache=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT);
|
||||
|
||||
gr_dc=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT);
|
||||
gr_dc->flags|=DCF_SCREEN_BITMAP;
|
||||
DCFill;
|
||||
|
||||
gr_dc1=DCNew(DCT_COLOR4,GR_WIDTH,GR_HEIGHT);
|
||||
@@ -401,7 +411,7 @@ U0 GrUpdateWins()
|
||||
try {
|
||||
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER))
|
||||
DrawTaskBorder(task);
|
||||
WinTextClear(task);
|
||||
WinTextFill(task->text_attr<<8,task);
|
||||
Preempt(old_preempt);
|
||||
if (task==sys_winmgr_task) {
|
||||
if (fp_wall_paper)
|
||||
@@ -412,7 +422,7 @@ U0 GrUpdateWins()
|
||||
}
|
||||
if (TaskValidate(task)) {
|
||||
if (task->draw_it) {
|
||||
dc=DCAlias(gr_dc,task);
|
||||
dc=DCAlias(gr_dc2,task);
|
||||
(*task->draw_it)(task,dc);
|
||||
DCDel(dc);
|
||||
}
|
||||
@@ -573,8 +583,8 @@ U0 GrZoomInScreen()
|
||||
|
||||
U0 GrUpdateBackgroundOfText()
|
||||
{
|
||||
I64 reg RSI *dst=gr_dc->body,reg R13 c,row,col,,cur_ch,
|
||||
reg R12 w1=gr_dc->width_internal,reg R10 w2=-7*w1+8,w3=7*w1,
|
||||
I64 reg RSI *dst=gr_dc2->body,reg R13 c,row,col,,cur_ch,
|
||||
reg R12 w1=gr_dc2->width_internal,reg R10 w2=-7*w1+8,w3=7*w1,
|
||||
reg *my_1_to_8_colors=gr_1_to_8_colors;
|
||||
U32 reg *src=gr_text_base;
|
||||
$HL,1$ Bool blink_flag=Blink;
|
||||
@@ -628,10 +638,10 @@ asm {
|
||||
U0 GrUpdateForegroundOfText()
|
||||
{
|
||||
U32 *src=gr_text_base;
|
||||
I64 i,j,cur_ch,reg *dst=gr_dc->body,
|
||||
reg w1=gr_dc->width_internal,w2=7*w1,
|
||||
I64 i,j,cur_ch,reg *dst=gr_dc2->body,
|
||||
reg w1=gr_dc2->width_internal,w2=7*w1,
|
||||
row,col;
|
||||
U8 *dst_start=gr_dc->body,*dst_end=dst_start+w1*gr_dc->height-7*w1-8;
|
||||
U8 *dst_start=gr_dc2->body,*dst_end=dst_start+w1*gr_dc2->height-7*w1-8;
|
||||
Bool blink_flag=Blink;
|
||||
for (row=TEXT_ROWS;row--;) {
|
||||
for (col=TEXT_COLS;col--;) {
|
||||
@@ -762,10 +772,10 @@ U0 GrUpdateScreen()
|
||||
GrUpdateBackgroundOfText;
|
||||
GrUpdateForegroundOfText;
|
||||
GrUpdateWins;
|
||||
DCBlotColor8(gr_dc,gr_dc2);
|
||||
DCBlotColor8(gr_dc2,gr_dc);
|
||||
}
|
||||
|
||||
dc=DCAlias(gr_dc,Fs);
|
||||
dc=DCAlias(gr_dc2,Fs);
|
||||
dc->flags|=DCF_ON_TOP;
|
||||
if (fp_final_screen_update)
|
||||
(*fp_final_screen_update)(dc);
|
||||
@@ -774,8 +784,8 @@ U0 GrUpdateScreen()
|
||||
if (text_mode)
|
||||
GrUpdateTextModeText;
|
||||
else {
|
||||
DCBlotColor4(gr_dc1->body,gr_dc->body,gr_dc_cache->body,
|
||||
gr_dc->height*gr_dc->width_internal>>3);
|
||||
DCBlotColor4(gr_dc1->body,gr_dc2->body,gr_dc_cache->body,
|
||||
gr_dc2->height*gr_dc2->width_internal>>3);
|
||||
GrUpdateVGAGraphics;
|
||||
}
|
||||
Preempt(old_preempt);
|
||||
|
||||
@@ -6,7 +6,7 @@ each operation. The types available are lsted
|
||||
here, $LK,"GRST_PT","MN:GRST_PT"$. They are stored, one after another,
|
||||
in a chunk of memory terminated by a type $LK,"GRST_END","MN:GRST_END"$.
|
||||
|
||||
$LK,"SpritePlot3","MN:SpritePlot3"$() and $LK,"SpriteVect","MN:SpriteVect"$() shows how the
|
||||
$LK,"SpritePlot3","MN:SpritePlot3"$() and $LK,"SpriteMain","MN:SpriteMain"$() shows how the
|
||||
unions are used. It's kind-of a mess using a union.
|
||||
|
||||
$LK,"SpriteSize","MN:SpriteSize"$() will return the size of a single
|
||||
@@ -142,7 +142,7 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
case GRST_ELLIPSE:
|
||||
GrEllipse3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->rot_angle);
|
||||
break;
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->sides,tempg->rot_angle);
|
||||
break;
|
||||
case GRST_POLYLINE:
|
||||
@@ -237,7 +237,7 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
p->y+=y;
|
||||
p->z+=z;
|
||||
}
|
||||
Gr3Mesh(dc,tempg->vertex_cnt,&tempg->x2,tempg->triangle_cnt,(&tempg->x2)(U8 *)+sizeof(CD3I32)*tempg->vertex_cnt);
|
||||
Gr3Mesh(dc,tempg->vertex_cnt,&tempg->x2,tempg->tri_cnt,(&tempg->x2)(U8 *)+sizeof(CD3I32)*tempg->vertex_cnt);
|
||||
p=&tempg->x2;
|
||||
for (i=0;i<tempg->vertex_cnt;i++,p++) {
|
||||
p->x-=x;
|
||||
@@ -258,15 +258,15 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
|
||||
y1=tempg->y1+y;
|
||||
z1=tempg->z1+z;
|
||||
}
|
||||
p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
for (i=0;i<tempg->shiftable_vertex_cnt;i++,p++) {
|
||||
p->x+=x1;
|
||||
p->y+=y1;
|
||||
p->z+=z1;
|
||||
}
|
||||
p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
Gr3Mesh(dc,tempg->shiftable_vertex_cnt,p,tempg->shiftable_triangle_cnt,p(U8 *)+sizeof(CD3I32)*tempg->shiftable_vertex_cnt);
|
||||
p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
Gr3Mesh(dc,tempg->shiftable_vertex_cnt,p,tempg->shiftable_tri_cnt,p(U8 *)+sizeof(CD3I32)*tempg->shiftable_vertex_cnt);
|
||||
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
for (i=0;i<tempg->shiftable_vertex_cnt;i++,p++) {
|
||||
p->x-=x1;
|
||||
p->y-=y1;
|
||||
@@ -372,8 +372,6 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
//The two CSprite should be identical
|
||||
//except for points shifted around.
|
||||
//t ranges from 0.0 to 1.0
|
||||
//
|
||||
//See $LK-A,"::/TempleOS/Demo/Graphics/Golf.CPP"$ for an example.
|
||||
I64 i=SpriteSize(elems0),
|
||||
t1=gr_scale*t,t0=gr_scale-t1;
|
||||
I32 *ptr0,*ptr1,*ptrr;
|
||||
@@ -411,7 +409,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32;
|
||||
break;
|
||||
case GRST_ELLIPSE:
|
||||
case GRST_REG_POLY:
|
||||
case GRST_POLYGON:
|
||||
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
|
||||
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
|
||||
tempgr->width=(tempg0->width*t0+tempg1->width*t1)>>32;
|
||||
@@ -461,9 +459,9 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
|
||||
}
|
||||
break;
|
||||
case GRST_SHIFTABLE_MESH:
|
||||
p0=(&tempg0->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
p1=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
pr=(&tempgr->shiftable_triangle_cnt)(U8 *)+sizeof(I32);
|
||||
p0=(&tempg0->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
p1=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
pr=(&tempgr->shiftable_tri_cnt)(U8 *)+sizeof(I32);
|
||||
for (i=0;i<tempg0->shiftable_vertex_cnt;i++) {
|
||||
pr[i].x=(p0[i].x*t0+p1[i].x*t1)>>32;
|
||||
pr[i].y=(p0[i].y*t0+p1[i].y*t1)>>32;
|
||||
@@ -488,7 +486,7 @@ public CDocEntry *DocPutSprite(CDoc *doc=NULL,U8 *elems,U8 *txt=NULL)
|
||||
Bool unlock;
|
||||
CDocEntry *doc_e;
|
||||
CDocBin *tempb;
|
||||
if (!doc && !(doc=DocCur)) return NULL;
|
||||
if (!doc && !(doc=DocPut)) return NULL;
|
||||
unlock=DocLock(doc);
|
||||
size=SpriteSize(elems);
|
||||
tempb=CAlloc(sizeof(CDocBin),doc->mem_task);
|
||||
@@ -520,7 +518,7 @@ public CDocEntry *PutSprite(U8 *elems,U8 *txt=NULL)
|
||||
//and leave a %d for the number.
|
||||
|
||||
CDoc *doc;
|
||||
if (doc=DocCur)
|
||||
if (doc=DocPut)
|
||||
return DocPutSprite(doc,elems,txt);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1,486 +0,0 @@
|
||||
#help_index "Graphics/CGrVectMap"
|
||||
/*
|
||||
This processes a monocrome map, finds edges and generates vect graphic
|
||||
representations of the map broken into small rectangles. The rectangles
|
||||
are encoded a bit-oriented structure.
|
||||
|
||||
PolyLineStruct {
|
||||
1 Bit : set is valid polyline, clear is end of polyline lst
|
||||
(R_BITS) : X-coordinate of polyline start
|
||||
(R_BITS) : Y-coordinate of polyline start
|
||||
(poly_line_cnt_bits): Number of polyline direction entries
|
||||
N*3 : N-long seq of 1 pixel directional movements
|
||||
}
|
||||
|
||||
FloodFillStruct {
|
||||
1 Bit : set is valid flood fill entry, clear is end of floodfill lst
|
||||
(1+R_BITS): X-coordinate*2 of flood fill (half pixels)
|
||||
(1+R_BITS): Y-coordinate*2 of flood fill (half pixels)
|
||||
}
|
||||
|
||||
Rect {
|
||||
1 Bit : set is valid rectangle entry, clear is end of rectangle lst
|
||||
PolyLineStructLst
|
||||
FloodFillStructLst
|
||||
}
|
||||
*/
|
||||
|
||||
#define R_BITS 6
|
||||
#define R_BORDER 1
|
||||
#define R_WIDTH (1<<R_BITS-2*R_BORDER)
|
||||
#define R_HEIGHT (1<<R_BITS-2*R_BORDER)
|
||||
|
||||
U0 VectMapBlotRect(CDC *dc,CGrVectMap *vm,I64 bit,F64 scale)
|
||||
{
|
||||
I64 k,cnt,i0,j0,i,j,rect_dft,not_rect_dft;
|
||||
U8 *body=vm->body;
|
||||
F64 d=scale/2;
|
||||
dc->pen_width=scale+0.5;
|
||||
dc->color=rect_dft=Bt(body,bit++);
|
||||
not_rect_dft=1-rect_dft;
|
||||
|
||||
dc->bkcolor=vm->bkcolor;
|
||||
GrRect(dc,0,0,dc->width,dc->height);
|
||||
|
||||
dc->color=not_rect_dft;
|
||||
while (Bt(body,bit++)) {
|
||||
j=BFieldExtU32(body,bit,R_BITS);
|
||||
bit+=R_BITS;
|
||||
i=BFieldExtU32(body,bit,R_BITS);
|
||||
bit+=R_BITS;
|
||||
cnt=BFieldExtU32(body,bit,vm->poly_line_cnt_bits);
|
||||
bit+=vm->poly_line_cnt_bits;
|
||||
if (!cnt)
|
||||
GrPlot3(dc,(j-R_BORDER)*scale+d,(i-R_BORDER)*scale+d,0);
|
||||
else {
|
||||
i0=i;j0=j;
|
||||
while (cnt--) {
|
||||
k=BFieldExtU32(body,bit,3);
|
||||
bit+=3;
|
||||
i+=gr_y_offsets[k];
|
||||
j+=gr_x_offsets[k];
|
||||
GrLine3(dc,(j0-R_BORDER)*scale+d,(i0-R_BORDER)*scale+d,0,
|
||||
(j-R_BORDER)*scale+d,(i-R_BORDER)*scale+d,0);
|
||||
i0=i; j0=j;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (Bt(body,bit++)) {
|
||||
j=BFieldExtU32(body,bit,R_BITS+1);
|
||||
bit+=R_BITS+1;
|
||||
i=BFieldExtU32(body,bit,R_BITS+1);
|
||||
bit+=R_BITS+1;
|
||||
if (GrPeek(dc,(j/2.0-R_BORDER)*scale+d,(i/2.0-R_BORDER)*scale+d)==rect_dft)
|
||||
GrFloodFill(dc,(j/2.0-R_BORDER)*scale+d,(i/2.0-R_BORDER)*scale+d);
|
||||
}
|
||||
}
|
||||
|
||||
class CMPVMBlot
|
||||
{
|
||||
CDC *dc,*rect_dc;
|
||||
CGrVectMap *vm;
|
||||
I64 bit;
|
||||
I64 xx,yy;
|
||||
F64 scale;
|
||||
I64 busy;
|
||||
};
|
||||
|
||||
|
||||
U0 VectMapBlotRectMP(CMPVMBlot *mp)
|
||||
{
|
||||
VectMapBlotRect(mp->rect_dc,mp->vm,mp->bit,mp->scale);
|
||||
GrBlot(mp->dc,mp->xx,mp->yy,mp->rect_dc);
|
||||
mp->busy=FALSE;
|
||||
}
|
||||
|
||||
|
||||
public U0 VectMapBlotMP(CDC *dc,I64 x,I64 y,CGrVectMap *vm,F64 scale=1.0,I64 _mp_cnt=0)
|
||||
{
|
||||
I64 i,i_lo,i_hi,j,j_lo,j_hi,k,cpu,pass,
|
||||
w=(vm->width +R_WIDTH-1)/R_WIDTH,
|
||||
h=(vm->height+R_HEIGHT-1)/R_HEIGHT;
|
||||
F64 xx,yy,r_scale=scale*(R_WIDTH+1.0/scale)/R_WIDTH;
|
||||
CMPVMBlot *mp;
|
||||
if (!dc || !vm) return;
|
||||
if (Gs->num)
|
||||
_mp_cnt=1; //Only core #0 can be master
|
||||
else if (!_mp_cnt)
|
||||
_mp_cnt=mp_cnt;
|
||||
else if (_mp_cnt>mp_cnt)
|
||||
_mp_cnt=mp_cnt;
|
||||
cpu=_mp_cnt-1;
|
||||
|
||||
mp=MAlloc(_mp_cnt*sizeof(CMPVMBlot));
|
||||
|
||||
for (i=0;i<_mp_cnt;i++) {
|
||||
mp[i].rect_dc=DCNew(DCT_COLOR8,R_WIDTH*r_scale,R_HEIGHT*r_scale,Fs);
|
||||
mp[i].dc=DCAlias(dc,dc->win_task);
|
||||
mp[i].dc->color=dc->color;
|
||||
mp[i].vm=vm;
|
||||
mp[i].scale=r_scale;
|
||||
mp[i].busy=FALSE;
|
||||
}
|
||||
|
||||
if (y<0)
|
||||
i_lo=-y/(R_HEIGHT*scale);
|
||||
else
|
||||
i_lo=0;
|
||||
if (R_HEIGHT*scale*h+y>dc->height)
|
||||
i_hi=MinI64((dc->height-y)/(R_HEIGHT*scale)+1,h);
|
||||
else
|
||||
i_hi=h;
|
||||
|
||||
if (x<0)
|
||||
j_lo=-x/(R_WIDTH*scale);
|
||||
else
|
||||
j_lo=0;
|
||||
if (R_WIDTH*scale*w+x>dc->width)
|
||||
j_hi=MinI64((dc->width-x)/(R_WIDTH*scale)+1,w);
|
||||
else
|
||||
j_hi=w;
|
||||
|
||||
xx=x+j_lo*R_WIDTH*scale;
|
||||
for (j=j_lo;j<j_hi;j++) {
|
||||
yy=y+i_lo*R_WIDTH*scale;
|
||||
k=i_lo*w+j;
|
||||
for (i=i_lo;i<i_hi;i++) {
|
||||
if (_mp_cnt>1) {
|
||||
pass=0;
|
||||
//Does up to two passes
|
||||
while (TRUE)
|
||||
if (!pass && !cpu) {
|
||||
pass++;
|
||||
cpu=_mp_cnt-1;
|
||||
} else if (mp[cpu].busy) //by the way, core #0 is never busy
|
||||
cpu--;
|
||||
else
|
||||
break;
|
||||
}
|
||||
mp[cpu].xx=xx;
|
||||
mp[cpu].yy=yy;
|
||||
mp[cpu].bit=vm->rect_start_bits[k];
|
||||
if (!cpu)
|
||||
VectMapBlotRectMP(mp);
|
||||
else {
|
||||
mp[cpu].busy=TRUE;
|
||||
MPJob(&VectMapBlotRectMP,&mp[cpu],cpu);
|
||||
}
|
||||
k+=w;
|
||||
yy+=R_HEIGHT*scale;
|
||||
}
|
||||
xx+=R_WIDTH*scale;
|
||||
}
|
||||
for (i=_mp_cnt-1;i>=0;i--) {
|
||||
while(mp[i].busy)
|
||||
Yield;
|
||||
DCDel(mp[i].rect_dc);
|
||||
DCDel(mp[i].dc);
|
||||
}
|
||||
Free(mp);
|
||||
}
|
||||
|
||||
Bool IsSolidSquare(CDC *dc,I64 x,I64 y,I64 edge,CColorROPU32 color)
|
||||
{
|
||||
I64 i,j;
|
||||
edge>>=1;
|
||||
for (i=-edge;i<edge;i++)
|
||||
for (j=-edge;j<edge;j++)
|
||||
if (GrPeek(dc,x+j,y+i)!=color)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
I64 VectizeRect(CDC *dc,I64 _x,I64 _y,CGrVectMap *vm,I64 _bit,
|
||||
I64 poly_line_cnt_bits,I64 *_max_poly_line_cnt_bits)
|
||||
{ //Returns number of bits to represent rect
|
||||
CDC *b_desired =DCExtract(dc,_x-R_BORDER,_y-R_BORDER,_x+R_WIDTH+R_BORDER*2-1,_y+R_BORDER*2+R_HEIGHT-1),
|
||||
*b_edge=DCNew(DCT_COLOR8,R_WIDTH+R_BORDER*2,R_HEIGHT+R_BORDER*2,Fs),
|
||||
*b_actual,
|
||||
*b_link_check=DCNew(DCT_COLOR8,R_WIDTH+R_BORDER*2,R_HEIGHT+R_BORDER*2,Fs);
|
||||
I64 step,step_bits,x,y,xx,yy,xx1,yy1,xx2,yy2,cnt=0,k,kk,rect_dft,not_rect_dft,
|
||||
cnt_bit,link_bit1,link_bit2,link_bit_limit,bit=_bit,max_poly_line_cnt_bits;
|
||||
U8 *body=vm->body;
|
||||
Bool found;
|
||||
if (_max_poly_line_cnt_bits)
|
||||
max_poly_line_cnt_bits=*_max_poly_line_cnt_bits;
|
||||
else
|
||||
max_poly_line_cnt_bits=3;
|
||||
|
||||
//Count ON pixels
|
||||
for (y=0;y<R_HEIGHT;y++)
|
||||
for (x=0;x<R_WIDTH;x++)
|
||||
if (GrPeek(b_desired,R_BORDER+x,R_BORDER+y)==1)
|
||||
cnt++;
|
||||
|
||||
if (cnt>=R_WIDTH*R_HEIGHT/2)
|
||||
rect_dft=1;
|
||||
else
|
||||
rect_dft=0;
|
||||
not_rect_dft=1-rect_dft;
|
||||
|
||||
BEqu(body,bit++,rect_dft);
|
||||
|
||||
if (!cnt || cnt==R_WIDTH*R_HEIGHT) {
|
||||
//Rect is all ON or OFF
|
||||
Btr(body,bit++); //End of poly-line lst
|
||||
Btr(body,bit++); //End of flood-fill lst
|
||||
} else {
|
||||
for (y=0;y<R_HEIGHT+R_BORDER*2;y++)
|
||||
for (x=0;x<R_WIDTH+R_BORDER*2;x++) {
|
||||
b_edge->color=0;
|
||||
if (GrPeek(b_desired,x,y)==not_rect_dft)
|
||||
for (k=0;k<8;k++)
|
||||
if (GrPeek(b_desired,x+gr_x_offsets[k],y+gr_y_offsets[k])==rect_dft)
|
||||
b_edge->color=1;
|
||||
GrPlot(b_edge,x,y);
|
||||
}
|
||||
|
||||
b_edge->color=0;
|
||||
link_bit1=bit;
|
||||
for (y=0;y<R_HEIGHT+R_BORDER*2;y++)
|
||||
for (x=0;x<R_WIDTH+R_BORDER*2;x++)
|
||||
if (GrPeek(b_edge,x,y)==1) {
|
||||
Bts(body,bit++); //Show not end of poly-line lst
|
||||
GrPlot(b_edge,x,y);
|
||||
BFieldOrU32(body,bit,x); //Poly-line starting X coordinate in rect
|
||||
bit+=R_BITS;
|
||||
BFieldOrU32(body,bit,y); //Poly-line starting Y coordinate in rect
|
||||
bit+=R_BITS;
|
||||
yy=y; xx=x;
|
||||
cnt_bit=bit;
|
||||
bit+=poly_line_cnt_bits; //Reserve space for count of direction offsets in poly-line
|
||||
cnt=0;
|
||||
do {
|
||||
found=FALSE;
|
||||
for (k=0;k<8;k++) {
|
||||
yy2=yy+gr_y_offsets[k];
|
||||
xx2=xx+gr_x_offsets[k];
|
||||
if (0<=xx2<R_WIDTH+R_BORDER*2 &&
|
||||
0<=yy2<R_HEIGHT+R_BORDER*2 &&
|
||||
GrPeek(b_edge,xx2,yy2)==1) {
|
||||
cnt++;
|
||||
BFieldOrU32(body,bit,k); //3-bit (or 2) incoding of direction movement
|
||||
bit+=3;
|
||||
GrPlot(b_edge,xx2,yy2);
|
||||
yy=yy2; xx=xx2;
|
||||
found=TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (found);
|
||||
BFieldOrU32(body,cnt_bit,cnt);
|
||||
if (cnt && Bsr(cnt)+1>max_poly_line_cnt_bits)
|
||||
max_poly_line_cnt_bits=Bsr(cnt)+1;
|
||||
}
|
||||
|
||||
//Connect adjacent groups with link to prevent flood-fill leaks.
|
||||
link_bit_limit=bit;
|
||||
while (link_bit1<link_bit_limit) {
|
||||
link_bit1++;
|
||||
x=BFieldExtU32(body,link_bit1,R_BITS);
|
||||
link_bit1+=R_BITS;
|
||||
y=BFieldExtU32(body,link_bit1,R_BITS);
|
||||
link_bit1+=R_BITS;
|
||||
|
||||
link_bit2=link_bit1;
|
||||
yy=y;xx=x;
|
||||
cnt=BFieldExtU32(body,link_bit2,poly_line_cnt_bits);
|
||||
link_bit2+=poly_line_cnt_bits;
|
||||
while (TRUE) {
|
||||
for (k=0;k<8;k++) {
|
||||
yy2=yy+gr_y_offsets[k];
|
||||
xx2=xx+gr_x_offsets[k];
|
||||
if (0<=xx2<R_WIDTH+R_BORDER*2 &&
|
||||
0<=yy2<R_HEIGHT+R_BORDER*2 &&
|
||||
GrPeek(b_link_check,xx2,yy2)==1) {
|
||||
Bts(body,bit++);
|
||||
BFieldOrU32(body,bit,xx);
|
||||
bit+=R_BITS;
|
||||
BFieldOrU32(body,bit,yy);
|
||||
bit+=R_BITS;
|
||||
BFieldOrU32(body,bit,1);
|
||||
bit+=poly_line_cnt_bits;
|
||||
BFieldOrU32(body,bit,k);
|
||||
bit+=3;
|
||||
}
|
||||
}
|
||||
if (!cnt--)
|
||||
break;
|
||||
kk=BFieldExtU32(body,link_bit2,3);
|
||||
link_bit2+=3;
|
||||
yy+=gr_y_offsets[kk];
|
||||
xx+=gr_x_offsets[kk];
|
||||
}
|
||||
|
||||
link_bit2=link_bit1;
|
||||
yy=y;xx=x;
|
||||
b_link_check->color=1;
|
||||
GrPlot(b_link_check,xx,yy);
|
||||
cnt=BFieldExtU32(body,link_bit2,poly_line_cnt_bits);
|
||||
link_bit2+=poly_line_cnt_bits;
|
||||
while (cnt--) {
|
||||
kk=BFieldExtU32(body,link_bit2,3);
|
||||
link_bit2+=3;
|
||||
yy+=gr_y_offsets[kk];
|
||||
xx+=gr_x_offsets[kk];
|
||||
GrPlot(b_link_check,xx,yy);
|
||||
}
|
||||
|
||||
link_bit1=link_bit2;
|
||||
}
|
||||
Btr(body,bit++); //End of poly-line lst
|
||||
|
||||
b_desired->color=rect_dft;
|
||||
GrLineRect4(b_desired,0,0,R_WIDTH+2*R_BORDER-1,R_HEIGHT+2*R_BORDER-1);
|
||||
Btr(body,bit); //Temp end of flood-fill lst
|
||||
|
||||
for (step_bits=2;step_bits>=1;step_bits-=1) {
|
||||
step=1<<step_bits;
|
||||
b_actual=DCNew(DCT_COLOR8,R_WIDTH/step,R_HEIGHT/step,Fs);
|
||||
VectMapBlotRect(b_actual,vm,_bit,1.0/step);
|
||||
|
||||
b_actual->color=not_rect_dft;
|
||||
GrLineRect4(b_actual,0,0,R_WIDTH+2*R_BORDER-1,R_HEIGHT+2*R_BORDER-1);
|
||||
|
||||
//Flood fill
|
||||
for (y=R_BORDER;y<R_HEIGHT+R_BORDER;y+=step)
|
||||
for (x=R_BORDER;x<R_WIDTH+R_BORDER;x+=step)
|
||||
if (IsSolidSquare(b_desired,x,y,step,not_rect_dft) && GrPeek(b_actual,x>>step_bits,y>>step_bits)==rect_dft) {
|
||||
Bts(body,bit++); //Show not end of flood-fill lst
|
||||
yy=y; xx=x;
|
||||
for (k=0;k<4;k++) {
|
||||
yy2=yy;
|
||||
while (yy2<R_HEIGHT+R_BORDER-1 &&
|
||||
IsSolidSquare(b_desired,xx,yy2,step,not_rect_dft) && GrPeek(b_actual,xx>>step_bits,yy2>>step_bits)==rect_dft)
|
||||
yy2++;
|
||||
while (yy>R_BORDER &&
|
||||
IsSolidSquare(b_desired,xx,yy,step,not_rect_dft) && GrPeek(b_actual,xx>>step_bits,yy>>step_bits)==rect_dft)
|
||||
yy--;
|
||||
yy1=yy+yy2;
|
||||
yy=yy1/2;
|
||||
|
||||
xx2=xx;
|
||||
while (xx2<R_WIDTH+R_BORDER-1 &&
|
||||
IsSolidSquare(b_desired,xx2,yy,step,not_rect_dft) && GrPeek(b_actual,xx2>>step_bits,yy>>step_bits)==rect_dft)
|
||||
xx2++;
|
||||
while (xx>R_BORDER &&
|
||||
IsSolidSquare(b_desired,xx,yy,step,not_rect_dft) && GrPeek(b_actual,xx>>step_bits,yy>>step_bits)==rect_dft)
|
||||
xx--;
|
||||
xx1=xx+xx2;
|
||||
xx=xx1/2;
|
||||
|
||||
}
|
||||
GrFloodFill(b_actual,xx>>step_bits,yy>>step_bits);
|
||||
BFieldOrU32(body,bit,xx1); //Flood fill X-coordinate in rect
|
||||
bit+=R_BITS+1;
|
||||
BFieldOrU32(body,bit,yy1); //Flood fill Y-coordinate in rect
|
||||
bit+=R_BITS+1;
|
||||
}
|
||||
DCDel(b_actual);
|
||||
Btr(body,bit); //Temp end of flood-fill lst
|
||||
}
|
||||
bit++; //End of flood-fill lst
|
||||
}
|
||||
|
||||
DCDel(b_desired);
|
||||
DCDel(b_edge);
|
||||
DCDel(b_link_check);
|
||||
|
||||
if (_max_poly_line_cnt_bits) *_max_poly_line_cnt_bits=max_poly_line_cnt_bits;
|
||||
|
||||
return bit-_bit;
|
||||
}
|
||||
|
||||
|
||||
#define TEMP_BODY_SIZE 0x10000
|
||||
public CGrVectMap *DC2VectMap(CDC *dc,CTask *mem_task=NULL,I64 *_size=NULL)
|
||||
{ //Currently does not convert outer 1 pixel border
|
||||
I64 i,j,k,cnt,size,
|
||||
w=(dc->width-R_BORDER*2+R_WIDTH-1)/R_WIDTH,
|
||||
h=(dc->height-R_BORDER*2+R_HEIGHT-1)/R_HEIGHT,
|
||||
rect_cnt=w*h,poly_line_cnt_bits=12,max_poly_line_cnt_bits=3;
|
||||
U32 *rect_start_bits;
|
||||
U8 *body;
|
||||
CGrVectMap *result,tempv;
|
||||
|
||||
body=MAlloc(TEMP_BODY_SIZE);
|
||||
|
||||
//Pass 1: Get max_poly_line_cnt_bits
|
||||
for (i=0;i<h;i++)
|
||||
for (j=0;j<w;j++) {
|
||||
MemSet(&tempv,0,sizeof(CGrVectMap));
|
||||
MemSet(body,0,TEMP_BODY_SIZE);
|
||||
tempv.width =dc->width-R_BORDER*2;
|
||||
tempv.height=dc->height-R_BORDER*2;
|
||||
tempv.body=body;
|
||||
tempv.rect_cnt=rect_cnt;
|
||||
tempv.r_bits=R_BITS;
|
||||
tempv.poly_line_cnt_bits=poly_line_cnt_bits;
|
||||
VectizeRect(dc,R_BORDER+j*R_WIDTH,R_BORDER+i*R_HEIGHT,&tempv,0,poly_line_cnt_bits,&max_poly_line_cnt_bits);
|
||||
}
|
||||
|
||||
//Pass 2: Get cnt
|
||||
poly_line_cnt_bits=max_poly_line_cnt_bits;
|
||||
cnt=0;
|
||||
for (i=0;i<h;i++)
|
||||
for (j=0;j<w;j++) {
|
||||
MemSet(&tempv,0,sizeof(CGrVectMap));
|
||||
MemSet(body,0,TEMP_BODY_SIZE);
|
||||
tempv.width =dc->width-R_BORDER*2;
|
||||
tempv.height=dc->height-R_BORDER*2;
|
||||
tempv.body=body;
|
||||
tempv.rect_cnt=rect_cnt;
|
||||
tempv.r_bits=R_BITS;
|
||||
tempv.poly_line_cnt_bits=poly_line_cnt_bits;
|
||||
cnt+=VectizeRect(dc,R_BORDER+j*R_WIDTH,R_BORDER+i*R_HEIGHT,&tempv,0,poly_line_cnt_bits,NULL);
|
||||
}
|
||||
Free(body);
|
||||
|
||||
//Pass 3
|
||||
size=(cnt+7)/8;
|
||||
result=CAlloc(sizeof(CGrVectMap),mem_task);
|
||||
result->body=CAlloc(size,mem_task);
|
||||
rect_start_bits=MAlloc((rect_cnt+1)*sizeof(U32),mem_task);
|
||||
result->width =dc->width-R_BORDER*2;
|
||||
result->height=dc->height-R_BORDER*2;
|
||||
result->rect_cnt=rect_cnt;
|
||||
result->r_bits=R_BITS;
|
||||
result->poly_line_cnt_bits=poly_line_cnt_bits;
|
||||
result->rect_start_bits=rect_start_bits;
|
||||
k=0;
|
||||
cnt=0;
|
||||
for (i=0;i<h;i++)
|
||||
for (j=0;j<w;j++) {
|
||||
rect_start_bits[k++]=cnt;
|
||||
cnt+=VectizeRect(dc,R_BORDER+j*R_WIDTH,R_BORDER+i*R_HEIGHT,result,cnt,poly_line_cnt_bits,NULL);
|
||||
}
|
||||
rect_start_bits[k]=cnt;
|
||||
|
||||
if (_size) *_size=size;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 VectMapDel(CGrVectMap *vm)
|
||||
{
|
||||
Free(vm->rect_start_bits);
|
||||
Free(vm->body);
|
||||
Free(vm);
|
||||
}
|
||||
|
||||
U32 *VectMapRectStartBits(CGrVectMap *vm,CTask *mem_task=NULL)
|
||||
{
|
||||
I64 k=0,bit=0;
|
||||
U8 *body=vm->body;
|
||||
U32 *result=MAlloc((vm->rect_cnt+1)*sizeof(U32),mem_task);
|
||||
for (k=0;k<vm->rect_cnt;k++) {
|
||||
result[k]=bit++;
|
||||
while (Bt(body,bit++)) {
|
||||
bit+=2*R_BITS;
|
||||
bit+=vm->poly_line_cnt_bits+3*BFieldExtU32(body,bit,vm->poly_line_cnt_bits);
|
||||
}
|
||||
while (Bt(body,bit++))
|
||||
bit+=2*(R_BITS+1);
|
||||
}
|
||||
result[k]=bit;
|
||||
return result;
|
||||
}
|
||||
+163
-79
@@ -5,7 +5,84 @@ public I64 gr_x_offsets[8]={-1, 0, 1,-1,1,-1,0,1},
|
||||
gr_x_offsets2[4]={ 0,-1, 1, 0},
|
||||
gr_y_offsets2[4]={-1, 0, 0, 1};
|
||||
|
||||
public Bool Line(U8 *aux_data,
|
||||
public I64 Line(U8 *aux_data,
|
||||
I64 x1,I64 y1,I64 z1,
|
||||
I64 x2,I64 y2,I64 z2,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
I64 step=1,I64 start=0)
|
||||
{
|
||||
//This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 i,j,d,dx=x2-x1,dy=y2-y1,dz=z2-z1,_x,_y,_z,
|
||||
adx=AbsI64(dx),ady=AbsI64(dy),adz=AbsI64(dz),result=0;
|
||||
Bool first=TRUE;
|
||||
if (adx>=ady) {
|
||||
if (adx>=adz) {
|
||||
if (d=adx) {
|
||||
if (dx>=0)
|
||||
dx=0x100000000;
|
||||
else
|
||||
dx=-0x100000000;
|
||||
dy=dy<<32/d;
|
||||
dz=dz<<32/d;
|
||||
}
|
||||
} else {
|
||||
if (d=adz) {
|
||||
dx=dx<<32/d;
|
||||
dy=dy<<32/d;
|
||||
if (dz>=0)
|
||||
dz=0x100000000;
|
||||
else
|
||||
dz=-0x100000000;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ady>=adz) {
|
||||
if (d=ady) {
|
||||
dx=dx<<32/d;
|
||||
if (dy>=0)
|
||||
dy=0x100000000;
|
||||
else
|
||||
dy=-0x100000000;
|
||||
dz=dz<<32/d;
|
||||
}
|
||||
} else {
|
||||
if (d=adz) {
|
||||
dx=dx<<32/d;
|
||||
dy=dy<<32/d;
|
||||
if (dz>=0)
|
||||
dz=0x100000000;
|
||||
else
|
||||
dz=-0x100000000;
|
||||
}
|
||||
}
|
||||
}
|
||||
x1<<=32; y1<<=32; z1<<=32;
|
||||
for (j=0;j<start;j++) {
|
||||
x1+=dx; y1+=dy; z1+=dz;
|
||||
}
|
||||
if (step!=1 && step!=0) {
|
||||
dx*=step;
|
||||
dy*=step;
|
||||
dz*=step;
|
||||
d/=step;
|
||||
}
|
||||
for (i=start;i<=d;i++) {
|
||||
if (_x!=x1.i32[1] || _y!=y1.i32[1] || _z!=z1.i32[1] || first) {
|
||||
if ((*fp_plot)(aux_data,x1.i32[1],y1.i32[1],z1.i32[1]))
|
||||
result++;
|
||||
}
|
||||
first=FALSE;
|
||||
_x=x1.i32[1]; _y=y1.i32[1]; _z=z1.i32[1];
|
||||
x1+=dx; y1+=dy; z1+=dz;
|
||||
}
|
||||
if (step==1 && (_x!=x2||_y!=y2||_z!=z2)) {
|
||||
if ((*fp_plot)(aux_data,x2,y2,z2))
|
||||
result++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool LOSLine(U8 *aux_data,
|
||||
I64 x1,I64 y1,I64 z1,
|
||||
I64 x2,I64 y2,I64 z2,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
@@ -82,14 +159,14 @@ public Bool Line(U8 *aux_data,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
public Bool Rect(U8 *aux_data,
|
||||
public I64 Rect(U8 *aux_data,
|
||||
I64 x1,I64 y1,I64 z1,
|
||||
I64 x2,I64 y2,I64 z2,
|
||||
I64 x3,I64 y3,I64 z3,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z))
|
||||
{
|
||||
//This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$.
|
||||
I64 i,j,
|
||||
I64 i,j,result=0,
|
||||
d1,dx1=x2-x1,dy1=y2-y1,dz1=z2-z1,
|
||||
d2,dx2=x3-x1,dy2=y3-y1,dz2=z3-z1,
|
||||
adx1=AbsI64(dx1),ady1=AbsI64(dy1),adz1=AbsI64(dz1),
|
||||
@@ -97,14 +174,28 @@ public Bool Rect(U8 *aux_data,
|
||||
last_x,last_y,last_z;
|
||||
Bool first=TRUE;
|
||||
|
||||
if (adx1>=ady1)
|
||||
d1=adx1>=adz1 ? adx1:adz1;
|
||||
else
|
||||
d1=ady1>=adz1 ? ady1:adz1;
|
||||
if (adx2>=ady2)
|
||||
d2=adx2>=adz2 ? adx2:adz2;
|
||||
else
|
||||
d2=ady2>=adz2 ? ady2:adz2;
|
||||
if (adx1>=ady1) {
|
||||
if (adx1>=adz1)
|
||||
d1=adx1;
|
||||
else
|
||||
d1=adz1;
|
||||
} else {
|
||||
if (ady1>=adz1)
|
||||
d1=ady1;
|
||||
else
|
||||
d1=adz1;
|
||||
}
|
||||
if (adx2>=ady2) {
|
||||
if (adx2>=adz2)
|
||||
d2=adx2;
|
||||
else
|
||||
d2=adz2;
|
||||
} else {
|
||||
if (ady2>=adz2)
|
||||
d2=ady2;
|
||||
else
|
||||
d2=adz2;
|
||||
}
|
||||
d1<<=1;
|
||||
d2<<=1;
|
||||
if (d1) {
|
||||
@@ -123,17 +214,16 @@ public Bool Rect(U8 *aux_data,
|
||||
for (j=0;j<=d1;j++) {
|
||||
x2=x1; y2=y1; z2=z1;
|
||||
for (i=0;i<=d2;i++) {
|
||||
if (x2.i32[1]!=last_x || y2.i32[1]!=last_y || z2.i32[1]!=last_z ||first) {
|
||||
if (!(*fp_plot)(aux_data,x2.i32[1],y2.i32[1],z2.i32[1]))
|
||||
return FALSE;
|
||||
}
|
||||
if ((x2.i32[1]!=last_x || y2.i32[1]!=last_y || z2.i32[1]!=last_z ||first) &&
|
||||
(*fp_plot)(aux_data,x2.i32[1],y2.i32[1],z2.i32[1]))
|
||||
result++;
|
||||
first=FALSE;
|
||||
last_x=x2.i32[1]; last_y=y2.i32[1]; last_z=z2.i32[1];
|
||||
x2+=dx2; y2+=dy2; z2+=dz2;
|
||||
}
|
||||
x1+=dx1; y1+=dy1; z1+=dz1;
|
||||
}
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Math/3D Transformation"
|
||||
@@ -471,7 +561,7 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color
|
||||
v2.z=p3->z-p2->z;
|
||||
|
||||
//V1 and V2 are vects along two sides
|
||||
//of the triangle joined at p2.
|
||||
//of the tri joined at p2.
|
||||
|
||||
vn_x=v1.y*v2.z-v1.z*v2.y;
|
||||
vn_y=v1.z*v2.x-v1.x*v2.z;
|
||||
@@ -523,7 +613,7 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color
|
||||
#define SCALE2 8
|
||||
|
||||
#help_index "Graphics/Math"
|
||||
public Bool Circle(U8 *aux_data,
|
||||
public I64 Circle(U8 *aux_data,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 radius,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
@@ -532,9 +622,9 @@ public Bool Circle(U8 *aux_data,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 i,j,len=Ceil(len_radians*radius),
|
||||
x,y,x1,y1,s1,s2,c;
|
||||
x,y,x1,y1,s1,s2,c,result=0;
|
||||
F64 t;
|
||||
if (radius<=0||!step) return TRUE;
|
||||
if (radius<=0||!step) return 0;
|
||||
t=1.0/radius;
|
||||
c=1<<SCALE1*Cos(t);
|
||||
if (step<0) {
|
||||
@@ -555,18 +645,18 @@ public Bool Circle(U8 *aux_data,
|
||||
x<<=SCALE2;
|
||||
y<<=SCALE2;
|
||||
for (i=0;i<=len;i+=step) {
|
||||
if (!(*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz))
|
||||
return FALSE;
|
||||
if ((*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz))
|
||||
result++;
|
||||
for (j=0;j<step;j++) {
|
||||
x1=(c*x+s1*y)>>SCALE1;
|
||||
y1=(s2*x+c*y)>>SCALE1;
|
||||
x=x1; y=y1;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool Ellipse(U8 *aux_data,
|
||||
public I64 Ellipse(U8 *aux_data,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
@@ -576,11 +666,12 @@ public Bool Ellipse(U8 *aux_data,
|
||||
F64 len_radians=2*ã)
|
||||
{
|
||||
I64 i,j,len,
|
||||
x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2;
|
||||
x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2,result;
|
||||
F64 t;
|
||||
Bool first=TRUE;
|
||||
if (x_radius<=0 || y_radius<=0 || !step)
|
||||
return TRUE;
|
||||
return 0;
|
||||
result=0;
|
||||
if (x_radius>=y_radius) {
|
||||
t=1.0/x_radius;
|
||||
len=Ceil(len_radians*x_radius);
|
||||
@@ -621,8 +712,8 @@ public Bool Ellipse(U8 *aux_data,
|
||||
|
||||
for (i=0;i<=len;i+=step) {
|
||||
if (x>>SCALE2!=_x || y>>SCALE2!=_y || first) {
|
||||
if (!(*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz))
|
||||
return FALSE;
|
||||
if ((*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz))
|
||||
result++;
|
||||
}
|
||||
_x=x>>SCALE2; _y=y>>SCALE2; first=FALSE;
|
||||
for (j=0;j<step;j++) {
|
||||
@@ -635,10 +726,10 @@ public Bool Ellipse(U8 *aux_data,
|
||||
y=(s22*x1+c2*y1)>>SCALE1;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool RegPoly(U8 *aux_data,
|
||||
public I64 RegPoly(U8 *aux_data,
|
||||
I64 cx,I64 cy,I64 cz,
|
||||
I64 x_radius,I64 y_radius,I64 sides,
|
||||
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
|
||||
@@ -649,11 +740,13 @@ public Bool RegPoly(U8 *aux_data,
|
||||
{
|
||||
I64 i,n,x,y,x1,y1,x2,y2,
|
||||
xx1,yy1,xx2,yy2,
|
||||
s1,s2,c, s12,s22,c2;
|
||||
s1,s2,c, s12,s22,c2,result;
|
||||
F64 angle_step;
|
||||
|
||||
if (sides<=0 || x_radius<=0 || y_radius<=0)
|
||||
return TRUE;
|
||||
return 0;
|
||||
|
||||
result=0;
|
||||
|
||||
angle_step=2*ã/sides;
|
||||
n=len_radians*sides/(2*ã);
|
||||
@@ -694,11 +787,10 @@ public Bool RegPoly(U8 *aux_data,
|
||||
y=(s22*x1+c2*y1)>>SCALE1;
|
||||
xx2=cx+x>>SCALE2;
|
||||
yy2=cy+y>>SCALE2;
|
||||
if (!Line(aux_data,xx1,yy1,cz,xx2,yy2,cz,fp_plot,step))
|
||||
return FALSE;
|
||||
result+=Line(aux_data,xx1,yy1,cz,xx2,yy2,cz,fp_plot,step);
|
||||
xx1=xx2; yy1=yy2;
|
||||
}
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
#help_index "Graphics/CD3I32;Math/CD3I32"
|
||||
@@ -718,9 +810,9 @@ public I64 P3I32SqrNorm(CD3I32 *p)
|
||||
}
|
||||
|
||||
#help_index "Graphics/Math"
|
||||
public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
public I64 Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
{//2nd order
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max,result=0;
|
||||
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
|
||||
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
|
||||
x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0,
|
||||
@@ -729,10 +821,8 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
P3I32Dist(&ctrl[2],&ctrl[0]),
|
||||
s=0.5/d,t1,t2;
|
||||
xx=x0; yy=y0; zz=z0;
|
||||
if (first) {
|
||||
if (!(*fp_plot)(aux_data,xx,yy,zz))
|
||||
return FALSE;
|
||||
}
|
||||
if (first && (*fp_plot)(aux_data,xx,yy,zz))
|
||||
result++;
|
||||
for (t=0.0;t<=1.0;t+=s) {
|
||||
t1=t*(1.0-t);
|
||||
t2=t*t;
|
||||
@@ -752,22 +842,21 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
s*=1.1;
|
||||
else {
|
||||
s*=0.9;
|
||||
if (!(*fp_plot)(aux_data,x,y,z))
|
||||
return FALSE;
|
||||
if ((*fp_plot)(aux_data,x,y,z))
|
||||
result++;
|
||||
xx=x;yy=y;zz=z;
|
||||
}
|
||||
}
|
||||
x=ctrl[2].x; y=ctrl[2].y; z=ctrl[2].z;
|
||||
if (xx!=x || yy!=y || zz!=z) {
|
||||
if (!(*fp_plot)(aux_data,x,y,z))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
if ((xx!=x || yy!=y || zz!=z) &&
|
||||
(*fp_plot)(aux_data,x,y,z))
|
||||
result++;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
public I64 Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
|
||||
{ //3rd order
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max,result=0;
|
||||
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
|
||||
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
|
||||
x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0,
|
||||
@@ -778,10 +867,8 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
P3I32Dist(&ctrl[3],&ctrl[0]),
|
||||
s=0.5/d,nt,t1,t2,t3;
|
||||
xx=x0; yy=y0; zz=z0;
|
||||
if (first) {
|
||||
if (!(*fp_plot)(aux_data,xx,yy,zz))
|
||||
return FALSE;
|
||||
}
|
||||
if (first && (*fp_plot)(aux_data,xx,yy,zz))
|
||||
result++;
|
||||
for (t=0.0;t<=1.0;t+=s) {
|
||||
nt=1.0-t;
|
||||
t1=t*nt*nt;
|
||||
@@ -803,25 +890,26 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
|
||||
s*=1.1;
|
||||
else {
|
||||
s*=0.9;
|
||||
if (!(*fp_plot)(aux_data,x,y,z))
|
||||
return FALSE;
|
||||
if ((*fp_plot)(aux_data,x,y,z))
|
||||
result++;
|
||||
xx=x;yy=y;zz=z;
|
||||
}
|
||||
}
|
||||
x=ctrl[3].x; y=ctrl[3].y; z=ctrl[3].z;
|
||||
if (xx!=x || yy!=y || zz!=z) {
|
||||
if (!(*fp_plot)(aux_data,x,y,z))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
if ((xx!=x || yy!=y || zz!=z) &&
|
||||
(*fp_plot)(aux_data,x,y,z))
|
||||
result++;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
public I64 BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
{ //2nd order
|
||||
I64 i,j;
|
||||
I64 i,j,result;
|
||||
CD3I32 *c;
|
||||
Bool first=TRUE;
|
||||
if (cnt<3) return TRUE;
|
||||
Bool first;
|
||||
if (cnt<3) return 0;
|
||||
first=TRUE;
|
||||
result=0;
|
||||
if (closed) {
|
||||
cnt++;
|
||||
c=MAlloc(sizeof(CD3I32)*(cnt*2-1));
|
||||
@@ -873,23 +961,22 @@ public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
|
||||
}
|
||||
}
|
||||
for (i=0;i<cnt*2-2;i+=2) {
|
||||
if (!Bezier2(aux_data,&c[i],fp_plot,first)) {
|
||||
Free(c);
|
||||
return FALSE;
|
||||
}
|
||||
result+=Bezier2(aux_data,&c[i],fp_plot,first);
|
||||
first=FALSE;
|
||||
}
|
||||
Free(c);
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
public I64 BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
|
||||
{ //3rd order
|
||||
I64 i,j;
|
||||
I64 i,j,result;
|
||||
F64 x,y,z;
|
||||
CD3I32 *c;
|
||||
Bool first=TRUE;
|
||||
if (cnt<3) return TRUE;
|
||||
Bool first;
|
||||
if (cnt<3) return 0;
|
||||
first=TRUE;
|
||||
result=0;
|
||||
if (closed) {
|
||||
cnt++;
|
||||
c=MAlloc(sizeof(CD3I32)*(cnt*3-2));
|
||||
@@ -963,14 +1050,11 @@ public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
|
||||
}
|
||||
}
|
||||
for (i=0;i<cnt*3-3;i+=3) {
|
||||
if (!Bezier3(aux_data,&c[i],fp_plot,first)) {
|
||||
Free(c);
|
||||
return FALSE;
|
||||
}
|
||||
result+=Bezier3(aux_data,&c[i],fp_plot,first);
|
||||
first=FALSE;
|
||||
}
|
||||
Free(c);
|
||||
return TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
#define CC_LEFT 1
|
||||
|
||||
+27
-78
@@ -141,14 +141,12 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
CHashSrcSym *temph;
|
||||
CHashGeneric *ptr;
|
||||
CHashRep *lst;
|
||||
I64 cnt,i,j,k,size,f=0,
|
||||
dbg_bin_num,indent_bin_num;
|
||||
I64 cnt,i,j,k,size,f=0,dbg_bin_num;
|
||||
U8 buf[512],*buf4,*last_index=StrNew(""),*cur_index;
|
||||
CDoc *doc,*doc1;
|
||||
CDoc *doc;
|
||||
Bool recurse,publics,map,old_preempt=Preempt(OFF);
|
||||
CDocBin *tempb;
|
||||
CDbgInfo *dbg;
|
||||
CIndentInfo *indent;
|
||||
|
||||
GetFFlags(&f,Define("ST_FILE_UTIL_FLAGS"),"+r+p");
|
||||
GetFFlags(&f,Define("ST_FILE_UTIL_FLAGS"),flags);
|
||||
@@ -175,14 +173,14 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
temph=tempht->next_added;
|
||||
while (temph!=tempht) {
|
||||
if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) &&
|
||||
temph->type & mask &&
|
||||
(temph->type & HTF_PUBLIC || !publics))
|
||||
temph->type & mask &&
|
||||
(temph->type & HTF_PUBLIC || !publics))
|
||||
if (!index)
|
||||
cnt++;
|
||||
else
|
||||
if (temph->type&HTG_SRC_SYM &&
|
||||
(cur_index=temph->index))
|
||||
cnt+=HelpIndexCnt(cur_index,index);
|
||||
(cur_index=temph->index))
|
||||
cnt+=HelpIndexCnt(cur_index,index);
|
||||
temph=temph->next_added;
|
||||
}
|
||||
if (recurse)
|
||||
@@ -199,19 +197,19 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
temph=tempht->next_added;
|
||||
while (temph!=tempht) {
|
||||
if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) &&
|
||||
temph->type & mask &&
|
||||
(temph->type & HTF_PUBLIC || !publics))
|
||||
temph->type & mask &&
|
||||
(temph->type & HTF_PUBLIC || !publics))
|
||||
if (!index)
|
||||
lst[j++].h=temph;
|
||||
else
|
||||
if (temph->type&HTG_SRC_SYM &&
|
||||
(cur_index=temph->index))
|
||||
if (k=HelpIndexCnt(cur_index,index)) {
|
||||
while (k--) {
|
||||
lst[j].index=HelpIndexStr(&cur_index,index);
|
||||
lst[j++].h=temph;
|
||||
(cur_index=temph->index))
|
||||
if (k=HelpIndexCnt(cur_index,index)) {
|
||||
while (k--) {
|
||||
lst[j].index=HelpIndexStr(&cur_index,index);
|
||||
lst[j++].h=temph;
|
||||
}
|
||||
}
|
||||
}
|
||||
temph=temph->next_added;
|
||||
}
|
||||
if (recurse)
|
||||
@@ -242,24 +240,19 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
"$$FG,GREEN$$%s$$FG$$\n",cur_index;
|
||||
}
|
||||
}
|
||||
if (index && ptr->type & HTT_HELP_FILE) {
|
||||
if (doc) {
|
||||
doc1=DocRead(ptr->str);
|
||||
DocInsDoc(doc,doc1);
|
||||
DocDel(doc1);
|
||||
} else
|
||||
Type(ptr->str);
|
||||
} else {
|
||||
if (index && ptr->type & HTT_HELP_FILE)
|
||||
DocType(doc,ptr->str);
|
||||
else {
|
||||
if (ptr->type&HTG_SRC_SYM && ptr(CHashSrcSym *)->src_link) {
|
||||
buf4=StrNew(ptr(CHashSrcSym *)->src_link);
|
||||
if (mapfile_drv && StrLen(buf4)>4 && buf[1]==':' && buf4[4]==':')
|
||||
buf4[3]=mapfile_drv;
|
||||
dbg=indent=NULL;
|
||||
dbg=NULL;
|
||||
if (outname && doc && ptr->type & HTT_FUN) {
|
||||
if (dbg=ptr(CHashFun *)->debug) {
|
||||
size=offset(CDbgInfo.body)+
|
||||
sizeof(U8 *)*
|
||||
(dbg->max_line-dbg->min_line+2);
|
||||
sizeof(U8 *)*
|
||||
(dbg->max_line-dbg->min_line+2);
|
||||
if (size>MSize(dbg)) {
|
||||
"Corrupt Map Entry\n";
|
||||
dbg=NULL;
|
||||
@@ -277,46 +270,14 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
dbg=NULL;
|
||||
}
|
||||
}
|
||||
if (indent=ptr(CHashFun *)->indent) {
|
||||
size=offset(CIndentInfo.body)+
|
||||
sizeof(U8)*
|
||||
(indent->max_line-indent->min_line+2);
|
||||
if (size>MSize(indent)) {
|
||||
"Corrupt Indent Entry\n";
|
||||
indent=NULL;
|
||||
} else {
|
||||
if (indent->min_line<=indent->max_line) {
|
||||
tempb=CAlloc(sizeof(CDocBin));
|
||||
tempb->type=DOCBT_INDENTS;
|
||||
tempb->size=size;
|
||||
tempb->data=MAlloc(size);
|
||||
MemCpy(tempb->data,indent,size);
|
||||
indent_bin_num=tempb->num=doc->cur_bin_num++;
|
||||
tempb->use_cnt=1;
|
||||
QueIns(tempb,doc->bin_root.last);
|
||||
} else
|
||||
indent=NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dbg || indent) {
|
||||
if (dbg) {
|
||||
SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$",
|
||||
if (dbg) {
|
||||
SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$",
|
||||
ptr->str,buf4,dbg_bin_num);
|
||||
DocPutS(doc,buf);
|
||||
}
|
||||
if (indent) {
|
||||
if (dbg)
|
||||
SPrintF(buf,"$$LK+BI,\"\",\"%s\",%d$$",
|
||||
ptr->str,indent_bin_num);
|
||||
else
|
||||
SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$",
|
||||
ptr->str,buf4,indent_bin_num);
|
||||
DocPutS(doc,buf);
|
||||
}
|
||||
DocPutS(doc,buf);
|
||||
} else {
|
||||
SPrintF(buf,"$$LK,\"%-26s\",\"%s\"$$",
|
||||
ptr->str,buf4);
|
||||
ptr->str,buf4);
|
||||
if (doc)
|
||||
DocPutS(doc,buf);
|
||||
else
|
||||
@@ -370,7 +331,7 @@ public U0 HashRep(CHashTable *h=NULL,
|
||||
}
|
||||
Free(lst);
|
||||
|
||||
end_hash:
|
||||
end_hash:
|
||||
Preempt(old_preempt);
|
||||
if (doc) {
|
||||
DocBinsValidate(doc);
|
||||
@@ -464,7 +425,7 @@ public U0 DocHelpIndex(CDoc *doc,U8 *index)
|
||||
public U0 PopUpHelpIndex(U8 *index,CTask *parent=NULL)
|
||||
{
|
||||
U8 *buf;
|
||||
buf=MSPrintF("DocHelpIndex(DocCur,\"%s\");View;",index);
|
||||
buf=MSPrintF("DocHelpIndex(DocPut,\"%s\");View;",index);
|
||||
PopUp(buf,parent);
|
||||
Free(buf);
|
||||
}
|
||||
@@ -479,7 +440,6 @@ public U0 MapFileLoad(U8 *filename)
|
||||
CHashSrcSym *temph;
|
||||
I64 i,j,base=0;
|
||||
CDbgInfo *dbg;
|
||||
CIndentInfo *indent;
|
||||
|
||||
FileExtRem(absname);
|
||||
if (absname[1]==':' && StrLen(absname)>2 &&
|
||||
@@ -501,13 +461,12 @@ public U0 MapFileLoad(U8 *filename)
|
||||
|
||||
ptr=temph->src_link;
|
||||
if (ptr[0] && ptr[1] && ptr[2]==':' && ptr[3]==':')
|
||||
ptr[3]=dft_drv;
|
||||
ptr[3]=*sys_acct;
|
||||
|
||||
doc_e->aux_str=NULL;
|
||||
}
|
||||
if (temph->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) {
|
||||
dbg =temph->debug;
|
||||
indent=temph->indent;
|
||||
if (!dbg && doc_e->bin_data && doc_e->bin_data->type==DOCBT_DEBUG_LINES) {
|
||||
if (dbg=doc_e->bin_data->data) {
|
||||
if (doc_e->bin_data->size>MSize(dbg))
|
||||
@@ -523,16 +482,6 @@ public U0 MapFileLoad(U8 *filename)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!indent && doc_e->bin_data && doc_e->bin_data->type==DOCBT_INDENTS) {
|
||||
if (indent=doc_e->bin_data->data) {
|
||||
if (doc_e->bin_data->size>MSize(indent))
|
||||
"Corrupt Indent Entry\n";
|
||||
else {
|
||||
doc_e->bin_data->data=NULL;
|
||||
temph->indent=indent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Free(st);
|
||||
|
||||
+8
-15
@@ -4,7 +4,6 @@
|
||||
U0 UserStartUp()
|
||||
{ //Run each time a user a spawned
|
||||
UseTermDoc;
|
||||
DocCurAttr(WHITE<<4+BLUE);
|
||||
Type("::/TempleOS/Doc/Start.TXT");
|
||||
LBts(&Fs->display_flags,DISPLAYf_SHOW);
|
||||
WinZBufUpdate;
|
||||
@@ -13,8 +12,8 @@ U0 UserStartUp()
|
||||
}
|
||||
|
||||
//This is temporary until defined in $LK-A,"HOME/Adam3fSys.CPP"$.
|
||||
U0 ServantStartUp()
|
||||
{ //Run each time a servant task is spawned.
|
||||
U0 SrvStartUp()
|
||||
{ //Run each time a srv task is spawned.
|
||||
UseTermDoc;
|
||||
LBts(&Fs->display_flags,DISPLAYf_SHOW);
|
||||
WinZBufUpdate;
|
||||
@@ -92,7 +91,7 @@ public Bool AcctRegSetDftEntry(U8 *path,U8 *val,Bool is_adam_entry=FALSE)
|
||||
else
|
||||
Adam("%s",val);
|
||||
}
|
||||
if (IsDrvWritable(dft_drv))
|
||||
if (IsDrvWritable(*sys_acct))
|
||||
DocWrite(sys_registry_doc);
|
||||
result=FALSE;
|
||||
} else
|
||||
@@ -102,7 +101,7 @@ public Bool AcctRegSetDftEntry(U8 *path,U8 *val,Bool is_adam_entry=FALSE)
|
||||
return result;
|
||||
}
|
||||
|
||||
public I64 AcctRegExecuteBranch(U8 *path)
|
||||
public I64 AcctRegExeBranch(U8 *path)
|
||||
{
|
||||
AcctCacheRegistry;
|
||||
return DocTreeBranchExe(sys_registry_doc,path);
|
||||
@@ -119,7 +118,7 @@ public Bool AcctRegWriteBranch(U8 *path,U8 *fmt,...)
|
||||
DocCut(sys_registry_doc,tree_branch,end_indent);
|
||||
DocTreeMake(sys_registry_doc,path);
|
||||
DocPutS(sys_registry_doc,buf);
|
||||
if (IsDrvWritable(dft_drv))
|
||||
if (IsDrvWritable(*sys_acct))
|
||||
DocWrite(sys_registry_doc);
|
||||
if (unlock_doc)
|
||||
DocUnlock(sys_registry_doc);
|
||||
@@ -148,20 +147,14 @@ U0 AcctOneTimePopUp(I64 flag_num,U8 *msg)
|
||||
U0 RegistryInit()
|
||||
{
|
||||
U8 buf[136];
|
||||
Bool existed=FileFind(ACCT_REGISTRY_FILENAME),version_present;
|
||||
Bool version_present;
|
||||
AcctRegSetDftEntry("Adam/TempleOS/SysMsgFlags","sys_msg_flags[0]=0;\n",TRUE);
|
||||
SPrintF(buf,"registry_version=%4.3f;\n",os_version);
|
||||
version_present=AcctRegSetDftEntry("Adam/TempleOS/SysRegVer",buf,TRUE);
|
||||
AcctRegExecuteBranch("Adam");
|
||||
|
||||
//Convert old registries
|
||||
if (existed && !version_present)
|
||||
registry_version=5.10;
|
||||
AcctRegExeBranch("Adam");
|
||||
if (registry_version!=os_version) {
|
||||
if (registry_version<5.101)
|
||||
AcctRegWriteBranch("TempleOS","");
|
||||
AcctRegWriteBranch("Adam/TempleOS/SysRegVer",buf);
|
||||
AcctRegExecuteBranch("Adam");
|
||||
AcctRegExeBranch("Adam");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#help_index "Math/CMathODE;CMathODE"
|
||||
#help_file "::/TempleOS/Doc/ODE"
|
||||
|
||||
//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (5).
|
||||
//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$.
|
||||
|
||||
F64 LowPass1(F64 a,F64 y0,F64 y,F64 dt=1.0)
|
||||
{ //First order low pass filter
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
#help_index "Menus"
|
||||
#help_file "::/TempleOS/Doc/Menus"
|
||||
|
||||
CTask *MenuTask()
|
||||
{
|
||||
CTask *result=sys_focus_task;
|
||||
while (result && !result->cur_menu)
|
||||
result=result->parent_task;
|
||||
return result;
|
||||
}
|
||||
|
||||
CMenuEntry *sys_cur_submenu_entry=NULL;
|
||||
|
||||
public CMenuEntry *MenuSubEntryFind(CMenuEntry *first,U8 *entry_name)
|
||||
@@ -170,7 +178,7 @@ U0 DrawMenu(CDC *dc)
|
||||
CMenu *m;
|
||||
CMenuEntry *tempme,*tempse,*cur_submenu=NULL;
|
||||
U8 *st=NULL;
|
||||
CTask *task=sys_focus_task;
|
||||
CTask *task=MenuTask;
|
||||
I64 i,w,x0,y0,x1=ipx,y1=ipy;
|
||||
if (!TaskValidate(task) || !(m=task->cur_menu) ||
|
||||
m->mu_signature!=MENU_SIGNATURE_VAL) {
|
||||
|
||||
@@ -1,651 +0,0 @@
|
||||
#help_index "Snd/HDAudio"
|
||||
|
||||
#define HD_1_CHAN 0
|
||||
#define HD_2_CHAN 1
|
||||
#define HD_3_CHAN 2
|
||||
#define HD_4_CHAN 3
|
||||
|
||||
#define HD_8_BIT 0
|
||||
#define HD_16_BIT 1
|
||||
#define HD_20_BIT 2
|
||||
#define HD_24_BIT 3
|
||||
#define HD_32_BIT 4
|
||||
|
||||
#define HD_48kHz 0
|
||||
|
||||
#define HD_DFT_OUT_FMT (HD_2_CHAN+HD_24_BIT<<4+HD_48kHz<<8)
|
||||
#define HD_DFT_IN_FMT (HD_2_CHAN+HD_16_BIT<<4+HD_48kHz<<8)
|
||||
|
||||
#define HD_POS_BUF_MULTIPLES 0x1000
|
||||
|
||||
#define HD_CORB_ENTRIES 256
|
||||
#define HD_RIRB_ENTRIES 256
|
||||
#define HD_BDL_ENTRIES 256
|
||||
|
||||
#define HD_GCTL 0x08
|
||||
#define HD_STATESTS 0x0E
|
||||
#define HD_GSTS 0x10
|
||||
#define HD_CORBLBASE 0x40
|
||||
#define HD_CORBUBASE 0x44
|
||||
#define HD_CORBWP 0x48
|
||||
#define HD_CORBRP 0x4A
|
||||
#define HD_CORBCTL 0x4C
|
||||
#define HD_CORBST 0x4D
|
||||
#define HD_RIRBLBASE 0x50
|
||||
#define HD_RIRBUBASE 0x54
|
||||
#define HD_RIRBWP 0x58
|
||||
#define HD_RIRBCTL 0x5C
|
||||
#define HD_RIRBSTS 0x5D
|
||||
|
||||
#define STRCTL 0x00
|
||||
#define STRSTS 0x03
|
||||
#define STRLPIB 0x04
|
||||
#define STRCBL 0x08
|
||||
#define STRLVI 0x0C
|
||||
#define STRFIFOW 0x0E
|
||||
#define STRFIFOS 0x10
|
||||
#define STRFMT 0x12
|
||||
#define STRBDPL 0x18
|
||||
#define STRBDPU 0x1C
|
||||
|
||||
#define ISTR0 0x080
|
||||
#define ISTR1 0x0A0
|
||||
#define ISTR2 0x0C0
|
||||
#define ISTR3 0x0E0
|
||||
#define OSTR0 0x100
|
||||
#define OSTR1 0x120
|
||||
#define OSTR2 0x140
|
||||
#define OSTR3 0x160
|
||||
|
||||
#define VERB_GET_PARAM 0xF0000
|
||||
#define VERB_CONNECT_SELECT_GET 0xF0100
|
||||
#define VERB_CONNECT_SELECT_SET 0x70100
|
||||
#define VERB_GET_CONNECT_LST 0xF0200
|
||||
#define VERB_PROCESS_STATE_GET 0xF0300
|
||||
#define VERB_PROCESS_STATE_SET 0x70300
|
||||
#define VERB_COEFF_INDEX_GET 0xD0000
|
||||
#define VERB_COEFF_INDEX_SET 0x50000
|
||||
#define VERB_PROCESS_COEFF_GET 0xC0000
|
||||
#define VERB_PROCESS_COEFF_SET 0x40000
|
||||
#define VERB_AMPLIFIER_GAIN_GET 0xB0000
|
||||
#define VERB_AMPLIFIER_GAIN_SET 0x30000
|
||||
#define VERB_STREAM_FMT_GET 0xA0000
|
||||
#define VERB_STREAM_FMT_SET 0x20000
|
||||
#define VERB_DIGIT_CONVERT1_GET 0xF0D00
|
||||
#define VERB_DIGIT_CONVERT1_SET 0x70D00
|
||||
#define VERB_DIGIT_CONVERT2_GET 0xF0D00
|
||||
#define VERB_DIGIT_CONVERT2_SET 0x70E00
|
||||
#define VERB_POWER_STATE_GET 0xF0500
|
||||
#define VERB_POWER_STATE_SET 0x70500
|
||||
#define VERB_CHAN_STREAM_ID_GET 0xF0600
|
||||
#define VERB_CHAN_STREAM_ID_SET 0x70600
|
||||
#define VERB_SDI_SELECT_GET 0xF0400
|
||||
#define VERB_SDI_SELECT_SET 0x70400
|
||||
#define VERB_PIN_WIDGET_CTL_GET 0xF0700
|
||||
#define VERB_PIN_WIDGET_CTL_SET 0x70700
|
||||
#define VERB_UNSOL_ENABLE_GET 0xF0800
|
||||
#define VERB_UNSOL_ENABLE_SET 0x70800
|
||||
#define VERB_PIN_SENSE_GET 0xF0900
|
||||
#define VERB_PIN_SENSE_SET 0x70900
|
||||
#define VERB_EAPDBTL_ENABLE_GET 0xF0C00
|
||||
#define VERB_EAPDBTL_ENABLE_SET 0x70C00
|
||||
#define VERB_BEEP_CTL_GET 0xF0A00
|
||||
#define VERB_BEEP_CTL_SET 0x70A00
|
||||
#define VERB_GPI_CTRL0_GET 0xF1000
|
||||
#define VERB_GPI_CTRL0_SET 0x71000
|
||||
#define VERB_GPI_CTRL1_GET 0xF1100
|
||||
#define VERB_GPI_CTRL1_SET 0x71100
|
||||
#define VERB_GPI_CTRL2_GET 0xF1200
|
||||
#define VERB_GPI_CTRL2_SET 0x71200
|
||||
#define VERB_GPI_CTRL3_GET 0xF1300
|
||||
#define VERB_GPI_CTRL3_SET 0x71300
|
||||
#define VERB_GPI_CTRL4_GET 0xF1400
|
||||
#define VERB_GPI_CTRL4_SET 0x71400
|
||||
#define VERB_GPI_CTRL5_GET 0xF1500
|
||||
#define VERB_GPI_CTRL5_SET 0x71500
|
||||
#define VERB_GPI_CTRL6_GET 0xF1600
|
||||
#define VERB_GPI_CTRL6_SET 0x71600
|
||||
#define VERB_GPI_CTRL7_GET 0xF1700
|
||||
#define VERB_GPI_CTRL7_SET 0x71700
|
||||
#define VERB_GPI_CTRL8_GET 0xF1800
|
||||
#define VERB_GPI_CTRL8_SET 0x71800
|
||||
#define VERB_GPI_CTRL9_GET 0xF1900
|
||||
#define VERB_GPI_CTRL9_SET 0x71900
|
||||
#define VERB_GPI_CTRLA_GET 0xF1A00
|
||||
#define VERB_GPI_CTRLA_SET 0x71A00
|
||||
#define VERB_VOL_CTL_GET 0xF0F00
|
||||
#define VERB_VOL_CTL_SET 0x70F00
|
||||
#define VERB_SUB_SYS_ID0_GET 0xF2000
|
||||
#define VERB_SUB_SYS_ID0_SET 0x72000
|
||||
#define VERB_SUB_SYS_ID1_GET 0xF2000
|
||||
#define VERB_SUB_SYS_ID1_SET 0x72100
|
||||
#define VERB_SUB_SYS_ID2_GET 0xF2000
|
||||
#define VERB_SUB_SYS_ID2_SET 0x72200
|
||||
#define VERB_SUB_SYS_ID3_GET 0xF2000
|
||||
#define VERB_SUB_SYS_ID3_SET 0x72300
|
||||
#define VERB_CFG_DFT0_GET 0xF1C00
|
||||
#define VERB_CFG_DFT0_SET 0x71C00
|
||||
#define VERB_CFG_DFT1_GET 0xF1C00
|
||||
#define VERB_CFG_DFT1_SET 0x71D00
|
||||
#define VERB_CFG_DFT2_GET 0xF1C00
|
||||
#define VERB_CFG_DFT2_SET 0x71E00
|
||||
#define VERB_CFG_DFT3_GET 0xF1C00
|
||||
#define VERB_CFG_DFT3_SET 0x71F00
|
||||
#define VERB_STRIPE_CTL_GET 0xF2400
|
||||
#define VERB_STRIPE_CTL_SET 0x72400
|
||||
#define VERB_RST 0x7FF00
|
||||
|
||||
|
||||
//Parameters
|
||||
#define P_VENDOR_ID 0x00
|
||||
#define P_REVISION_ID 0x02
|
||||
#define P_SUBNODE_CNT 0x04
|
||||
#define P_FUN_GRP_TYPE 0x05
|
||||
#define P_AUDIO_FUN_CAP 0x08
|
||||
#define P_AUDIO_WIDGET_CAP 0x09
|
||||
#define P_SAMPLE_SIZE_RATE_CAP 0x0A
|
||||
#define P_STREAM_FMTS 0x0B
|
||||
#define P_PIN_CAP 0x0C
|
||||
#define P_INPUT_AMP_CAP 0x0D
|
||||
#define P_OUTPUT_AMP_CAP 0x12
|
||||
#define P_CONNECT_LST_LEN 0x0E
|
||||
#define P_POWER_STATES 0x0F
|
||||
#define P_PROCESSING_CAP 0x10
|
||||
#define P_GPIO_CNT 0x11
|
||||
#define P_VOL_KNOB_CAP 0x13
|
||||
|
||||
//Function Group Types
|
||||
//00 reserved
|
||||
#define FGT_AUDIO 1
|
||||
#define FGT_VENDOR_MODEM 2
|
||||
//03-7F reserved
|
||||
//80-FF vendor function group
|
||||
|
||||
//Audio Widget Types
|
||||
#define AWT_OUTPUT 0x0
|
||||
#define AWT_INPUT 0x1
|
||||
#define AWT_MIXER 0x2
|
||||
#define AWT_SELECTOR 0x3
|
||||
#define AWT_PIN_COMPLEX 0x4
|
||||
#define AWT_POWER_WIDGET 0x5
|
||||
#define AWT_VOL_KNOB_WIDGET 0x6
|
||||
#define AWT_BEEP_GEN_WIDGET 0x7
|
||||
#define AWT_VENDOR 0xF
|
||||
#define AWT_NODE 0x10
|
||||
DefineLstLoad("ST_AUDIO_WIDGET_TYPES",
|
||||
"Output\0Input\0Mixer\0Selector\0Pin Complex\0"
|
||||
"Power Widget\0Vol Knob\0Beep Gen\0 \0 \0 \0 \0 \0 \0 \0Vendor\0Node\0");
|
||||
|
||||
class CHDBufDesc
|
||||
{
|
||||
I32 *buf;
|
||||
U32 len;
|
||||
U32 ctrl;
|
||||
};
|
||||
|
||||
#define HD_TONES 8
|
||||
|
||||
class CHDAudioCtrl
|
||||
{
|
||||
U8 *bar;
|
||||
I64 cad;
|
||||
U32 *corb;
|
||||
I64 *rirb;
|
||||
CHDBufDesc *ostr0_bdl,*istr0_bdl;
|
||||
SND_OUT_CONTAINER *ostr0_buf[2],*o_temp_buf;
|
||||
SND_IN_CONTAINER *istr0_buf[2];
|
||||
CTask *task;
|
||||
I64 waveform;
|
||||
F64 freq,amp;
|
||||
CSndWaveCtrl *tone_swcs[HD_TONES];
|
||||
U8 rirb_rp,corb_wp;
|
||||
Bool audio_task_started,in_running,out_running;
|
||||
} *_hda=NULL;
|
||||
|
||||
I64 AudioSize()
|
||||
{//$LK,"MemRep","MN:MemRep"$ uses this for Adam Heap
|
||||
I64 result=MSize2(snd_reverb_buf);
|
||||
if (_hda) {
|
||||
result+=MSize2(_hda)+MSize2(_hda->o_temp_buf);
|
||||
/* uncached heap
|
||||
result+=MSize2(_hda->corb)+MSize(_hda->rirb)+
|
||||
MSize2(_hda->ostr0_bdl)+MSize2(_hda->istr0_bdl);
|
||||
for (i=0;i<2;i++)
|
||||
result+=MSize2(_hda->ostr0_buf[i]);
|
||||
for (i=0;i<2;i++)
|
||||
result+=MSize2(_hda->istr0_buf[i]);
|
||||
*/
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 HDSyncCORB()
|
||||
{
|
||||
U16 *wp,*rp;
|
||||
wp =_hda->bar+HD_CORBWP;
|
||||
*wp=_hda->corb_wp;
|
||||
rp =_hda->bar+HD_CORBRP;
|
||||
while (*rp&255!=_hda->corb_wp)
|
||||
Yield;
|
||||
}
|
||||
|
||||
U0 HDWriteCORB(I64 cad,I64 nid,U32 val)
|
||||
{
|
||||
val|=cad<<28+nid<<20;
|
||||
_hda->corb[++_hda->corb_wp]=val;
|
||||
}
|
||||
|
||||
I64 HDSyncRIRB()
|
||||
{
|
||||
U16 *_w;
|
||||
I64 wp,result=0;
|
||||
_w=_hda->bar+HD_RIRBWP;
|
||||
wp=*_w;
|
||||
while (_hda->rirb_rp!=wp)
|
||||
result=_hda->rirb[++_hda->rirb_rp];
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 HDReadRIRB()
|
||||
{
|
||||
U16 *_w;
|
||||
I64 wp,result=0;
|
||||
_w=_hda->bar+HD_RIRBWP;
|
||||
do {
|
||||
Yield;
|
||||
wp=*_w;
|
||||
} while (wp==_hda->rirb_rp);
|
||||
result=_hda->rirb[++_hda->rirb_rp];
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 HDWriteCORBSync(I64 cad,I64 nid,U32 val)
|
||||
{
|
||||
HDSyncCORB;
|
||||
HDSyncRIRB;
|
||||
HDWriteCORB(cad,nid,val);
|
||||
HDSyncCORB;
|
||||
return HDReadRIRB;
|
||||
}
|
||||
|
||||
Bool HDTestCORBSync(I64 cad,I64 nid,U32 val)
|
||||
{ //Checks for a response
|
||||
U16 *_w;
|
||||
U8 wp;
|
||||
|
||||
HDSyncCORB;
|
||||
HDSyncRIRB;
|
||||
HDWriteCORB(cad,nid,val);
|
||||
HDSyncCORB;
|
||||
|
||||
Sleep(1);
|
||||
_w=_hda->bar+HD_RIRBWP;
|
||||
wp=*_w;
|
||||
if (wp==_hda->rirb_rp)
|
||||
return FALSE;
|
||||
HDReadRIRB;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
U0 HDTraverse(I64 cad,I64 nid)
|
||||
{
|
||||
I64 i,len,aud_cap,type;
|
||||
HDWriteCORBSync(cad,nid,VERB_POWER_STATE_SET+0x00); //0 is on
|
||||
HDWriteCORBSync(cad,nid,VERB_EAPDBTL_ENABLE_SET+0x02);
|
||||
HDWriteCORBSync(cad,nid,VERB_PROCESS_STATE_SET+0x02);
|
||||
HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00);
|
||||
aud_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SUBNODE_CNT);
|
||||
if (aud_cap.u16[0]) {
|
||||
for (i=aud_cap.u16[1];i<aud_cap.u16[1]+aud_cap.u16[0];i++)
|
||||
HDTraverse(cad,i);
|
||||
} else {
|
||||
aud_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_AUDIO_WIDGET_CAP);
|
||||
type=aud_cap>>20&15;
|
||||
if (Bt(&aud_cap,8))
|
||||
len=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_CONNECT_LST_LEN)&127;
|
||||
else
|
||||
len=0;
|
||||
HDWriteCORBSync(cad,nid,VERB_AMPLIFIER_GAIN_SET+0xF07F); //set I/O amp #0
|
||||
for (i=1;i<len;i++)
|
||||
HDWriteCORBSync(cad,nid,VERB_AMPLIFIER_GAIN_SET+0x7080+i<<8); //Set IN amps to mute
|
||||
switch (type) {
|
||||
case AWT_OUTPUT:
|
||||
if (FALSE) //if disabled
|
||||
HDWriteCORBSync(cad,nid,VERB_CHAN_STREAM_ID_SET+0x00);
|
||||
else
|
||||
HDWriteCORBSync(cad,nid,VERB_CHAN_STREAM_ID_SET+0x10);
|
||||
HDWriteCORBSync(cad,nid,VERB_STREAM_FMT_SET+HD_DFT_OUT_FMT);
|
||||
HDWriteCORBSync(cad,nid,VERB_PROCESS_STATE_SET+0x01);
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
if (TRUE) //if disabled
|
||||
HDWriteCORBSync(cad,nid,VERB_CHAN_STREAM_ID_SET+0x00);
|
||||
else
|
||||
HDWriteCORBSync(cad,nid,VERB_CHAN_STREAM_ID_SET+0x20);
|
||||
HDWriteCORBSync(cad,nid,VERB_STREAM_FMT_SET+HD_DFT_IN_FMT);
|
||||
HDWriteCORBSync(cad,nid,VERB_PROCESS_STATE_SET+0x01);
|
||||
break;
|
||||
case AWT_PIN_COMPLEX:
|
||||
HDWriteCORBSync(cad,nid,VERB_PIN_WIDGET_CTL_SET+0xE2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDRun(Bool in,Bool out)
|
||||
{
|
||||
U32 *_d;
|
||||
if (_hda->bar) {
|
||||
if (out) {
|
||||
_d=_hda->bar+OSTR0+STRCTL;
|
||||
*_d=0x100002;
|
||||
_hda->out_running=TRUE;
|
||||
}
|
||||
if (in) {
|
||||
_d=_hda->bar+ISTR0+STRCTL;
|
||||
*_d=0x200002;
|
||||
_hda->in_running=TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDStop(Bool in,Bool out)
|
||||
{
|
||||
U32 *_d;
|
||||
if (_hda->bar) {
|
||||
if (out) {
|
||||
_d=_hda->bar+OSTR0+STRCTL;
|
||||
*_d=0;
|
||||
_hda->out_running=FALSE;
|
||||
}
|
||||
if (in) {
|
||||
_d=_hda->bar+ISTR0+STRCTL;
|
||||
*_d=0;
|
||||
_hda->in_running=FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDSnd(F64 freq,I64 waveform=WF_SQUARE,F64 amp=1.0)
|
||||
{
|
||||
_hda->waveform=waveform;
|
||||
_hda->amp=amp;
|
||||
_hda->freq=freq;
|
||||
}
|
||||
|
||||
U0 HDFillBuf(SND_OUT_CONTAINER *buf,I64)
|
||||
{
|
||||
I64 i,size=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER);
|
||||
if (!_hda->o_temp_buf)
|
||||
_hda->o_temp_buf=AMAlloc(size);
|
||||
MemSet(_hda->o_temp_buf,0,size);
|
||||
for (i=0;i<HD_TONES;i++)
|
||||
SndWaveAddBuf(_hda->tone_swcs[i],_hda->o_temp_buf,SND_BUF_LEN/SND_OCHANNELS,_hda->freq,_hda->waveform,snd_vol*_hda->amp);
|
||||
MemCpy(buf,_hda->o_temp_buf,size);
|
||||
}
|
||||
|
||||
U0 HDAudioTaskEndCB()
|
||||
{
|
||||
I64 i;
|
||||
HDStop(FALSE,TRUE);
|
||||
fp_snd=NULL;
|
||||
for (i=0;i<HD_TONES;i++) {
|
||||
SndWaveCtrlDel(_hda->tone_swcs[i]);
|
||||
_hda->tone_swcs[i]=NULL;
|
||||
}
|
||||
Exit;
|
||||
}
|
||||
|
||||
public U0 HDTonesInit()
|
||||
{
|
||||
I64 i;
|
||||
if (_hda) {
|
||||
for (i=0;i<HD_TONES;i++) {
|
||||
_hda->tone_swcs[i]->freq_multiplier=1.0;
|
||||
_hda->tone_swcs[i]->amp_multiplier=0;
|
||||
}
|
||||
_hda->tone_swcs[0]->amp_multiplier=1.0;
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDAudioTask(I64)
|
||||
{
|
||||
//I didn't feel like messing around with PCI interrupts
|
||||
//so this task polls every millisecond to know when to
|
||||
//switch buffers.
|
||||
I64 i,next_obuf_trigger=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER)/2,
|
||||
obuf_rollover=0,
|
||||
next_ibuf_trigger=SND_BUF_LEN*sizeof(SND_IN_CONTAINER),
|
||||
ibuf_rollover=0;
|
||||
U32 *pos_in_obuf=_hda->bar+OSTR0+STRLPIB,
|
||||
*pos_in_ibuf=_hda->bar+ISTR0+STRLPIB;
|
||||
Fs->task_end_cb=&HDAudioTaskEndCB;
|
||||
for (i=0;i<HD_TONES;i++)
|
||||
_hda->tone_swcs[i]=SndWaveCtrlNew;
|
||||
HDTonesInit;
|
||||
_hda->freq=0;
|
||||
Snd(0);
|
||||
fp_snd=&HDSnd;
|
||||
fp_snd_fill_buf=&HDFillBuf;
|
||||
fp_snd_copy_buf=NULL;
|
||||
if (!IsSysDeterministic)
|
||||
Preempt(ON);
|
||||
snd_obuf_num=1;
|
||||
snd_ibuf_num=1;
|
||||
HDRun(FALSE,TRUE);
|
||||
_hda->audio_task_started=TRUE; //This flag is probably not necessary
|
||||
while (TRUE) {
|
||||
if (next_obuf_trigger-obuf_rollover<=*pos_in_obuf<next_obuf_trigger-obuf_rollover+(HD_POS_BUF_MULTIPLES-1)*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER)) {
|
||||
next_obuf_trigger+=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER);
|
||||
if (next_obuf_trigger-obuf_rollover>=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER))
|
||||
obuf_rollover+=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER);
|
||||
if (fp_snd_fill_buf) {
|
||||
LBts(&snd_flags,Sf_FILLING_OUT);
|
||||
(*fp_snd_fill_buf)(_hda->ostr0_buf[snd_obuf_num&1],snd_obuf_num);
|
||||
if (IsMute)
|
||||
MemSet(_hda->ostr0_buf[snd_obuf_num&1],0,SND_BUF_LEN*sizeof(SND_OUT_CONTAINER));
|
||||
else if (snd_reverb_intensity &&
|
||||
0<snd_reverb_delay<10.0)
|
||||
SndReverb(_hda->ostr0_buf[snd_obuf_num&1],snd_obuf_num);
|
||||
LBtr(&snd_flags,Sf_FILLING_OUT);
|
||||
}
|
||||
snd_obuf_num++;
|
||||
}
|
||||
if (next_ibuf_trigger-ibuf_rollover<=*pos_in_ibuf<next_ibuf_trigger-ibuf_rollover+(HD_POS_BUF_MULTIPLES-1)*SND_BUF_LEN*sizeof(SND_IN_CONTAINER)) {
|
||||
next_ibuf_trigger+=SND_BUF_LEN*sizeof(SND_IN_CONTAINER);
|
||||
if (next_ibuf_trigger-ibuf_rollover>=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER))
|
||||
ibuf_rollover+=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER);
|
||||
if (fp_snd_copy_buf)
|
||||
(*fp_snd_copy_buf)(_hda->istr0_buf[snd_obuf_num&1],snd_ibuf_num);
|
||||
snd_ibuf_num++;
|
||||
}
|
||||
Sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDRst()
|
||||
{
|
||||
U32 d,*_d;
|
||||
HDStop(TRUE,TRUE);
|
||||
_d=_hda->bar+HD_GCTL;
|
||||
*_d=0; //rst
|
||||
do {
|
||||
Sleep(1);
|
||||
d=*_d;
|
||||
} while (d & 1);
|
||||
*_d=1;
|
||||
do {
|
||||
Sleep(1);
|
||||
d=*_d;
|
||||
} while (!(d & 1));
|
||||
Sleep(1);
|
||||
}
|
||||
|
||||
public U0 HDAudioEnd(Bool rst=TRUE)
|
||||
{
|
||||
snd_dev=SD_PC_SPEAKER;
|
||||
if (_hda && _hda->bar) {
|
||||
Kill(_hda->task);
|
||||
_hda->task=NULL;
|
||||
if (rst)
|
||||
HDRst;
|
||||
Free(_hda->corb);
|
||||
Free(_hda->rirb);
|
||||
Free(_hda->o_temp_buf);
|
||||
Free(_hda->ostr0_buf[0]);
|
||||
Free(_hda->ostr0_buf[1]);
|
||||
Free(_hda->istr0_buf[0]);
|
||||
Free(_hda->istr0_buf[1]);
|
||||
Free(_hda->ostr0_bdl);
|
||||
Free(_hda->istr0_bdl);
|
||||
Mem32DevFree(_hda->bar);
|
||||
Free(_hda);
|
||||
_hda=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
public Bool HDAudioInit(I64 hd_bus,I64 hd_dev,I64 hd_fun)
|
||||
{
|
||||
I64 i;
|
||||
U32 *_d;
|
||||
U16 w,*_w;
|
||||
U8 *_b;
|
||||
if (_hda)
|
||||
HDAudioEnd;
|
||||
if (PCIReadU16(hd_bus,hd_dev,hd_fun,0)==0x8086 &&
|
||||
(_hda=ACAlloc(sizeof(CHDAudioCtrl))) &&
|
||||
(_hda->bar=Mem32DevAlloc(0x4000,0x4000)) ) {
|
||||
PCIWriteU32(hd_bus,hd_dev,hd_fun,0x14,_hda->bar(I64).u32[1]);
|
||||
PCIWriteU32(hd_bus,hd_dev,hd_fun,0x10,_hda->bar(I64).u32[0]);
|
||||
PCIWriteU16(hd_bus,hd_dev,hd_fun,0x04,
|
||||
PCIReadU16(hd_bus,hd_dev,hd_fun,0x04)|0x406);
|
||||
|
||||
HDRst;
|
||||
|
||||
_hda->corb=CAllocAligned(HD_CORB_ENTRIES*sizeof(U32),128,sys_uncached_heap);
|
||||
_d=_hda->bar+HD_CORBLBASE;
|
||||
*_d=_hda->corb(I64).u32[0];
|
||||
_d=_hda->bar+HD_CORBUBASE;
|
||||
*_d=_hda->corb(I64).u32[1];
|
||||
|
||||
_hda->rirb=CAllocAligned(HD_RIRB_ENTRIES*sizeof(I64),128,sys_uncached_heap);
|
||||
_d=_hda->bar+HD_RIRBLBASE;
|
||||
*_d=_hda->rirb(I64).u32[0];
|
||||
_d=_hda->bar+HD_RIRBUBASE;
|
||||
*_d=_hda->rirb(I64).u32[1];
|
||||
|
||||
_w=_hda->bar+HD_CORBRP;
|
||||
*_w=0x8000; //Rst read ptr
|
||||
do {
|
||||
Yield;
|
||||
w=*_w;
|
||||
} while (!(w&0x8000));
|
||||
*_w=0x0000; //Rst read ptr
|
||||
do {
|
||||
Yield;
|
||||
w=*_w;
|
||||
} while (w&0x8000);
|
||||
|
||||
_w=_hda->bar+HD_RIRBWP;
|
||||
*_w=0x8000; //Rst write ptr
|
||||
|
||||
_b=_hda->bar+HD_CORBCTL;
|
||||
*_b=0x02; //Run
|
||||
_b=_hda->bar+HD_RIRBCTL;
|
||||
*_b=0x02; //Run
|
||||
|
||||
_w=_hda->bar+HD_CORBWP;
|
||||
_hda->corb_wp=*_w;
|
||||
_w=_hda->bar+HD_RIRBWP;
|
||||
_hda->rirb_rp=*_w;
|
||||
|
||||
_hda->ostr0_bdl =CAllocAligned(HD_BDL_ENTRIES*sizeof(CHDBufDesc),128,sys_uncached_heap);
|
||||
_d=_hda->bar+OSTR0+STRBDPL;
|
||||
*_d=_hda->ostr0_bdl(I64).u32[0];
|
||||
_d=_hda->bar+OSTR0+STRBDPU;
|
||||
*_d=_hda->ostr0_bdl(I64).u32[1];
|
||||
for (i=0;i<2;i++) {
|
||||
_hda->ostr0_bdl[i].buf=_hda->ostr0_buf[i]=CAllocAligned(SND_BUF_LEN*sizeof(SND_OUT_CONTAINER),128,sys_uncached_heap);
|
||||
_hda->ostr0_bdl[i].len=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER);
|
||||
_hda->ostr0_bdl[i].ctrl=1;
|
||||
}
|
||||
|
||||
_hda->istr0_bdl =CAllocAligned(HD_BDL_ENTRIES*sizeof(CHDBufDesc),128,sys_uncached_heap);
|
||||
_d=_hda->bar+ISTR0+STRBDPL;
|
||||
*_d=_hda->istr0_bdl(I64).u32[0];
|
||||
_d=_hda->bar+ISTR0+STRBDPU;
|
||||
*_d=_hda->istr0_bdl(I64).u32[1];
|
||||
for (i=0;i<2;i++) {
|
||||
_hda->istr0_bdl[i].buf=_hda->istr0_buf[i]=CAllocAligned(SND_BUF_LEN*sizeof(SND_IN_CONTAINER),128,sys_uncached_heap);
|
||||
_hda->istr0_bdl[i].len=SND_BUF_LEN*sizeof(SND_IN_CONTAINER);
|
||||
_hda->istr0_bdl[i].ctrl=1;
|
||||
}
|
||||
|
||||
_w=_hda->bar+HD_STATESTS;
|
||||
w=*_w;
|
||||
while (w) {
|
||||
_hda->cad=Bsf(w);
|
||||
if (HDTestCORBSync(_hda->cad,0,VERB_GET_PARAM+P_SUBNODE_CNT)) {
|
||||
HDTraverse(_hda->cad,0);
|
||||
|
||||
_d=_hda->bar+OSTR0+STRLPIB;
|
||||
*_d=0;
|
||||
_d=_hda->bar+OSTR0+STRCBL;
|
||||
*_d=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER);
|
||||
_w=_hda->bar+OSTR0+STRLVI;
|
||||
*_w=1; //last valid index
|
||||
_w=_hda->bar+OSTR0+STRFMT;
|
||||
*_w=HD_DFT_OUT_FMT;
|
||||
|
||||
_d=_hda->bar+ISTR0+STRLPIB;
|
||||
*_d=0;
|
||||
_d=_hda->bar+ISTR0+STRCBL;
|
||||
*_d=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER);
|
||||
_w=_hda->bar+ISTR0+STRLVI;
|
||||
*_w=1; //last valid index
|
||||
_w=_hda->bar+ISTR0+STRFMT;
|
||||
*_w=HD_DFT_IN_FMT;
|
||||
|
||||
LBts(&sys_semas[SYS_SEMA_SND],0); //turn off until cfg completed
|
||||
LBtr(&snd_flags,Sf_FILLING_OUT);
|
||||
_hda->audio_task_started=FALSE;
|
||||
if (mp_cnt>1)
|
||||
_hda->task=MPSpawn(&HDAudioTask,NULL,"HD Audio");
|
||||
else
|
||||
_hda->task=Spawn(&HDAudioTask,NULL,"HD Audio");
|
||||
while (!_hda->audio_task_started)
|
||||
Yield;
|
||||
snd_dev=SD_HD_AUDIO;
|
||||
return TRUE;
|
||||
}
|
||||
Btr(&w,_hda->cad);
|
||||
}
|
||||
HDAudioEnd(FALSE);
|
||||
} else {
|
||||
Free(_hda);
|
||||
_hda=NULL;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Bool HDAudioScan()
|
||||
{
|
||||
I64 i=-1,j;
|
||||
while (TRUE) {
|
||||
j=PCIClassFind(0x040300,++i);
|
||||
if (j<0)
|
||||
return FALSE;
|
||||
|
||||
//!!! Remove the following line. !!!
|
||||
if (j.u8[1]!=0x1B) break;
|
||||
//!!! We got problems with $LK,"0xF0000000","FF:::/TempleOS/Kernel/Memory.CPP,0xF000000"$ !!!
|
||||
|
||||
if (HDAudioInit(j.u8[2],j.u8[1],j.u8[0]))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
HDAudioScan;
|
||||
|
||||
//$BK,1$Run $LK-A,"::/TempleOS/Adam/Snd/HDCfg.CPP"$.$BK,0$
|
||||
#help_index ""
|
||||
@@ -1,638 +0,0 @@
|
||||
#define MAX_CONNECTS 16
|
||||
|
||||
class MyMass:CMass
|
||||
{
|
||||
F64 radius;
|
||||
U8 nid,type,num_connects,cur_connect;
|
||||
U32 audio_widget_capabilities;
|
||||
U8 connect_lst[MAX_CONNECTS];
|
||||
U8 gain_lst[MAX_CONNECTS];
|
||||
U32 pin_capabilities,pin_sense,
|
||||
pcm_size_rates,
|
||||
in_amp_cap,out_amp_cap;
|
||||
U8 pin_widget_ctl;
|
||||
Bool disabled;
|
||||
};
|
||||
|
||||
class MySpring:CSpring
|
||||
{
|
||||
I64 color;
|
||||
};
|
||||
|
||||
CMathODE *ode=NULL;
|
||||
|
||||
#define BORDER 10
|
||||
|
||||
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
Bool old_suspend,old_preempt;
|
||||
I16 *buf;
|
||||
I64 i,cxx,cyy,
|
||||
cy=task->win_pixel_height>>1;
|
||||
F64 dx,dy,d;
|
||||
MyMass *tempm;
|
||||
MySpring *temps;
|
||||
|
||||
old_preempt=Preempt(OFF);
|
||||
old_suspend=Suspend(task);
|
||||
temps=ode->next_spring;
|
||||
while (temps!=&ode->next_spring) {
|
||||
dc->color=temps->color;
|
||||
GrLine(dc,temps->end1->x,temps->end1->y,
|
||||
temps->end2->x,temps->end2->y);
|
||||
cxx=(temps->end1->x+temps->end2->x)/2;
|
||||
cyy=(temps->end1->y+temps->end2->y)/2;
|
||||
dx=temps->end1->x-temps->end2->x;
|
||||
dy=temps->end1->y-temps->end2->y;
|
||||
d=Sqrt(dx*dx+dy*dy);
|
||||
dx/=d;
|
||||
dy/=d;
|
||||
GrLine(dc,cxx,cyy,cxx+3.0*dy-3.0*dx,cyy-3.0*dx-3.0*dy);
|
||||
GrLine(dc,cxx,cyy,cxx-3.0*dy-3.0*dx,cyy+3.0*dx-3.0*dy);
|
||||
temps=temps->next;
|
||||
}
|
||||
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
if (tempm->disabled)
|
||||
dc->color=BLUE;
|
||||
else
|
||||
dc->color=LTBLUE;
|
||||
GrCircle(dc,tempm->x,tempm->y,tempm->radius);
|
||||
GrPrintF(dc,tempm->x,tempm->y-FONT_HEIGHT/2,"%02X %3tZ",
|
||||
tempm->nid,tempm->type,
|
||||
"ST_AUDIO_WIDGET_TYPES");
|
||||
tempm=tempm->next;
|
||||
}
|
||||
Suspend(task,old_suspend);
|
||||
Preempt(old_preempt);
|
||||
dc->color=BLUE;
|
||||
buf=_hda->istr0_buf[0];
|
||||
for (i=0;i<SND_BUF_LEN;i++)
|
||||
GrPlot(dc,i*task->win_pixel_width/SND_BUF_LEN,
|
||||
cy-buf[i]*cy/MAX_I16);
|
||||
}
|
||||
|
||||
|
||||
U0 MyDerivative(CMathODE *ode,F64,COrder2D3 *,COrder2D3 *)
|
||||
{
|
||||
//The forces due to springs and drag are
|
||||
//automatically handled by the
|
||||
//ode code. We can add new forces
|
||||
//here.
|
||||
CTask *task=ode->win_task;
|
||||
I64 h=task->win_pixel_width,v=task->win_pixel_height;
|
||||
F64 d,dd;
|
||||
CD3 p;
|
||||
MyMass *tempm1,*tempm2;
|
||||
|
||||
tempm1=ode->next_mass;
|
||||
while (tempm1!=&ode->next_mass) {
|
||||
tempm2=tempm1->next;
|
||||
while (tempm2!=&ode->next_mass) {
|
||||
D3Sub(&tempm2->state->x,&tempm1->state->x,&p);
|
||||
dd=D3SqrNorm(&p);
|
||||
if (dd<=Sqr(tempm1->radius+tempm2->radius)) {
|
||||
d=Sqrt(dd)+0.0001;
|
||||
dd=10.0*Sqr(Sqr(Sqr(tempm1->radius+tempm2->radius)-dd));
|
||||
D3MulEqu(&p,dd/d);
|
||||
D3AddEqu(&tempm2->DstateDt->DxDt,&p);
|
||||
D3SubEqu(&tempm1->DstateDt->DxDt,&p);
|
||||
} else {
|
||||
D3MulEqu(&p,100000.0/dd);
|
||||
D3AddEqu(&tempm2->DstateDt->DxDt,&p);
|
||||
D3SubEqu(&tempm1->DstateDt->DxDt,&p);
|
||||
}
|
||||
tempm2=tempm2->next;
|
||||
}
|
||||
if (tempm1->state->x<BORDER)
|
||||
tempm1->DstateDt->DxDt+=1000*Sqr(tempm1->state->x-BORDER);
|
||||
if (tempm1->state->y<BORDER)
|
||||
tempm1->DstateDt->DyDt+=1000*Sqr(tempm1->state->y-BORDER);
|
||||
if (tempm1->state->x>h-BORDER-FONT_WIDTH*6)
|
||||
tempm1->DstateDt->DxDt-=1000*Sqr(tempm1->state->x-(h-BORDER-FONT_WIDTH*6));
|
||||
if (tempm1->state->y>v-BORDER)
|
||||
tempm1->DstateDt->DyDt-=1000*Sqr(tempm1->state->y-(v-BORDER));
|
||||
tempm1=tempm1->next;
|
||||
}
|
||||
}
|
||||
|
||||
MyMass *PlaceMass(I64 nid)
|
||||
{
|
||||
MyMass *tempm=CAlloc(sizeof(MyMass));
|
||||
tempm->mass=1.0;
|
||||
tempm->drag_profile_factor=100.0;
|
||||
tempm->radius=5;
|
||||
tempm->nid=nid;
|
||||
tempm->gain_lst[0]=0x7F;
|
||||
MemSet(tempm->gain_lst+1,0x80,(MAX_CONNECTS-1)*sizeof(U8));
|
||||
QueIns(tempm,ode->last_mass);
|
||||
return tempm;
|
||||
}
|
||||
|
||||
MyMass *FindMassByNID(I64 nid)
|
||||
{
|
||||
MyMass *tempm;
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
if (tempm->nid==nid)
|
||||
return tempm;
|
||||
tempm=tempm->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MyMass *FindMassByXY(I64 x,I64 y)
|
||||
{
|
||||
I64 dd,best_dd=MAX_I64;
|
||||
MyMass *tempm,*result=NULL;
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
dd=SqrI64(tempm->x-x)+SqrI64(tempm->y-y);
|
||||
if (dd<best_dd) {
|
||||
result=tempm;
|
||||
best_dd=dd;
|
||||
}
|
||||
tempm=tempm->next;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 FindConnectIndex(MyMass *tempm,I64 nid)
|
||||
{
|
||||
I64 i;
|
||||
for (i=0;i<tempm->num_connects;i++)
|
||||
if (tempm->connect_lst[i]==nid)
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
MySpring *PlaceSpring(MyMass *tempm1,MyMass *tempm2)
|
||||
{
|
||||
MySpring *temps=CAlloc(sizeof(MySpring));
|
||||
temps->end1=tempm1;
|
||||
temps->end2=tempm2;
|
||||
temps->constant=10;
|
||||
temps->rest_len=0;
|
||||
temps->color=LTGRAY;
|
||||
QueIns(temps,ode->last_spring);
|
||||
return temps;
|
||||
}
|
||||
|
||||
U0 RedoSprings()
|
||||
{
|
||||
I64 i,k;
|
||||
MyMass *tempm,*tempm1;
|
||||
MySpring *temps;
|
||||
|
||||
QueDel(&ode->next_spring,TRUE);
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
for (i=0;i<tempm->num_connects;i++) {
|
||||
if ((k=tempm->connect_lst[i]) &&
|
||||
(tempm1=FindMassByNID(k)) ) {
|
||||
temps=PlaceSpring(tempm,tempm1);
|
||||
switch (tempm->type) {
|
||||
case AWT_MIXER:
|
||||
if (!(tempm->gain_lst[i]&0x80)) { //If not mute
|
||||
temps->color=GREEN;
|
||||
temps->constant=100;
|
||||
}
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
case AWT_SELECTOR:
|
||||
case AWT_PIN_COMPLEX:
|
||||
case AWT_VENDOR:
|
||||
if (i==tempm->cur_connect) {
|
||||
temps->color=RED;
|
||||
temps->constant=100;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tempm=tempm->next;
|
||||
}
|
||||
}
|
||||
|
||||
U0 Init()
|
||||
{
|
||||
ode=ODENew(0,1e-4,ODEF_HAS_MASSES);
|
||||
ode->derivative=&MyDerivative;
|
||||
ode->drag_v2=0.002;
|
||||
ode->drag_v3=0.00001;
|
||||
ode->acceleration_limit=5e3;
|
||||
|
||||
QueIns(ode,Fs->last_ode);
|
||||
}
|
||||
|
||||
U0 CleanUp()
|
||||
{
|
||||
QueRem(ode);
|
||||
QueDel(&ode->next_mass,TRUE);
|
||||
QueDel(&ode->next_spring,TRUE);
|
||||
ODEDel(ode);
|
||||
}
|
||||
|
||||
U0 HDCfgConnectLst(MyMass *tempm,I64 cad,I64 nid)
|
||||
{
|
||||
I64 i,j,connection_lst_len;
|
||||
j=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_CONNECT_LST_LEN);
|
||||
connection_lst_len=j&127;
|
||||
if (j&128) { //Long form?
|
||||
for (i=0;i<connection_lst_len;i+=2) {
|
||||
j=HDWriteCORBSync(cad,nid,VERB_GET_CONNECT_LST+i);
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u16[0];
|
||||
if (i+1<connection_lst_len)
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u16[1];
|
||||
}
|
||||
} else {
|
||||
for (i=0;i<connection_lst_len;i+=4) {
|
||||
j=HDWriteCORBSync(cad,nid,VERB_GET_CONNECT_LST+i);
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u8[0];
|
||||
if (i+1<connection_lst_len)
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u8[1];
|
||||
if (i+2<connection_lst_len)
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u8[2];
|
||||
if (i+3<connection_lst_len)
|
||||
tempm->connect_lst[tempm->num_connects++]=j.u8[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDCfgTraverse(I64 cad,I64 nid)
|
||||
{
|
||||
I64 i,j;
|
||||
MyMass *tempm=PlaceMass(nid);
|
||||
j=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SUBNODE_CNT);
|
||||
if (j.u16[0]) {
|
||||
tempm->type=AWT_NODE;
|
||||
for (i=j.u16[1];i<j.u16[1]+j.u16[0];i++)
|
||||
HDCfgTraverse(cad,i);
|
||||
} else {
|
||||
tempm->audio_widget_capabilities=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_AUDIO_WIDGET_CAP);
|
||||
tempm->pcm_size_rates=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SAMPLE_SIZE_RATE_CAP);
|
||||
tempm->in_amp_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_INPUT_AMP_CAP);
|
||||
tempm->out_amp_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_OUTPUT_AMP_CAP);
|
||||
tempm->type=tempm->audio_widget_capabilities>>20&15;
|
||||
switch (tempm->type) {
|
||||
case AWT_PIN_COMPLEX:
|
||||
tempm->pin_widget_ctl=HDWriteCORBSync(cad,nid,VERB_PIN_WIDGET_CTL_GET);
|
||||
tempm->pin_capabilities=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_PIN_CAP);
|
||||
if (Bt(&tempm->pin_capabilities,0) ||
|
||||
Bt(&tempm->pin_capabilities,2))
|
||||
tempm->pin_sense=HDWriteCORBSync(cad,nid,VERB_PIN_SENSE_GET);
|
||||
HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00);
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
tempm->disabled=TRUE;
|
||||
case AWT_SELECTOR:
|
||||
case AWT_VENDOR:
|
||||
HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00);
|
||||
break;
|
||||
}
|
||||
if (Bt(&tempm->audio_widget_capabilities,8))
|
||||
HDCfgConnectLst(tempm,cad,nid);
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDCfgRandomizeXY()
|
||||
{
|
||||
I64 h=Fs->win_pixel_width,v=Fs->win_pixel_height;
|
||||
MyMass *tempm;
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
tempm->x=RandU32%(h-2*BORDER-FONT_WIDTH*6)+BORDER;
|
||||
tempm->y=RandU32%(v-2*BORDER)+BORDER;
|
||||
tempm=tempm->next;
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDCfgPopUpInfoTask(MyMass *tempm)
|
||||
{
|
||||
I64 i;
|
||||
"$$FG,RED$$NID:$$FG$$0x%02X $$FG,RED$$Type:$$FG$$%Z\n",
|
||||
tempm->nid,tempm->type,"ST_AUDIO_WIDGET_TYPES";
|
||||
|
||||
i=tempm->audio_widget_capabilities;
|
||||
"\n$$FG,RED$$Audio Widget Capabilities:$$FG$$\n";
|
||||
if (Bt(&i,0))
|
||||
"Stereo, ";
|
||||
if (Bt(&i,1))
|
||||
"In Amp, ";
|
||||
if (Bt(&i,2))
|
||||
"Out Amp, ";
|
||||
if (Bt(&i,3))
|
||||
"Amp Override, ";
|
||||
if (Bt(&i,4))
|
||||
"Fmt Override, ";
|
||||
if (Bt(&i,5))
|
||||
"Stripe, ";
|
||||
if (Bt(&i,6))
|
||||
"Proc Wgt, ";
|
||||
if (Bt(&i,7))
|
||||
"Unsolicited, ";
|
||||
if (Bt(&i,8))
|
||||
"Cnt Lst, ";
|
||||
if (Bt(&i,9))
|
||||
"Digital, ";
|
||||
if (Bt(&i,10))
|
||||
"Power Ctrl, ";
|
||||
if (Bt(&i,11))
|
||||
"Left/Right Swap, ";
|
||||
"Delay:%d\n",i.u16[1]&0xF;
|
||||
|
||||
i=tempm->in_amp_cap;
|
||||
"\n$$FG,RED$$Input Amp Capabilities:$$FG$$\n"
|
||||
"Offset:0x%02X Steps:0x%02X StepSize:%5.2fdB Mutable:%d\n",
|
||||
i&127,i.u8[1]&127+1,0.25*(i.u16[1]&127),Bt(&i,31);
|
||||
|
||||
i=tempm->out_amp_cap;
|
||||
"\n$$FG,RED$$Output Amp Capabilities:$$FG$$\n"
|
||||
"Offset:0x%02X Steps:0x%02X StepSize:%5.2fdB Mutable:%d\n",
|
||||
i&127,i.u8[1]&127+1,0.25*(i.u16[1]&127),Bt(&i,31);
|
||||
|
||||
"\n$$FG,RED$$Size Rates Capabilities:$$FG$$\n";
|
||||
for (i=0;i<21;i++)
|
||||
if (Bt(&tempm->pcm_size_rates,i))
|
||||
"%z",i,
|
||||
" 8.0kHz\0 11.025kHz\0 16.0kHz\0 22.05kHz\0"
|
||||
" 32.0kHz\0 44.1kHz\0 48.0kHz\0 88.2kHz\0"
|
||||
" 96.0kHz\0 176.4kHz\0 192.0kHz\0 384kHz\0"
|
||||
" \0 \0 \0 \0"
|
||||
" 8Bit\0 16bit\0 20Bit\0 24Bit\0 32Bit\0";
|
||||
NewLine;
|
||||
|
||||
|
||||
"\n$$FG,RED$$Connection Lst:$$FG$$\n";
|
||||
for (i=0;i<tempm->num_connects;i++)
|
||||
"%02X,",tempm->connect_lst[i];
|
||||
NewLine;
|
||||
|
||||
"\n$$FG,RED$$Gain Lst:$$FG$$\n";
|
||||
for (i=0;i<tempm->num_connects;i++)
|
||||
"%02X,",tempm->gain_lst[i];
|
||||
NewLine;
|
||||
|
||||
switch (tempm->type) {
|
||||
case AWT_PIN_COMPLEX:
|
||||
"\n$$FG,RED$$Pin Capabilities:$$FG$$\n";
|
||||
i=tempm->pin_capabilities;
|
||||
if (Bt(&i,0))
|
||||
"Impedance Sense, ";
|
||||
if (Bt(&i,1))
|
||||
"Trigger Required, ";
|
||||
if (Bt(&i,2))
|
||||
"Presence Detect, ";
|
||||
if (Bt(&i,3))
|
||||
"Headphone Drive, ";
|
||||
if (Bt(&i,4))
|
||||
"Output, ";
|
||||
if (Bt(&i,5))
|
||||
"Input, ";
|
||||
if (Bt(&i,6))
|
||||
"Balanced, ";
|
||||
if (Bt(&i,16))
|
||||
"EAPD, ";
|
||||
"Vref:%02X\n\n",i.u8[1];
|
||||
if (Bt(&tempm->pin_capabilities,0) ||
|
||||
Bt(&tempm->pin_capabilities,2))
|
||||
tempm->pin_sense=HDWriteCORBSync(_hda->cad,tempm->nid,VERB_PIN_SENSE_GET);
|
||||
if (Bt(&tempm->pin_capabilities,0))
|
||||
"Impedance Measurement:%08X\n",tempm->pin_sense&0x7FFFFFFF;
|
||||
if (Bt(&tempm->pin_capabilities,2))
|
||||
"Presence:%d\n",Bt(&tempm->pin_sense,31);
|
||||
"\n\nPin widget ctrl bits:\n"
|
||||
" 7: High phn enable (low impedance output amp)\n"
|
||||
" 6: Output Enable\n"
|
||||
" 5: Input Enable\n"
|
||||
"0-2: Vref 0=HiZ 1=50% 2=Gnd 4=80% 5=100%\n";
|
||||
tempm->pin_widget_ctl=PmtI64("Widget Ctrl (0x%02X):",tempm->pin_widget_ctl,0,0xFF);
|
||||
HDWriteCORBSync(_hda->cad,tempm->nid,VERB_PIN_WIDGET_CTL_SET+tempm->pin_widget_ctl);
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
"Disable";
|
||||
if (tempm->disabled=YorN)
|
||||
HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x00);
|
||||
else
|
||||
HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x20);
|
||||
NewLine;
|
||||
break;
|
||||
case AWT_OUTPUT:
|
||||
"Disable";
|
||||
if (tempm->disabled=YorN)
|
||||
HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x00);
|
||||
else
|
||||
HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x10);
|
||||
NewLine;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDCfgPopUpInfo(MyMass *tempm)
|
||||
{
|
||||
U8 buf[136];
|
||||
SPrintF(buf,"HDCfgPopUpInfoTask(0x%X);\"\\n\\nPress SHIFT-ESC\\n\\n\\n\\n\";View;",tempm);
|
||||
Fs->win_inhibit|=WIF_ODE;
|
||||
Fs->draw_it=NULL;
|
||||
WinMgrSync;
|
||||
PopUp(buf,Fs);
|
||||
Fs->win_inhibit&=~WIF_ODE;
|
||||
Fs->draw_it=&DrawIt;
|
||||
}
|
||||
|
||||
U0 HDCfgEdLink(MyMass *tempm_out,MyMass *tempm_in)
|
||||
{
|
||||
I64 i,j;
|
||||
if ((i=FindConnectIndex(tempm_in,tempm_out->nid))>=0) {
|
||||
switch (tempm_in->type) {
|
||||
case AWT_MIXER:
|
||||
MemSet(tempm_in->gain_lst,0x80,sizeof(U8)*MAX_CONNECTS);
|
||||
tempm_in->gain_lst[i]=0x7F;
|
||||
for (j=0;j<tempm_in->num_connects;j++)
|
||||
HDWriteCORBSync(_hda->cad,tempm_in->nid,
|
||||
VERB_AMPLIFIER_GAIN_SET+0x7000+tempm_in->gain_lst[j]+j<<8);
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
case AWT_SELECTOR:
|
||||
case AWT_PIN_COMPLEX:
|
||||
case AWT_VENDOR:
|
||||
tempm_in->cur_connect=i;
|
||||
HDWriteCORBSync(_hda->cad,tempm_in->nid,VERB_CONNECT_SELECT_SET+i);
|
||||
break;
|
||||
}
|
||||
RedoSprings;
|
||||
}
|
||||
}
|
||||
|
||||
U0 HDCfgSave()
|
||||
{
|
||||
CDoc *doc=DocNew;
|
||||
I64 i;
|
||||
MyMass *tempm;
|
||||
DocPutS(doc,"//This file was generated by $$LK,\"::/TempleOS/Adam/Snd/HDCfg.CPP.Z\",\"FI:::/TempleOS/Adam/Snd/HDCfg.CPP\"$$\n\n"
|
||||
"U0 MyHDCfg()\n{\n");
|
||||
tempm=ode->next_mass;
|
||||
while (tempm!=&ode->next_mass) {
|
||||
DocPrintF(doc," //0x%02X %Z\n",tempm->nid,tempm->type,"ST_AUDIO_WIDGET_TYPES");
|
||||
if (tempm->num_connects) {
|
||||
DocPutS(doc," //Connection Lst:");
|
||||
for (i=0;i<tempm->num_connects;i++) {
|
||||
if (i==tempm->cur_connect)
|
||||
DocPutS(doc,"*");
|
||||
DocPrintF(doc,"0x%02X ",tempm->connect_lst[i]);
|
||||
}
|
||||
DocPutS(doc,"\n");
|
||||
if (tempm->type==AWT_MIXER) {
|
||||
DocPutS(doc," //Gain Lst:");
|
||||
for (i=0;i<tempm->num_connects;i++)
|
||||
DocPrintF(doc,"0x%02X ",tempm->gain_lst[i]);
|
||||
DocPutS(doc,"\n");
|
||||
}
|
||||
}
|
||||
switch (tempm->type) {
|
||||
case AWT_OUTPUT:
|
||||
if (tempm->disabled)
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x00);\n",
|
||||
tempm->nid);
|
||||
else
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x10);\n",
|
||||
tempm->nid);
|
||||
break;
|
||||
case AWT_MIXER:
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_AMPLIFIER_GAIN_SET+0xB07F);\n",
|
||||
tempm->nid);
|
||||
for (i=0;i<tempm->num_connects;i++)
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_AMPLIFIER_GAIN_SET+0x%04X);\n",
|
||||
tempm->nid,0x7000+tempm->gain_lst[i]+i<<8);
|
||||
break;
|
||||
case AWT_INPUT:
|
||||
if (tempm->disabled)
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x00);\n",
|
||||
tempm->nid);
|
||||
else
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x20);\n",
|
||||
tempm->nid);
|
||||
goto here;
|
||||
case AWT_PIN_COMPLEX:
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_PIN_WIDGET_CTL_SET+0x%02X);\n",
|
||||
tempm->nid,tempm->pin_widget_ctl);
|
||||
case AWT_SELECTOR:
|
||||
case AWT_VENDOR:
|
||||
here:
|
||||
if (tempm->num_connects>1)
|
||||
DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CONNECT_SELECT_SET+0x%02X);\n",
|
||||
tempm->nid,tempm->cur_connect);
|
||||
break;
|
||||
}
|
||||
DocPutS(doc,"\n");
|
||||
tempm=tempm->next;
|
||||
}
|
||||
DocPutS(doc," LBtr(&sys_semas[SYS_SEMA_SND],0);\n"
|
||||
"}\n\nif (snd_dev==SD_HD_AUDIO)\n"
|
||||
" MyHDCfg;\n");
|
||||
StrCpy(doc->filename.name,"HOME/HDAudioCfg.CPP.Z");
|
||||
DocWrite(doc);
|
||||
DocDel(doc);
|
||||
}
|
||||
|
||||
U0 HDCfg()
|
||||
{
|
||||
I64 p1,p2;
|
||||
MyMass *tempm1=NULL,*tempm2=NULL;
|
||||
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"HD Audio not detected\n";
|
||||
return;
|
||||
}
|
||||
HDAudioInit(0,27,0);
|
||||
|
||||
MenuPush(
|
||||
"File {"
|
||||
" Abort(,CH_SHIFT_ESC);"
|
||||
" Exit(,CH_ESC);"
|
||||
"}"
|
||||
"Edit {"
|
||||
" Randomize(,'\n');"
|
||||
" Options(,CH_SPACE);"
|
||||
"}"
|
||||
);
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
Preempt(OFF);
|
||||
DocBottom;
|
||||
WordStat;
|
||||
WinMax;
|
||||
WinBorder;
|
||||
Fs->win_inhibit=WIF_IP_L|WIF_IP_R|WIF_DBL_CLICK|WIF_DOC;
|
||||
Init;
|
||||
|
||||
HDCfgTraverse(_hda->cad,0);
|
||||
HDCfgRandomizeXY;
|
||||
RedoSprings;
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
PopUpOk(
|
||||
"This is a tool to cfgure\n"
|
||||
"HD Audio. It creates $$FG,RED$$HOME/HDAudioCfg.CPP.Z$$FG$$\n"
|
||||
"which you should $$FG,GREEN$$#include$$FG$$ in your\n"
|
||||
"$$FG,RED$$HOME/Adam3cSnd.CPP.Z$$FG$$ file.\n\n\n"
|
||||
"Left click to see info and cfgure a widget.\n"
|
||||
"Right click drag to connect output to input.\n\n"
|
||||
"You will need to set input and output amplifier\n"
|
||||
"gains by hand -- edit $$FG,RED$$HOME/HDAudioCfg.CPP.Z$$FG$$.\n\n"
|
||||
"The $$FG,BLUE$$BLUE$$FG$$ line in the middle is microphone waveform.\n\n"
|
||||
);
|
||||
|
||||
HDRun(TRUE,TRUE); //run input output
|
||||
Snd(500,WF_SINE,0.50);
|
||||
|
||||
try {
|
||||
while (TRUE) {
|
||||
switch (GetMsg(&p1,&p2,1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|1<<MSG_IP_R_UP|1<<MSG_KEY_DOWN)) {
|
||||
case MSG_IP_L_UP:
|
||||
if (tempm1=FindMassByXY(p1,p2))
|
||||
HDCfgPopUpInfo(tempm1);
|
||||
tempm1=NULL;
|
||||
break;
|
||||
case MSG_IP_R_DOWN:
|
||||
tempm1=FindMassByXY(p1,p2);
|
||||
break;
|
||||
case MSG_IP_R_UP:
|
||||
tempm2=FindMassByXY(p1,p2);
|
||||
if (tempm1 && tempm2)
|
||||
HDCfgEdLink(tempm1,tempm2);
|
||||
break;
|
||||
case MSG_KEY_DOWN:
|
||||
switch (p1) {
|
||||
case CH_SPACE:
|
||||
if (tempm1=FindMassByXY(ipx-Fs->win_pixel_left-Fs->win_scroll_x,ipy-Fs->win_pixel_top-Fs->win_scroll_y))
|
||||
HDCfgPopUpInfo(tempm1);
|
||||
tempm1=NULL;
|
||||
break;
|
||||
case '\n':
|
||||
HDCfgRandomizeXY;
|
||||
break;
|
||||
case CH_ESC:
|
||||
HDCfgSave;
|
||||
case CH_SHIFT_ESC:
|
||||
goto hd_done;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
hd_done: //Don't goto out of try
|
||||
GetMsg(,,1<<MSG_KEY_UP);
|
||||
} catch
|
||||
Fs->catch_except=TRUE;
|
||||
SettingsPop;
|
||||
HDStop(TRUE,FALSE); //stop input
|
||||
CleanUp;
|
||||
MenuPop;
|
||||
"$$BK,1$$Note: #include \"HOME/HDAudioCfg\" in your start-up scripts.$$BK,0$$\n";
|
||||
}
|
||||
|
||||
HDCfg;
|
||||
|
||||
@@ -98,8 +98,8 @@ F64 SinPhaseCont(F64 last_y,F64 last_dydt,
|
||||
return phase-phase_offset;
|
||||
}
|
||||
|
||||
public CSndWaveCtrl *SndWaveCtrlNew(I64 sample_rate=SND_SAMPLE_RATE,I64 sample_bits=SND_SAMPLE_BITS,
|
||||
I64 channels=SND_OCHANNELS,CTask *mem_task=NULL)
|
||||
public CSndWaveCtrl *SndWaveCtrlNew(I64 sample_rate=8000,I64 sample_bits=24,
|
||||
I64 channels=2,CTask *mem_task=NULL)
|
||||
{
|
||||
CSndWaveCtrl *swc=CAlloc(sizeof(CSndWaveCtrl),mem_task);
|
||||
swc->freq_multiplier=1.0;
|
||||
@@ -116,6 +116,14 @@ public U0 SndWaveCtrlDel(CSndWaveCtrl *swc)
|
||||
Free(swc);
|
||||
}
|
||||
|
||||
#define WF_NULL 0
|
||||
#define WF_SQUARE 1
|
||||
#define WF_SINE 2
|
||||
#define WF_TRI 3
|
||||
#define WF_SAWTOOTH 4
|
||||
#define WF_NOISE 5
|
||||
#define WF_NUM_WAVEFORMS 6
|
||||
|
||||
public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples,
|
||||
F64 _freq,I64 _waveform=WF_SQUARE,F64 _amp=1.0,F64 _left=1.0, F64 _right=1.0)
|
||||
{
|
||||
@@ -162,7 +170,7 @@ public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples,
|
||||
case WF_SINE:
|
||||
j=amp*Sin(phase);
|
||||
break;
|
||||
case WF_TRIANGLE:
|
||||
case WF_TRI:
|
||||
if (phase>=ã) {
|
||||
swc->last_y=swc->next_y;
|
||||
swc->next_y=-amp*Sign(swc->last_y)+.00001;
|
||||
@@ -223,31 +231,4 @@ public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples,
|
||||
}
|
||||
}
|
||||
|
||||
#help_index "Snd/HDAudio"
|
||||
I64 snd_reverb_buf_cnt;
|
||||
SND_OUT_CONTAINER *snd_reverb_buf=NULL;
|
||||
|
||||
U0 SndReverb(SND_OUT_CONTAINER *buf,I64 buf_num)
|
||||
{
|
||||
I64 i,j,mask,span=RoundI64(SND_SAMPLE_RATE*SND_OCHANNELS*snd_reverb_delay,SND_OCHANNELS);
|
||||
if (!snd_reverb_buf || span>snd_reverb_buf_cnt) {
|
||||
Free(snd_reverb_buf);
|
||||
snd_reverb_buf_cnt=1<<(Bsr(span)+1);
|
||||
snd_reverb_buf=ACAlloc(snd_reverb_buf_cnt*sizeof(SND_OUT_CONTAINER));
|
||||
}
|
||||
j=buf_num*SND_BUF_LEN;
|
||||
mask=snd_reverb_buf_cnt-1;
|
||||
for (i=0;i<SND_BUF_LEN;i++,j++) {
|
||||
snd_reverb_buf[j&mask]=
|
||||
buf[i]=
|
||||
LimitI64(buf[i]+snd_reverb_intensity*snd_reverb_buf[(j-span)&mask],
|
||||
MIN_I32,MAX_I32)&0xFFFFFF00;
|
||||
}
|
||||
}
|
||||
|
||||
I64 AudioSize()
|
||||
{
|
||||
return MSize2(snd_reverb_buf);
|
||||
}
|
||||
|
||||
#help_index "Snd"
|
||||
@@ -5,8 +5,8 @@ I64 music_octave;
|
||||
F64 music_note_len;
|
||||
U8 music_note_map[7]={0,2,3,5,7,8,10};
|
||||
I64 music_mute=0;
|
||||
I64 music_waveform,music_meter_top,music_meter_bottom;
|
||||
public F64 music_tempo,music_stacatto_factor,music_amplitude;
|
||||
I64 music_meter_top,music_meter_bottom;
|
||||
public F64 music_tempo,music_stacatto_factor;
|
||||
|
||||
//This is if you wish to sync with a
|
||||
//note in a Play() string. 0 is the start
|
||||
@@ -49,19 +49,6 @@ U8 *MusicSetOctave(U8 *st)
|
||||
return --st;
|
||||
}
|
||||
|
||||
U8 *MusicSetWaveform(U8 *st)
|
||||
{
|
||||
U8 ch=*st++;
|
||||
while (ch=='W') {
|
||||
ch=*st++;
|
||||
if ('0'<=ch<'0'+WF_NUM_WAVEFORMS) {
|
||||
music_waveform=ch-'0';
|
||||
ch=*st++;
|
||||
}
|
||||
}
|
||||
return --st;
|
||||
}
|
||||
|
||||
U8 *MusicSetMeter(U8 *st)
|
||||
{
|
||||
U8 ch=*st++;
|
||||
@@ -119,17 +106,6 @@ public U0 Play(U8 *st,U8 *words=NULL)
|
||||
|
||||
'(' tie, placed before the note to be extended
|
||||
|
||||
Accents are made with
|
||||
'!' *1.5
|
||||
'!!' *1.5`2
|
||||
|
||||
$LK,"music_waveform","MN:music_waveform"$ is set with
|
||||
"W1" for $LK,"WF_SQUARE","MN:WF_SQUARE"$
|
||||
"W2" for $LK,"WF_SINE","MN:WF_SINE"$
|
||||
"W3" for $LK,"WF_TRIANGLE","MN:WF_TRIANGLE"$
|
||||
"W4" for $LK,"WF_SAWTOOTH","MN:WF_SAWTOOTH"$
|
||||
"W5" for $LK,"WF_NOISE","MN:WF_NOISE"$
|
||||
|
||||
$LK,"music_meter_top","MN:music_meter_top"$,$LK,"music_meter_bottom","MN:music_meter_bottom"$ is set with
|
||||
"M3/4"
|
||||
"M4/4"
|
||||
@@ -140,9 +116,6 @@ public U0 Play(U8 *st,U8 *words=NULL)
|
||||
The var music_stacatto_factor can
|
||||
be set to a range from 0.0 to 1.0.
|
||||
|
||||
The var music_amplitude can
|
||||
be set to a range from 0.0 to 1.0.
|
||||
|
||||
The var music_tempo is quarter-notes
|
||||
per second. It defaults to
|
||||
2.5 and gets faster when bigger.
|
||||
@@ -153,23 +126,18 @@ public U0 Play(U8 *st,U8 *words=NULL)
|
||||
U8 *word,*last_st;
|
||||
I64 note,i=0,timeout_val,timeout_val2;
|
||||
Bool tie,old_preempt=Preempt(OFF);
|
||||
F64 f,d,a,on_jiffies,off_jiffies;
|
||||
F64 f,d,on_jiffies,off_jiffies;
|
||||
music_play_note_num=0;
|
||||
while (*st) {
|
||||
timeout_val=sys_jiffies;
|
||||
a=music_amplitude;
|
||||
tie=FALSE;
|
||||
|
||||
do {
|
||||
last_st=st;
|
||||
if (*st=='!') {
|
||||
a*=1.5;
|
||||
st++;
|
||||
} else if (*st=='(') {
|
||||
if (*st=='(') {
|
||||
tie=TRUE;
|
||||
st++;
|
||||
} else {
|
||||
st=MusicSetWaveform(st);
|
||||
st=MusicSetMeter(st);
|
||||
st=MusicSetOctave(st);
|
||||
st=MusicSetNoteLen(st);
|
||||
@@ -208,12 +176,12 @@ public U0 Play(U8 *st,U8 *words=NULL)
|
||||
timeout_val2=timeout_val+off_jiffies;
|
||||
|
||||
if (!music_mute)
|
||||
Snd(f,music_waveform,a);
|
||||
Snd(f);
|
||||
SleepUntil(timeout_val);
|
||||
music_tM_correction+=on_jiffies-ToI64(on_jiffies);
|
||||
|
||||
if (!music_mute)
|
||||
Snd(0,music_waveform,a);
|
||||
Snd(0);
|
||||
SleepUntil(timeout_val2);
|
||||
music_tM_correction+=off_jiffies-ToI64(off_jiffies);
|
||||
|
||||
@@ -226,15 +194,11 @@ U0 MusicSettingsRst()
|
||||
{
|
||||
music_play_note_num=0;
|
||||
music_stacatto_factor=0.9;
|
||||
music_amplitude=1/1.5`2;
|
||||
music_tempo=2.5;
|
||||
music_octave=3;
|
||||
music_note_len=1.0;
|
||||
music_waveform=WF_SQUARE;
|
||||
music_meter_top=4;
|
||||
music_meter_bottom=4;
|
||||
snd_reverb_intensity=0.2;
|
||||
snd_reverb_delay=0.3;
|
||||
|
||||
PushFD;
|
||||
Cli;
|
||||
|
||||
@@ -7,11 +7,6 @@ class CSndWaveCtrl
|
||||
F64 phase,last_y,last_dydt,next_y;
|
||||
};
|
||||
|
||||
I64 snd_obuf_num,snd_ibuf_num;
|
||||
|
||||
#define Sf_FILLING_OUT 0
|
||||
I64 snd_flags;
|
||||
|
||||
public U0 SndTaskEndCB()
|
||||
//This will turn-off snd when a task gets killed.
|
||||
{
|
||||
@@ -19,46 +14,6 @@ public U0 SndTaskEndCB()
|
||||
Exit;
|
||||
}
|
||||
|
||||
|
||||
class CSndData
|
||||
{
|
||||
CSndData *next,*last;
|
||||
U8 waveform,pad[7];
|
||||
F64 amp; //0.0-1.0
|
||||
F64 freq; //Hz
|
||||
F64 time_stamp;
|
||||
} snd_record_root;
|
||||
|
||||
U0 SndRecord(F64 freq,I64 waveform,F64 amp)
|
||||
{
|
||||
CSndData *d;
|
||||
d=ACAlloc(sizeof(CSndData));
|
||||
d->freq=freq;
|
||||
d->time_stamp=tT;
|
||||
d->waveform=waveform;
|
||||
d->amp=amp;
|
||||
QueIns(d,snd_record_root.last);
|
||||
}
|
||||
|
||||
U0 CtrlAltV(I64 sc)
|
||||
{
|
||||
if (sc&SCF_SHIFT)
|
||||
snd_vol/=1.5;
|
||||
else
|
||||
snd_vol*=1.5;
|
||||
}
|
||||
SetCtrlAltLetCB('V',&CtrlAltV,"Sys/Snd Volume +/-");
|
||||
|
||||
U0 SndInit()
|
||||
{
|
||||
QueInit(&snd_record_root);
|
||||
snd_record_root.freq=0;
|
||||
snd_record_root.time_stamp=tT;
|
||||
fp_snd_record=&SndRecord;
|
||||
}
|
||||
|
||||
SndInit;
|
||||
|
||||
#include "MathAudio"
|
||||
#include "Music"
|
||||
#include "SndEffects"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
class CSoundEffectFrame
|
||||
{
|
||||
I32 type,waveform;
|
||||
I32 type;
|
||||
F64 duration,freq1,freq2;
|
||||
};
|
||||
|
||||
@@ -25,7 +25,7 @@ U0 SoundEffectTask(CSoundEffectFrame *ns)
|
||||
i=MaxI64(ns->freq2-ns->freq1,1);
|
||||
while (tS<timeout)
|
||||
if (f=RandU16%i+ns->freq1) {
|
||||
Snd(f,ns->waveform);
|
||||
Snd(f);
|
||||
Sleep(MaxI64(3000/f,1));
|
||||
} else
|
||||
break;
|
||||
@@ -34,7 +34,7 @@ U0 SoundEffectTask(CSoundEffectFrame *ns)
|
||||
while (tS<timeout) {
|
||||
t=(tS-t0)/ns->duration;
|
||||
if (f=(1.0-t)*ns->freq1+t*ns->freq2) {
|
||||
Snd(f,ns->waveform);
|
||||
Snd(f);
|
||||
Sleep(MaxI64(3000/f,1));
|
||||
} else
|
||||
break;
|
||||
@@ -43,26 +43,32 @@ U0 SoundEffectTask(CSoundEffectFrame *ns)
|
||||
}
|
||||
}
|
||||
|
||||
public CTask *Noise(I64 mS,F64 min_freq,F64 max_freq,I64 waveform=WF_NOISE)
|
||||
public CTask *Noise(I64 mS,F64 min_freq,F64 max_freq)
|
||||
{
|
||||
CSoundEffectFrame *ns=MAlloc(sizeof(CSoundEffectFrame));
|
||||
ns->type=SE_NOISE;
|
||||
ns->waveform=waveform;
|
||||
ns->duration=mS/1000.0;
|
||||
ns->freq1=min_freq;
|
||||
ns->freq2=max_freq;
|
||||
music_mute++;
|
||||
return Spawn(&SoundEffectTask,ns,"Noise",Fs);
|
||||
CSoundEffectFrame *ns;
|
||||
if (mS>0) {
|
||||
ns=MAlloc(sizeof(CSoundEffectFrame));
|
||||
ns->type=SE_NOISE;
|
||||
ns->duration=mS/1000.0;
|
||||
ns->freq1=min_freq;
|
||||
ns->freq2=max_freq;
|
||||
music_mute++;
|
||||
return Spawn(&SoundEffectTask,ns,"Noise",,Fs);
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
public CTask *Sweep(I64 mS,F64 freq1,F64 freq2,I64 waveform=WF_SINE)
|
||||
public CTask *Sweep(I64 mS,F64 freq1,F64 freq2)
|
||||
{
|
||||
CSoundEffectFrame *ns=MAlloc(sizeof(CSoundEffectFrame));
|
||||
ns->type=SE_SWEEP;
|
||||
ns->waveform=waveform;
|
||||
ns->duration=mS/1000.0;
|
||||
ns->freq1=freq1;
|
||||
ns->freq2=freq2;
|
||||
music_mute++;
|
||||
return Spawn(&SoundEffectTask,ns,"Noise",Fs);
|
||||
CSoundEffectFrame *ns;
|
||||
if (mS>0) {
|
||||
ns=MAlloc(sizeof(CSoundEffectFrame));
|
||||
ns->type=SE_SWEEP;
|
||||
ns->duration=mS/1000.0;
|
||||
ns->freq1=freq1;
|
||||
ns->freq2=freq2;
|
||||
music_mute++;
|
||||
return Spawn(&SoundEffectTask,ns,"Noise",,Fs);
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
@@ -16,17 +16,13 @@ class CFileSND
|
||||
#define MAX_SND_FILE_DATA 0x7FF00
|
||||
|
||||
|
||||
public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=0.0,I64 waveform=WF_NULL,
|
||||
public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=0.0,I64 waveform=WF_SQUARE,
|
||||
F64 reverb_delay=0,F64 reverb_intensity=0)
|
||||
//Use "snd_record" flag to start or stop
|
||||
//recording, then call this routine.
|
||||
|
||||
//Averaging should be a num from 0.0 to 0.999.
|
||||
//Vol should be from 0.0 to 1.0.
|
||||
//If waveform is $LK,"WF_NULL","MN:WF_NULL"$, the original passed to $LK,"Snd","MN:Snd"$() will be used.
|
||||
|
||||
//Set reverb_delay to like 0.3 sec and reverb_intensity to like 0.4.
|
||||
|
||||
{
|
||||
I64 i,k,cnt,cnt2,level,file_num;
|
||||
F64 avg,dt;
|
||||
@@ -58,7 +54,7 @@ public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=
|
||||
d1=d->next;
|
||||
dt=d1->time_stamp-d->time_stamp;
|
||||
cnt2=dt*SNDFILE_SAMPLE_RATE;
|
||||
SndWaveAddBuf(swc,&s->body[k],cnt2,d->freq,waveform ?waveform:d->waveform,d->amp*normalized_vol);
|
||||
SndWaveAddBuf(swc,&s->body[k],cnt2,d->freq,waveform,normalized_vol);
|
||||
k+=cnt2;
|
||||
QueRem(d);
|
||||
Free(d);
|
||||
@@ -123,193 +119,4 @@ public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=
|
||||
return cnt;
|
||||
}
|
||||
|
||||
public U0 SndFileWrite(U8 *filename,SND_IN_CONTAINER *buf,I64 cnt)
|
||||
{
|
||||
CFileSND *s;
|
||||
I64 i,j,l=SND_SAMPLE_RATE/SNDFILE_SAMPLE_RATE;
|
||||
F64 level,a1,a2;
|
||||
|
||||
cnt/=l;
|
||||
s=CAlloc(offset(CFileSND.body)+cnt*sizeof(I16));
|
||||
s->signature=0x646e732e;
|
||||
s->offset=EndianU32(offset(CFileSND.body));
|
||||
s->coding=EndianU32(3);
|
||||
s->sample_rate=EndianU32(SNDFILE_SAMPLE_RATE);
|
||||
s->channels=EndianU32(1);
|
||||
s->data_size=EndianU32(cnt*sizeof(I16));
|
||||
|
||||
//Get rid of D.C. component
|
||||
j=cnt*l;
|
||||
level=0;
|
||||
for (i=0;i<j;i++)
|
||||
level+=buf[i];
|
||||
level/=j;
|
||||
for (i=0;i<j;i++)
|
||||
buf[i]=LimitI64(buf[i]-level,MIN_I16,MAX_I16);
|
||||
|
||||
//2nd order low pass filter. Time constant set by nyquest freq.
|
||||
a1=1.0/SND_SAMPLE_RATE/(2.0/SNDFILE_SAMPLE_RATE+1.0/SND_SAMPLE_RATE);
|
||||
a2=1.0-a1;
|
||||
for (i=1;i<j;i++)
|
||||
buf[i]=a1*buf[i]+a2*buf[i-1];
|
||||
for (i=1;i<j;i++)
|
||||
buf[i]=a1*buf[i]+a2*buf[i-1];
|
||||
|
||||
j=0;
|
||||
for (i=0;i<cnt;i++) {
|
||||
s->body[i]=EndianU16(buf[j]);
|
||||
j+=l;
|
||||
}
|
||||
FileWrite(filename,s,offset(CFileSND.body)+cnt*sizeof(I16));
|
||||
Free(s);
|
||||
}
|
||||
|
||||
public U0 SndFileView(U8 *name,Bool zoom=FALSE)
|
||||
{
|
||||
I64 i,start,end,w=Fs->win_pixel_width,h=Fs->win_pixel_height;
|
||||
F64 x_scale,y_scale;
|
||||
CFileSND *s=FileRead(name);
|
||||
if (s) {
|
||||
s->data_size=EndianU32(s->data_size)/sizeof(I16);
|
||||
for (i=0;i<s->data_size;i++)
|
||||
s->body[i]=EndianU16(s->body[i]);
|
||||
start=1;
|
||||
end=s->data_size;
|
||||
if (zoom) {
|
||||
for (i=1;i<end;i++)
|
||||
if (s->body[i]!=s->body[i-1]) {
|
||||
start=i;
|
||||
break;
|
||||
}
|
||||
if (s->data_size-start>w)
|
||||
end=start+w;
|
||||
}
|
||||
"$$CL$$";
|
||||
DCFill;
|
||||
CDC *dc=DCAlias;
|
||||
dc->color=GREEN;
|
||||
x_scale=ToF64(w)/(end-start+1);
|
||||
y_scale=ToF64(h)/MAX_U16;
|
||||
for (i=start;i<end;i++)
|
||||
GrLine(dc,x_scale*(i-start),y_scale*(s->body[i]+MAX_I16),
|
||||
x_scale*(i-start-1),y_scale*(s->body[i-1]+MAX_I16));
|
||||
Free(s);
|
||||
PressAKey;
|
||||
DCFill;
|
||||
DCDel(dc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CFileSND *snd_play_snd_file=NULL;
|
||||
I64 snd_play_start_buf_num,snd_play_samples_per_sample;
|
||||
Bool snd_play_done=TRUE,snd_play_single_done;
|
||||
U0 (*fp_snd_play_task_end_cb)()=NULL;
|
||||
U0 (*fp_snd_play_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
CFileSND *SndFileLoad(U8 *name)
|
||||
{
|
||||
I64 i;
|
||||
CFileSND *s=FileRead(name);
|
||||
if (s) {
|
||||
s->data_size=EndianU32(s->data_size)/sizeof(I16);
|
||||
for (i=0;i<s->data_size;i++)
|
||||
s->body[i]=EndianU16(s->body[i]);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
U0 SndFileFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num)
|
||||
{
|
||||
I64 i,j,k,m;
|
||||
if (snd_play_done) return;
|
||||
buf_num-=snd_play_start_buf_num;
|
||||
j=buf_num*(SND_BUF_LEN/SND_OCHANNELS*SNDFILE_SAMPLE_RATE/SND_SAMPLE_RATE);
|
||||
i=j%snd_play_snd_file->data_size;
|
||||
k=j%snd_play_samples_per_sample;
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
m=snd_vol*snd_play_snd_file->body[i++]<<16;
|
||||
while (j<SND_BUF_LEN) {
|
||||
buf[j++]=m;
|
||||
buf[j++]=m;
|
||||
if (++k==snd_play_samples_per_sample)
|
||||
break;
|
||||
}
|
||||
if (i>=snd_play_snd_file->data_size) {
|
||||
while (j<SND_BUF_LEN) {
|
||||
buf[j++]=0;
|
||||
buf[j++]=0;
|
||||
}
|
||||
snd_play_done=TRUE;
|
||||
break;
|
||||
}
|
||||
k=0;
|
||||
}
|
||||
}
|
||||
|
||||
U0 SndFilePlayTaskEndCB()
|
||||
{
|
||||
snd_play_done=TRUE;
|
||||
fp_snd_fill_buf=fp_snd_play_old_fill_buf;
|
||||
if (fp_snd_play_task_end_cb)
|
||||
(*fp_snd_play_task_end_cb)();
|
||||
else
|
||||
Exit;
|
||||
}
|
||||
|
||||
//See $LK-A,"::/TempleOS/Apps/MusicOrgan/Help.TXT"$
|
||||
//See $LK,"SndFileCreate","MN:SndFileCreate"$().
|
||||
public U0 SndFilePlay(U8 *snz_filename)
|
||||
{
|
||||
if (snd_play_done) {
|
||||
TaskInitExt;
|
||||
snd_play_snd_file=SndFileLoad(snz_filename);
|
||||
snd_play_samples_per_sample=SND_SAMPLE_RATE/SNDFILE_SAMPLE_RATE;
|
||||
fp_snd_play_task_end_cb=Fs->task_end_cb;
|
||||
Fs->task_end_cb=&SndFilePlayTaskEndCB;
|
||||
snd_play_start_buf_num=snd_obuf_num;
|
||||
snd_play_done=FALSE;
|
||||
fp_snd_play_old_fill_buf=fp_snd_fill_buf;
|
||||
fp_snd_fill_buf=&SndFileFillBuf;
|
||||
try {
|
||||
while (!snd_play_done)
|
||||
Sleep(1);
|
||||
} catch {
|
||||
snd_play_done=TRUE;
|
||||
fp_snd_fill_buf=fp_snd_play_old_fill_buf;
|
||||
Fs->task_end_cb=fp_snd_play_task_end_cb;
|
||||
Free(snd_play_snd_file);
|
||||
snd_play_snd_file=NULL;
|
||||
}
|
||||
fp_snd_fill_buf=fp_snd_play_old_fill_buf;
|
||||
Fs->task_end_cb=fp_snd_play_task_end_cb;
|
||||
Free(snd_play_snd_file);
|
||||
snd_play_snd_file=NULL;
|
||||
}
|
||||
snd_play_single_done=TRUE;
|
||||
}
|
||||
|
||||
public U0 SndFilePlaySeq(U8 *snz_filename,I64 num)
|
||||
{ //This has gaps between files. I might fix it someday. You fix it;-)
|
||||
I64 i;
|
||||
Bool old_preempt=Preempt(OFF),old_idle;
|
||||
U8 *fname=StrNew(snz_filename),*fname2;
|
||||
FileExtRem(fname);
|
||||
old_idle=LBts(&Fs->task_flags,TASKf_IDLE);
|
||||
for (i=0;i<num;i++) {
|
||||
fname2=MSPrintF("%s%04d.SNZ",fname,i);
|
||||
while (!snd_play_done)
|
||||
Yield;
|
||||
snd_play_single_done=FALSE;
|
||||
Spawn(&SndFilePlay,fname2,"Play .SNZ",Fs);
|
||||
while (!snd_play_single_done)
|
||||
Yield;
|
||||
Free(fname2);
|
||||
}
|
||||
old_idle=LBEqu(&Fs->task_flags,TASKf_IDLE,old_idle);
|
||||
Free(fname);
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
#help_index ""
|
||||
@@ -1,10 +1,5 @@
|
||||
#if snd_dev==SD_HD_AUDIO
|
||||
#include "::/TempleOS/Demo/Snd/PolyPhonic"
|
||||
#endif
|
||||
|
||||
U0 Start()
|
||||
{
|
||||
CTask *task;
|
||||
Type("::/TempleOS/Doc/Splash.TXT");
|
||||
SetWinHorz(TEXT_COLS/4-1,3*TEXT_COLS/4);
|
||||
SetWinVert(TEXT_ROWS/4-3,Fs->win_bottom);
|
||||
@@ -12,16 +7,7 @@ U0 Start()
|
||||
"$$FG,GREEN$$Tip of day$$FG$$\n";
|
||||
TipOfDay;
|
||||
"$$FG,GREEN$$<SHIFT-ESC>$$FG$$ to exit.\n";
|
||||
#if snd_dev==SD_HD_AUDIO
|
||||
PopUp("#include \"::/TempleOS/Demo/Snd/SndScope\";",NULL,&task);
|
||||
TaskWait(task);
|
||||
WinToTop;
|
||||
PolyPhonic;
|
||||
Kill(task);
|
||||
#else
|
||||
nounusedwarn task;
|
||||
View;
|
||||
#endif
|
||||
}
|
||||
|
||||
Start;
|
||||
@@ -26,13 +26,10 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0)
|
||||
Suspend(task->animate_task);
|
||||
task->animate_task=NULL;
|
||||
|
||||
if (doc=DocCur(task)) {
|
||||
if (doc=DocPut(task)) {
|
||||
tempse->cursor=!Bt(&doc->flags,DOCf_HIDE_CURSOR);
|
||||
tempse->scroll=!Bt(&doc->flags,DOCf_NO_SCROLL_BARS);
|
||||
tempse->doc_cur_attr=doc->start_text_attr;
|
||||
}
|
||||
if (doc=DocAux(task))
|
||||
tempse->doc_aux_attr=doc->start_text_attr;
|
||||
|
||||
tempse->left=task->win_left;
|
||||
tempse->right=task->win_right;
|
||||
@@ -48,7 +45,10 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0)
|
||||
|
||||
tempse->win_max_refresh=task->win_max_refresh;
|
||||
tempse->text_attr=task->text_attr;
|
||||
StrCpy(tempse->task_title,task->task_title);
|
||||
tempse->title_src =task->title_src;
|
||||
tempse->border_attr=task->border_attr;
|
||||
tempse->border_src =task->border_src;
|
||||
tempse->border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER);
|
||||
tempse->preempt=Bt(&task->task_flags,TASKf_PREEMPT);
|
||||
if (TaskValidate(ws_task))
|
||||
@@ -61,10 +61,37 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0)
|
||||
return tempse;
|
||||
}
|
||||
|
||||
U0 SettingsPop2(CTask *task,CTaskSettings *tempse)
|
||||
{
|
||||
CDoc *doc;
|
||||
|
||||
if (doc=DocPut(task)) {
|
||||
LBEqu(&doc->flags,DOCf_HIDE_CURSOR,!tempse->cursor);
|
||||
LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!tempse->scroll);
|
||||
}
|
||||
|
||||
WinBorder(tempse->border,task);
|
||||
SetWinHorz(tempse->left,tempse->right,task);
|
||||
SetWinVert(tempse->top,tempse->bottom,task);
|
||||
task->win_scroll_x=tempse->scroll_x;
|
||||
task->win_scroll_y=tempse->scroll_y;
|
||||
task->win_scroll_z=tempse->scroll_z;
|
||||
MemCpy(&task->snap,&tempse->snap,sizeof(CSnap));
|
||||
task->win_inhibit=tempse->win_inhibit;
|
||||
task->win_max_refresh=tempse->win_max_refresh;
|
||||
task->text_attr=tempse->text_attr;
|
||||
task->border_attr=tempse->border_attr;
|
||||
task->border_src =tempse->border_src;
|
||||
task->title_src =tempse->title_src;
|
||||
StrCpy(task->task_title,tempse->task_title);
|
||||
WordStat(tempse->wordstat);
|
||||
SetVGAPalette4(tempse->palette4);
|
||||
Snd(0);
|
||||
}
|
||||
|
||||
public U0 SettingsPop(CTask *task=NULL,I64 flags=0)
|
||||
{
|
||||
CTaskSettings *tempse;
|
||||
CDoc *doc;
|
||||
Bool old_preempt=Preempt(OFF);
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) {
|
||||
@@ -74,7 +101,6 @@ public U0 SettingsPop(CTask *task=NULL,I64 flags=0)
|
||||
if (tempse=task->next_settings) {
|
||||
task->next_settings=tempse->next;
|
||||
task->draw_it=tempse->draw_it;
|
||||
SetVGAPalette4(tempse->palette4);
|
||||
task->task_end_cb=tempse->task_end_cb;
|
||||
|
||||
if (task->animate_task)
|
||||
@@ -89,31 +115,13 @@ public U0 SettingsPop(CTask *task=NULL,I64 flags=0)
|
||||
Suspend(task->song_task,FALSE);
|
||||
}
|
||||
|
||||
if (doc=DocCur(task)) {
|
||||
LBEqu(&doc->flags,DOCf_HIDE_CURSOR,!tempse->cursor);
|
||||
LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!tempse->scroll);
|
||||
doc->start_text_attr=tempse->doc_cur_attr;
|
||||
}
|
||||
if (doc=DocAux(task))
|
||||
doc->start_text_attr=tempse->doc_aux_attr;
|
||||
|
||||
WinBorder(tempse->border,task);
|
||||
SetWinHorz(tempse->left,tempse->right,task);
|
||||
SetWinVert(tempse->top,tempse->bottom,task);
|
||||
task->win_scroll_x=tempse->scroll_x;
|
||||
task->win_scroll_y=tempse->scroll_y;
|
||||
task->win_scroll_z=tempse->scroll_z;
|
||||
MemCpy(&task->snap,&tempse->snap,sizeof(CSnap));
|
||||
task->win_inhibit=tempse->win_inhibit;
|
||||
task->win_max_refresh=tempse->win_max_refresh;
|
||||
task->text_attr=tempse->text_attr;
|
||||
task->border_attr=tempse->border_attr;
|
||||
WordStat(tempse->wordstat);
|
||||
Snd(0);
|
||||
Free(tempse);
|
||||
SettingsPop2(task,tempse); //Do it to get results fast
|
||||
WinMgrSync(,TRUE);
|
||||
SettingsPop2(task,tempse); //Redo in case was lost by old update
|
||||
|
||||
Preempt(old_preempt);
|
||||
LBEqu(&task->task_flags,TASKf_PREEMPT,tempse->preempt);
|
||||
Free(tempse);
|
||||
} else
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ public U0 TipOfDay(U8 *tip_file="::/TempleOS/Doc/Tips.TXT")
|
||||
break;
|
||||
}
|
||||
}
|
||||
DocInsDoc(DocCur,doc2);
|
||||
DocInsDoc(DocPut,doc2);
|
||||
DocDel(doc2);
|
||||
DocDel(doc);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ DefineLstLoad("ST_BIN_FILE_TYPES",
|
||||
|
||||
public Bool BinRep(U8 *filename)
|
||||
{//This reports imports, exports, etc
|
||||
//for a .BI? file.
|
||||
//for a .BI* file.
|
||||
//See $LK,"Loader Patch Table Generation","FF:::/TempleOS/Compiler/CmpMain.CPP,EIE_MODULE_ALIGNMENT"$ and $LK,"Load","MN:Load"$().
|
||||
U8 *fbuf,*ptr,etype,*sptr,*absname;
|
||||
I64 i,j,size;
|
||||
@@ -35,7 +35,7 @@ public Bool BinRep(U8 *filename)
|
||||
}
|
||||
bfh=bfh2;
|
||||
|
||||
if (ArcXSum(bfh,bfh->file_size)!=NATIVE_XSUM) {
|
||||
if (ArcXSum(bfh,bfh->file_size)!=TEMPLEOS_XSUM) {
|
||||
"Bad XSum\n\n";
|
||||
return FALSE;
|
||||
}
|
||||
@@ -56,9 +56,12 @@ U0 DiffSelect(CDoc *doc,I64 *_df_flags,I64 j1_lo,I64 j1_hi,
|
||||
else
|
||||
"***";
|
||||
"---------------------$$FG$$\n";
|
||||
i= j1_lo<=0 ? 0:j1_lo-1;
|
||||
if (j1_lo<=0)
|
||||
i=0;
|
||||
else
|
||||
i=j1_lo-1;
|
||||
while (i<j1_hi) {
|
||||
if (cur_l=DocCur) {
|
||||
if (cur_l=DocPut) {
|
||||
old_flags=cur_l->flags&DOCF_PLAIN_TEXT;
|
||||
cur_l->flags|=DOCF_PLAIN_TEXT;
|
||||
}
|
||||
@@ -68,9 +71,12 @@ U0 DiffSelect(CDoc *doc,I64 *_df_flags,I64 j1_lo,I64 j1_hi,
|
||||
NewLine;
|
||||
}
|
||||
"$$FG,CYAN$$";
|
||||
i= j2_lo<=0 ? 0:j2_lo-1;
|
||||
if (j2_lo<=0)
|
||||
i=0;
|
||||
else
|
||||
i=j2_lo-1;
|
||||
while (i<j2_hi) {
|
||||
if (cur_l=DocCur) {
|
||||
if (cur_l=DocPut) {
|
||||
old_flags=cur_l->flags&DOCF_PLAIN_TEXT;
|
||||
cur_l->flags|=DOCF_PLAIN_TEXT;
|
||||
}
|
||||
@@ -266,9 +266,9 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE)
|
||||
}
|
||||
|
||||
#help_index "Graphics/CSprite;Graphics/Windows BMP Files;Doc/Output"
|
||||
public U0 DocPutBMPFile(CDoc *doc=NULL,U8 *fname,Bool use_ms_paint_palette=FALSE)
|
||||
public U0 DocPutBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE)
|
||||
{
|
||||
CDC *dc=BMPFileRead(fname,use_ms_paint_palette);
|
||||
CDC *dc=BMPFileRead(filename,use_ms_paint_palette);
|
||||
CSprite *elems=DC2Sprite(dc);
|
||||
DocPutSprite(doc,elems);
|
||||
Free(elems);
|
||||
@@ -34,7 +34,10 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text)
|
||||
CDoc *cur_l,*doc=DocRead(name,DOCF_PLAIN_TEXT_WITH_TABS|DOCF_NO_CURSOR);
|
||||
CDocEntry *doc_e;
|
||||
|
||||
ss_flags=Bt(_fuf_flags,FUf_IGNORE) ? SRF_IGNORE_CASE :0;
|
||||
if (Bt(_fuf_flags,FUf_IGNORE))
|
||||
ss_flags=SRF_IGNORE_CASE;
|
||||
else
|
||||
ss_flags=0;
|
||||
if (Bt(_fuf_flags,FUf_WHOLE_LABELS))
|
||||
ss_flags|=SRG_WHOLE_LABELS;
|
||||
if (Bt(_fuf_flags,FUf_WHOLE_LABELS_FRONT))
|
||||
@@ -57,7 +60,7 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text)
|
||||
first_on_line=FALSE;
|
||||
PutFileLink(name,doc_e->y+1,TRUE);
|
||||
name_buf=MSPrintF("%s,%d",name,doc_e->y+1);
|
||||
if (cur_l=DocCur) {
|
||||
if (cur_l=DocPut) {
|
||||
old_flags=cur_l->flags&DOCF_PLAIN_TEXT;
|
||||
cur_l->flags|=DOCF_PLAIN_TEXT;
|
||||
}
|
||||
@@ -96,7 +99,7 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text)
|
||||
*dst++=doc_e->tag[i];
|
||||
Free(doc_e->tag);
|
||||
doc_e->tag=dst2;
|
||||
if (cur_l=DocCur) {
|
||||
if (cur_l=DocPut) {
|
||||
old_flags=cur_l->flags&DOCF_PLAIN_TEXT;
|
||||
cur_l->flags|=DOCF_PLAIN_TEXT;
|
||||
}
|
||||
@@ -166,14 +169,16 @@ This does not do regular expressions--my bad.
|
||||
Anyway, it's good for searching and replacing.
|
||||
Let's say it stands for global replace ;-)
|
||||
|
||||
"+r"=recurse
|
||||
"+i"=ignore case
|
||||
"+l"=whole labels only.
|
||||
This will check for a nonlabel character before
|
||||
and after. If you have a var, "doc_e" and don't
|
||||
want to match words like "will" and "wallow", you
|
||||
set this flag and it will see that the characters
|
||||
before or after "doc_e" are label characters.
|
||||
"+r" =recurse
|
||||
"+i" =ignore case
|
||||
"+l" =whole labels only.
|
||||
This will check for a nonlabel character before
|
||||
and after. If you have a var, "dd" and don't
|
||||
want to match words like "Add", you
|
||||
set this flag and it will see that the characters
|
||||
before or after "ll" are label characters.
|
||||
"+lf"=only checks for label chars in front
|
||||
"+lb"=only checks for label chars behind (after).
|
||||
*/
|
||||
|
||||
{
|
||||
@@ -222,7 +227,7 @@ I64 GrepWiz()
|
||||
I64 result=0;
|
||||
g->recurse=TRUE;
|
||||
StrCpy(g->filemask,FILENAME_MASK_TXT);
|
||||
if (doc=DocCur) {
|
||||
if (doc=DocPut) {
|
||||
StrCpy(g->find_text,doc->find_replace->find_text);
|
||||
StrCpy(g->replace_text,doc->find_replace->replace_text);
|
||||
g->replace=doc->find_replace->replace;
|
||||
File renamed without changes.
@@ -55,7 +55,7 @@ public I64 LineCntRep(U8 *files_find_mask="/TempleOS/*",U8 *fu_flags=NULL)
|
||||
DocPutS(doc,"$$ID,-2$$");
|
||||
CDirLstDel(tempm1);
|
||||
}
|
||||
DocInsDoc(DocCur,doc);
|
||||
DocInsDoc(DocPut,doc);
|
||||
DocDel(doc);
|
||||
return result;
|
||||
}
|
||||
@@ -105,7 +105,7 @@ public I64 TreeSizeRep(U8 *files_find_mask="/TempleOS/*",U8 *fu_flags=NULL)
|
||||
DocPutS(doc,"$$ID,-2$$");
|
||||
CDirLstDel(tempm1);
|
||||
}
|
||||
DocInsDoc(DocCur,doc);
|
||||
DocInsDoc(DocPut,doc);
|
||||
DocDel(doc);
|
||||
return result;
|
||||
}
|
||||
@@ -4,7 +4,7 @@ I64 LinkChkDoc(CDoc *doc,I64 *_fuf_flags)
|
||||
{
|
||||
U8 *st;
|
||||
Bool found,unlock=DocLock(doc);
|
||||
CDoc *old_doc=DocCur;
|
||||
CDoc *old_doc;
|
||||
CDocEntry *doc_e=doc->root.next;
|
||||
I64 result=0;
|
||||
while (doc_e!=doc) {
|
||||
@@ -13,12 +13,11 @@ I64 LinkChkDoc(CDoc *doc,I64 *_fuf_flags)
|
||||
break;
|
||||
}
|
||||
if (st=DocEntryLink(doc,doc_e)) {
|
||||
old_doc=DocPut;
|
||||
DocLock(old_doc);
|
||||
DocQueRem(old_doc);
|
||||
DocQueIns(doc,Fs->last_doc);
|
||||
Fs->put_doc=doc;
|
||||
found=DocLinkChk(st);
|
||||
DocQueRem(doc);
|
||||
DocQueIns(old_doc,Fs->last_doc);
|
||||
Fs->put_doc=old_doc;
|
||||
DocUnlock(old_doc);
|
||||
if (!found) {
|
||||
PutFileLink(doc->filename.name,doc_e->y);
|
||||
@@ -41,23 +41,28 @@ I64 TaskStkSize(CTask *task)
|
||||
|
||||
I64 TaskQueSize(CTask *task)
|
||||
{
|
||||
CTaskCmd *tempc,*tempc1;
|
||||
CSrvCmd *tempc,*tempc1;
|
||||
I64 result=0;
|
||||
PushFD;
|
||||
Cli;
|
||||
while (LBts(&task->locked_flags,TASKLf_TASK_LOCK))
|
||||
while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED))
|
||||
Pause;
|
||||
tempc1=&task->next_servant_cmd;
|
||||
|
||||
tempc1=&task->srv_ctrl.next_waiting;
|
||||
tempc=tempc1->next;
|
||||
while (tempc!=tempc1) {
|
||||
result+=MSize2(tempc);
|
||||
if (tempc->cmd_code==TASKCT_EXECUTE_STR ||
|
||||
tempc->cmd_code==TASKCT_EXECUTE_FILE ||
|
||||
tempc->cmd_code==TASKCT_TEXT_INPUT)
|
||||
result+=MSize2(tempc->data);
|
||||
result+=MSize2(tempc)+MSize2(tempc->aux_str);
|
||||
tempc=tempc->next;
|
||||
}
|
||||
LBtr(&task->locked_flags,TASKLf_TASK_LOCK);
|
||||
|
||||
tempc1=&task->srv_ctrl.next_done;
|
||||
tempc=tempc1->next;
|
||||
while (tempc!=tempc1) {
|
||||
result+=MSize2(tempc)+MSize2(tempc->aux_str);
|
||||
tempc=tempc->next;
|
||||
}
|
||||
|
||||
LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED);
|
||||
PopFD;
|
||||
return result;
|
||||
}
|
||||
@@ -71,7 +76,7 @@ I64 BlkDevsSize()
|
||||
if (bdev->bd_signature==BD_SIGNATURE_VAL) {
|
||||
if (bdev->type==BDT_RAM)
|
||||
"RAMDsk %C\t:%010X Unused:%010X\n",
|
||||
bdev->first_drv_let,MSize2(bdev->RAM_dsk),
|
||||
bdev->first_drv_let,(bdev->max_blk+1)<<BLK_SIZE_BITS,
|
||||
UnusedDrvSpace(bdev->first_drv_let);
|
||||
result+=MSize2(bdev->dev_id_record);
|
||||
}
|
||||
@@ -92,7 +97,7 @@ Bool MemRepTask(CTask *task,Bool override_validate=FALSE)
|
||||
{
|
||||
I64 i,j,k,m,n;
|
||||
U8 *st;
|
||||
CDoc *doc;
|
||||
CDoc *pdoc,*ddoc,*bdoc;
|
||||
CLex *lx;
|
||||
CMathODE *o;
|
||||
CCPU *c;
|
||||
@@ -109,36 +114,36 @@ Bool MemRepTask(CTask *task,Bool override_validate=FALSE)
|
||||
TaskAllocatedMem(task,override_validate),
|
||||
TaskUsedMem(task,override_validate),
|
||||
TaskUnusedAllocatedMem(task,override_validate);
|
||||
"HashTable:%010X\n",HashTableSize2(task->hash_table);
|
||||
"HashTable\t:%010X\n",HashTableSize2(task->hash_table);
|
||||
|
||||
i=UnusedStk(task);
|
||||
if (0<=i<=task->stk->stk_size)
|
||||
"Stk Size :%010X Unused:%010X\n",TaskStkSize(task),i;
|
||||
"Stk Size\t:%010X Unused:%010X\n",TaskStkSize(task),i;
|
||||
else
|
||||
"Stk Size :%010X $$FG,RED$$$$BK,1$$Overflow$$BK,0$$$$FG$$\n",TaskStkSize(task);
|
||||
"Stk Size\t:%010X $$FG,RED$$$$BK,1$$Overflow$$BK,0$$$$FG$$\n",TaskStkSize(task);
|
||||
|
||||
doc=task->last_doc;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
"Doc :%010X\n",DocSize(doc);
|
||||
doc=doc->last_doc;
|
||||
}
|
||||
if (pdoc=DocPut(task))
|
||||
"PutDoc\t:%010X\n",DocSize(pdoc);
|
||||
if ((ddoc=DocDisplay(task)) && pdoc!=ddoc)
|
||||
"DisplayDoc\t:%010X\n",DocSize(ddoc);
|
||||
if (bdoc=DocBorder(task))
|
||||
"BorderDoc\t:%010X\n",DocSize(bdoc);
|
||||
|
||||
lx=task->next_lex;
|
||||
while (lx!=&task->next_lex) {
|
||||
"Lex :%010X\n",LexSize(lx);
|
||||
"Lex\t\t:%010X\n",LexSize(lx);
|
||||
lx=lx->next;
|
||||
}
|
||||
|
||||
o=task->next_ode;
|
||||
while (o!=&task->next_ode) {
|
||||
"CMathODE :%010X\n",ODESize(o);
|
||||
"CMathODE\t:%010X\n",ODESize(o);
|
||||
o=o->next;
|
||||
}
|
||||
|
||||
if (task==sys_winmgr_task) {
|
||||
"gr_dc2\t\t:%010X\n",DCSize(gr_dc2);
|
||||
"gr_dc\t\t:%010X\n",DCSize(gr_dc);
|
||||
"gr_dc2\t\t:%010X\n",DCSize(gr_dc2);
|
||||
"gr_dc_cache\t\t:%010X\n",DCSize(gr_dc_cache);
|
||||
"gr_screen_image\t:%010X\n",DCSize(gr_screen_image);
|
||||
"gr_zoomed_dc\t:%010X\n",DCSize(gr_zoomed_dc);
|
||||
@@ -60,30 +60,30 @@ public U0 MergeChk(
|
||||
|
||||
#help_index "Utils;Cmd Line (Typically)"
|
||||
|
||||
U0 LstNewFilesLst(CDirEntry *tempm,CDate spdt)
|
||||
U0 LstNewFilesLst(CDirEntry *tempm,CDate cdt)
|
||||
{
|
||||
while (tempm) {
|
||||
if (tempm->datetime>spdt) {
|
||||
if (tempm->datetime>cdt) {
|
||||
"" tempm->full_name;
|
||||
NewLine;
|
||||
}
|
||||
LstNewFilesLst(tempm->sub,spdt);
|
||||
LstNewFilesLst(tempm->sub,cdt);
|
||||
tempm=tempm->next;
|
||||
}
|
||||
}
|
||||
|
||||
public U0 LstNewFiles(U8 *files_find_mask="/TempleOS/*",CDate spdt=0,
|
||||
public U0 LstNewFiles(U8 *files_find_mask="/TempleOS/*",CDate cdt=0,
|
||||
U8 *fu_flags=NULL)
|
||||
//"+T"=is just text files
|
||||
{
|
||||
I64 fuf_flags=0;
|
||||
CDirEntry *tempm1=NULL;
|
||||
if (!spdt)
|
||||
spdt=sys_compile_time;
|
||||
if (!cdt)
|
||||
cdt=sys_compile_time;
|
||||
GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+T");
|
||||
GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
|
||||
if (tempm1=FilesFind(files_find_mask,fuf_flags)) {
|
||||
LstNewFilesLst(tempm1,spdt);
|
||||
LstNewFilesLst(tempm1,cdt);
|
||||
CDirLstDel(tempm1);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
@@ -1,6 +1,6 @@
|
||||
#help_index "Utils;Cmd Line (Typically);Doc/Html"
|
||||
|
||||
//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (12).
|
||||
//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$.
|
||||
|
||||
U0 HtmlPutS(CDoc *doc,I64 c,I64 *_old_c,U8 *st,I64 *_col,U8 *style_bitmap=NULL)
|
||||
{
|
||||
@@ -131,7 +131,7 @@ public CDoc *Doc2Html(CDoc *doc_in,
|
||||
{
|
||||
CDocEntry *doc_e,*style,*doc_e2;
|
||||
CDocSettings *s;
|
||||
I64 i,y,old_y=MIN_I64,cur_u8_attr,col,old_c=-1;
|
||||
I64 i,y,old_y=MIN_I64,cur_u8_attr,col,old_c=-1,old_attr;
|
||||
U32 *hl,*src;
|
||||
U8 *st,st_2[2],*link_st,*style_bitmap=CAlloc(256/8);
|
||||
CBGR p[16];
|
||||
@@ -139,6 +139,9 @@ public CDoc *Doc2Html(CDoc *doc_in,
|
||||
CDoc *doc_out=DocNew;
|
||||
Bool unlock_doc_in=DocLock(doc_in),no_backward;
|
||||
|
||||
old_attr=doc_in->win_task->text_attr;
|
||||
doc_in->win_task->text_attr=DOC_ATTR_DFT_TEXT;
|
||||
|
||||
for (i=0xF0;i<=0xFF;i++)
|
||||
LBts(style_bitmap,i);
|
||||
|
||||
@@ -274,7 +277,7 @@ public CDoc *Doc2Html(CDoc *doc_in,
|
||||
break;
|
||||
case DOCT_SPRITE:
|
||||
HtmlPutS(doc_out,cur_u8_attr,&old_c,doc_e->tag,&col,style_bitmap);
|
||||
HtmlPutS(doc_out,s->comment_attr&15+old_c&0xF0,&old_c,"/* Graphics Not Rendered in HTML */",&col,style_bitmap);
|
||||
HtmlPutS(doc_out,DOC_COLOR_COMMENT+old_c&0xF0,&old_c,"/* Graphics Not Rendered in HTML */",&col,style_bitmap);
|
||||
break;
|
||||
default:
|
||||
if (Bt(doc_tag_types,doc_e->type_u8))
|
||||
@@ -310,6 +313,8 @@ public CDoc *Doc2Html(CDoc *doc_in,
|
||||
doc_out->cur_entry=&doc_out->root;
|
||||
DocRecalc(doc_out);
|
||||
|
||||
doc_in->win_task->text_attr=old_attr;
|
||||
|
||||
if (unlock_doc_in)
|
||||
DocUnlock(doc_in);
|
||||
return doc_out;
|
||||
File renamed without changes.
Binary file not shown.
+101
-150
@@ -126,7 +126,7 @@ U0 ExtendedASCII()
|
||||
{
|
||||
I64 i;
|
||||
CDoc *doc=DocNew;
|
||||
DocPutS(doc,"Select Char and Press <ESC>\n");
|
||||
DocPutS(doc,"Select Char and Press <ESC>\n$$FG,LTBLUE$$");
|
||||
for (i=0;i<256;i++) {
|
||||
if (i>=CH_SHIFT_SPACE && i!=127) {
|
||||
if (i==CH_SHIFT_SPACE)
|
||||
@@ -277,7 +277,7 @@ F64 last_refresh_time=tT,
|
||||
I64 win_calc_refresh_cnt=0,
|
||||
win_calc_refresh_skips=0;
|
||||
|
||||
I64 WinCalcRefreshTimeout(Bool was_forced)
|
||||
I64 WinCalcRefreshTimeOut(Bool was_forced)
|
||||
{
|
||||
F64 d,d1;
|
||||
I64 i,k,total,
|
||||
@@ -360,7 +360,7 @@ I64 WinQueIPMsgs(Bool que)
|
||||
single_p2=single_ipy-task_focus->win_pixel_top-task_focus->win_scroll_y;
|
||||
if (old_ipx_presnap!=ipx_presnap || old_ipy_presnap!=ipy_presnap) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_MOVE,p1,p2,0);
|
||||
msg_code=MSG_IP_MOVE;
|
||||
}
|
||||
@@ -370,14 +370,14 @@ I64 WinQueIPMsgs(Bool que)
|
||||
if (left_dbl) {
|
||||
if (!left_down_sent) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_D_DOWN,p1,p2,0);
|
||||
left_down_sent=TRUE;
|
||||
msg_code=MSG_IP_L_D_DOWN;
|
||||
}
|
||||
if (!ip_lb) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_D_UP,p1,p2,0);
|
||||
left_ip_dbl_time=0;
|
||||
msg_code=MSG_IP_L_D_UP;
|
||||
@@ -385,14 +385,14 @@ I64 WinQueIPMsgs(Bool que)
|
||||
} else {
|
||||
if (!left_down_sent) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_DOWN,single_p1,single_p2,0);
|
||||
left_down_sent=TRUE;
|
||||
msg_code=MSG_IP_L_DOWN;
|
||||
}
|
||||
if (!ip_lb) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_UP,p1,p2,0);
|
||||
left_ip_dbl_time=0;
|
||||
msg_code=MSG_IP_L_UP;
|
||||
@@ -408,12 +408,12 @@ I64 WinQueIPMsgs(Bool que)
|
||||
if (WinInhibit(WIf_DBL_CLICK)) {
|
||||
if (ip_lb && !ip_lb_last) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_DOWN,p1,p2,0);
|
||||
msg_code=MSG_IP_L_DOWN;
|
||||
} else if (!ip_lb && ip_lb_last) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_L_UP,p1,p2,0);
|
||||
msg_code=MSG_IP_L_UP;
|
||||
}
|
||||
@@ -433,14 +433,14 @@ I64 WinQueIPMsgs(Bool que)
|
||||
if (right_dbl) {
|
||||
if (!right_down_sent) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_D_DOWN,p1,p2,0);
|
||||
right_down_sent=TRUE;
|
||||
msg_code=MSG_IP_R_D_DOWN;
|
||||
}
|
||||
if (!ip_rb) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_D_UP,p1,p2,0);
|
||||
right_ip_dbl_time=0;
|
||||
msg_code=MSG_IP_R_D_UP;
|
||||
@@ -448,14 +448,14 @@ I64 WinQueIPMsgs(Bool que)
|
||||
} else {
|
||||
if (!right_down_sent) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_DOWN,single_p1,single_p2,0);
|
||||
right_down_sent=TRUE;
|
||||
msg_code=MSG_IP_R_DOWN;
|
||||
}
|
||||
if (!ip_rb) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_UP,p1,p2,0);
|
||||
right_ip_dbl_time=0;
|
||||
msg_code=MSG_IP_R_UP;
|
||||
@@ -471,12 +471,12 @@ I64 WinQueIPMsgs(Bool que)
|
||||
if (WinInhibit(WIf_DBL_CLICK)) {
|
||||
if (ip_rb && !ip_rb_last) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_DOWN,p1,p2,0);
|
||||
msg_code=MSG_IP_R_DOWN;
|
||||
} else if (!ip_rb && ip_rb_last) {
|
||||
if (que)
|
||||
QueMsg(task_focus,0,
|
||||
TaskMsgQue(task_focus,0,
|
||||
MSG_IP_R_UP,p1,p2,0);
|
||||
msg_code=MSG_IP_R_UP;
|
||||
}
|
||||
@@ -537,9 +537,9 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE)
|
||||
TimeStampFreqCal;
|
||||
|
||||
if (!flush_msgs && old_sys_focus_task!=sys_focus_task) {
|
||||
QueMsg(old_sys_focus_task,0,
|
||||
TaskMsgQue(old_sys_focus_task,0,
|
||||
MSG_FOCUS,FALSE,0,0);
|
||||
QueMsg(sys_focus_task,0,
|
||||
TaskMsgQue(sys_focus_task,0,
|
||||
MSG_FOCUS,TRUE,0,0);
|
||||
old_sys_focus_task=sys_focus_task;
|
||||
}
|
||||
@@ -547,7 +547,7 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE)
|
||||
if (flush_msgs)
|
||||
FifoI64Flush(scan_code_fifo);
|
||||
else if (TaskValidate(sys_focus_task)) {
|
||||
KbdQueMsgs;
|
||||
KbdMsgsQue;
|
||||
|
||||
que=TRUE;
|
||||
if (!WinInhibit(WIf_CTRLS)) {
|
||||
@@ -570,7 +570,7 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE)
|
||||
if (sys_focus_task)
|
||||
LBtr(&sys_focus_task->task_flags,TASKf_HAS_SONG);
|
||||
|
||||
timeout_val=WinCalcRefreshTimeout(was_forced);
|
||||
timeout_val=WinCalcRefreshTimeOut(was_forced);
|
||||
WinIPUpdate;
|
||||
LBts(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0);
|
||||
last_refresh_start_time=tT;
|
||||
@@ -620,7 +620,7 @@ public U0 WinMgrSync(I64 cnt=1,Bool force=FALSE)
|
||||
Bool old_preempt=Preempt(OFF),
|
||||
old_full_refresh,
|
||||
old_idle=LBts(&Fs->task_flags,TASKf_IDLE);
|
||||
CDoc *old_doc=DocCur;
|
||||
CDoc *old_doc=DocPut;
|
||||
I64 update_cnt;
|
||||
while (Bt(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0)) {
|
||||
if (force) {
|
||||
@@ -751,7 +751,6 @@ public Bool SetWinHorz(I64 left,I64 right,CTask *task=NULL)
|
||||
Cli; //TODO Multiprocessor safe
|
||||
if (task->win_left!=left || task->win_right!=right) {
|
||||
LBts(&task->display_flags,DISPLAYf_HAS_BEEN_RESIZED);
|
||||
LBts(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED);
|
||||
task->win_left=left;
|
||||
task->win_right=right;
|
||||
TaskDerivedValsUpdate(task);
|
||||
@@ -787,7 +786,6 @@ public Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL)
|
||||
Cli; //TODO Multiprocessor safe
|
||||
if (task->win_top!=top || task->win_bottom!=bottom) {
|
||||
LBts(&task->display_flags,DISPLAYf_HAS_BEEN_RESIZED);
|
||||
LBts(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED);
|
||||
task->win_top=top;
|
||||
task->win_bottom=bottom;
|
||||
TaskDerivedValsUpdate(task);
|
||||
@@ -799,57 +797,38 @@ public Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL)
|
||||
}
|
||||
}
|
||||
|
||||
Bool SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE)
|
||||
CDoc *SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE)
|
||||
{
|
||||
CDoc *doc;
|
||||
CDoc *result=NULL;
|
||||
Bool unlock;
|
||||
I64 x0,y0;
|
||||
if (!task) task=Fs;
|
||||
if (!TaskValidate(task)) return FALSE;
|
||||
if (task->win_top<=ipty<=task->win_bottom &&
|
||||
task->win_left <=iptx<=task->win_right) {
|
||||
doc=task->next_doc;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (set_cursor) {
|
||||
unlock=DocLock(doc);
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (doc->flags&DOCF_AUX_DOC) {
|
||||
doc->x=iptx-task->win_left;
|
||||
doc->y=ipty-task->win_top;
|
||||
DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR);
|
||||
} else {
|
||||
x0=doc->line_start_col;
|
||||
y0=doc->cur_top_line_num;
|
||||
DocRecalc(doc,TRUE);
|
||||
|
||||
doc->x=iptx-task->win_left-task->win_scroll_x/FONT_WIDTH +x0;
|
||||
doc->y=ipty-task->win_top -task->win_scroll_y/FONT_HEIGHT+y0;
|
||||
DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR);
|
||||
task->win_scroll_x=0;
|
||||
task->win_scroll_y=0;
|
||||
task->win_scroll_z=0;
|
||||
}
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) &&
|
||||
(!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) {
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
break;
|
||||
}
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
} else {
|
||||
if (unlock)
|
||||
DocUnlock(doc);
|
||||
break;
|
||||
}
|
||||
if (task->win_top <=ipty<=task->win_bottom &&
|
||||
task->win_left<=iptx<=task->win_right) {
|
||||
if ((result=DocDisplay(task)) && result->flags&DOCF_DONT_SHOW)
|
||||
result=NULL;
|
||||
else if (set_cursor) {
|
||||
unlock=DocLock(result);
|
||||
if (result->doc_signature!=DOC_SIGNATURE_VAL)
|
||||
result=NULL;
|
||||
else {
|
||||
x0=result->line_start_col;
|
||||
y0=result->cur_top_line_num;
|
||||
DocRecalc(result,TRUE);
|
||||
result->x=iptx-task->win_left-task->win_scroll_x/FONT_WIDTH +x0;
|
||||
result->y=ipty-task->win_top -task->win_scroll_y/FONT_HEIGHT+y0;
|
||||
DocRecalc(result,FALSE,DOC_RECALC_FIND_CURSOR);
|
||||
task->win_scroll_x=0;
|
||||
task->win_scroll_y=0;
|
||||
task->win_scroll_z=0;
|
||||
if (unlock)
|
||||
DocUnlock(result);
|
||||
}
|
||||
doc=doc->next_doc;
|
||||
}
|
||||
WinToTop(task);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U0 WinTileHorz()
|
||||
@@ -981,11 +960,11 @@ U0 WinChkMoveSize(CTask *task)
|
||||
{
|
||||
if (task->win_left!=task->win_old_left ||
|
||||
task->win_top!=task->win_old_top)
|
||||
QueMsg(task,0,
|
||||
TaskMsgQue(task,0,
|
||||
MSG_MOVE,task->win_left,task->win_top,0);
|
||||
if (task->win_right-task->win_left!=task->win_old_right-task->win_old_left ||
|
||||
task->win_bottom-task->win_top!=task->win_old_bottom-task->win_old_top)
|
||||
QueMsg(task,0,
|
||||
TaskMsgQue(task,0,
|
||||
MSG_RESIZE,task->win_right-task->win_left+1,task->win_bottom-task->win_top+1,0);
|
||||
task->win_old_left =task->win_left;
|
||||
task->win_old_right =task->win_right;
|
||||
@@ -1000,9 +979,9 @@ Bool WinKeyNavMenu()
|
||||
new_ipx,new_ipy;
|
||||
CMenu *m;
|
||||
CMenuEntry *tempme;
|
||||
CTask *focus=MenuTask;
|
||||
if (Bt(key_down_bitmap,SC_GUI) &&
|
||||
sys_focus_task &&
|
||||
(m=sys_focus_task->cur_menu)) {
|
||||
focus && (m=focus->cur_menu)) {
|
||||
win_show_menu=TRUE;
|
||||
sys_cur_submenu_entry=NULL;
|
||||
old_ipx=ipx; old_ipy=ipy;
|
||||
@@ -1062,7 +1041,7 @@ Bool WinKeyNavMenu()
|
||||
ipy=new_ipy=0;
|
||||
}
|
||||
if (sys_cur_submenu_entry) {
|
||||
QueMsg(sys_focus_task,0,
|
||||
TaskMsgQue(sys_focus_task,0,
|
||||
sys_cur_submenu_entry->msg_code,
|
||||
sys_cur_submenu_entry->p1,
|
||||
sys_cur_submenu_entry->p2,0);
|
||||
@@ -1094,7 +1073,7 @@ U0 WinMgrTask(I64)
|
||||
SetWinVert(0,TEXT_ROWS-1);
|
||||
LBts(&Fs->display_flags,DISPLAYf_NO_BORDER);
|
||||
LBts(&Fs->display_flags,DISPLAYf_SHOW);
|
||||
GrInit;
|
||||
GrInit4;
|
||||
LBts(&sys_run_level,RLf_WINMGR);
|
||||
while (TRUE) {
|
||||
try {
|
||||
@@ -1158,7 +1137,7 @@ wmt_start:
|
||||
while (ip_lb)
|
||||
WinMgrSleep(TRUE);
|
||||
if (sys_cur_submenu_entry) {
|
||||
QueMsg(sys_focus_task,0,
|
||||
TaskMsgQue(sys_focus_task,0,
|
||||
sys_cur_submenu_entry->msg_code,
|
||||
sys_cur_submenu_entry->p1,
|
||||
sys_cur_submenu_entry->p2,0);
|
||||
@@ -1321,26 +1300,16 @@ wmt_start:
|
||||
|
||||
if (!WinInhibit(WIf_IP_L)) {
|
||||
if (!old_ip_lb && ip_lb) {
|
||||
if (SetCursorPos(task,iptx,ipty)) {
|
||||
doc=task->next_doc;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
DocLock(doc);
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) &&
|
||||
(!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) {
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1 & DOCEF1_HAS_BORDER)
|
||||
doc_e->flags1|=DOCEF1_SOLID_BORDER;
|
||||
}
|
||||
}
|
||||
DocUnlock(doc);
|
||||
break;
|
||||
if (doc=SetCursorPos(task,iptx,ipty)) {
|
||||
DocLock(doc);
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1 & DOCEF1_HAS_BORDER)
|
||||
doc_e->flags1|=DOCEF1_SOLID_BORDER;
|
||||
}
|
||||
DocUnlock(doc);
|
||||
doc=doc->next_doc;
|
||||
}
|
||||
DocUnlock(doc);
|
||||
old_ip_lb=TRUE;
|
||||
goto wmt_start;
|
||||
}
|
||||
@@ -1358,13 +1327,13 @@ wmt_start:
|
||||
if (old_ip_lb && !ip_lb) {
|
||||
if (ipty==task->win_top-1) {
|
||||
if (task->win_left<=iptx<task->win_left+4) {
|
||||
QueMsg(task,0,MSG_KEY_DOWN,CH_CTRLM,0x43200000432,0);
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,CH_CTRLM,0x43200000432,0);
|
||||
old_ip_lb=FALSE;
|
||||
goto wmt_start;
|
||||
} else if (task->win_right-2<=iptx<=task->win_right) {
|
||||
if (Bt(&task->display_flags,DISPLAYf_HAS_CLOSE_WIN)) {
|
||||
if (DocCur(task))
|
||||
QueMsg(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0);
|
||||
if (DocPut(task))
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0);
|
||||
else
|
||||
Kill(task,FALSE);
|
||||
old_ip_lb=FALSE;
|
||||
@@ -1376,39 +1345,30 @@ wmt_start:
|
||||
}
|
||||
if (!WinInhibit(WIf_IP_L)) {
|
||||
if (old_ip_lb && !ip_lb) {
|
||||
if (SetCursorPos(task,iptx,ipty,FALSE)) {
|
||||
doc=task->next_doc;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) &&
|
||||
(!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) {
|
||||
do msg_code=WinMgrSleep;
|
||||
while (TaskValidate(task) &&
|
||||
(ip_lb || left_ip_dbl_time));
|
||||
if (TaskValidate(task)) {
|
||||
if (msg_code==MSG_IP_L_UP) {
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
DocLock(doc);
|
||||
if (TaskValidate(task)) {
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1 & DOCEF1_HAS_BORDER)
|
||||
doc_e->flags1&=~DOCEF1_SOLID_BORDER;
|
||||
if (doc_e->flags1 & (DOCEF1_TREE|DOCEF1_LINK|DOCEF1_CHECK_COLLAPSABLE|
|
||||
DOCEF1_LEFT_CB|DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP))
|
||||
QueMsg(task,0,MSG_KEY_DOWN,CH_SPACE,0,0);
|
||||
}
|
||||
}
|
||||
DocUnlock(doc);
|
||||
if (doc=SetCursorPos(task,iptx,ipty,FALSE)) {
|
||||
do msg_code=WinMgrSleep;
|
||||
while (TaskValidate(task) &&
|
||||
(ip_lb || left_ip_dbl_time));
|
||||
if (TaskValidate(task)) {
|
||||
if (msg_code==MSG_IP_L_UP) {
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL) {
|
||||
DocLock(doc);
|
||||
if (TaskValidate(task)) {
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1 & DOCEF1_HAS_BORDER)
|
||||
doc_e->flags1&=~DOCEF1_SOLID_BORDER;
|
||||
if (doc_e->flags1 & (DOCEF1_TREE|DOCEF1_LINK|DOCEF1_CHECK_COLLAPSABLE|
|
||||
DOCEF1_LEFT_CB|DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP))
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SPACE,0,0);
|
||||
}
|
||||
}
|
||||
} else if (msg_code==MSG_IP_L_D_UP)
|
||||
QueMsg(task,0,MSG_KEY_DOWN,CH_ESC,0,0);
|
||||
DocUnlock(doc);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
doc=doc->next_doc;
|
||||
} else if (msg_code==MSG_IP_L_D_UP)
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,CH_ESC,0,0);
|
||||
}
|
||||
old_ip_lb=FALSE;
|
||||
goto wmt_start;
|
||||
@@ -1418,37 +1378,28 @@ wmt_start:
|
||||
|
||||
if (!WinInhibit(WIf_IP_R)) {
|
||||
if (old_ip_rb && !ip_rb) {
|
||||
if (SetCursorPos(task,iptx,ipty,FALSE)) {
|
||||
doc=task->next_doc;
|
||||
while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) &&
|
||||
doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
if (!(doc->flags&DOCF_DONT_SHOW) &&
|
||||
(!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) {
|
||||
do msg_code=WinMgrSleep;
|
||||
while (TaskValidate(task) &&
|
||||
(ip_rb || right_ip_dbl_time));
|
||||
if (TaskValidate(task)) {
|
||||
if (msg_code==MSG_IP_R_UP) {
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
DocLock(doc);
|
||||
if (TaskValidate(task)) {
|
||||
if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1&(DOCEF1_LINK|
|
||||
DOCEF1_RIGHT_CB|DOCEF1_RIGHT_MACRO|DOCEF1_RIGHT_EXP))
|
||||
QueMsg(task,0,MSG_KEY_DOWN,'\n',0,0);
|
||||
}
|
||||
}
|
||||
DocUnlock(doc);
|
||||
if (doc=SetCursorPos(task,iptx,ipty,FALSE)) {
|
||||
do msg_code=WinMgrSleep;
|
||||
while (TaskValidate(task) &&
|
||||
(ip_rb || right_ip_dbl_time));
|
||||
if (TaskValidate(task)) {
|
||||
if (msg_code==MSG_IP_R_UP) {
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL) {
|
||||
DocLock(doc);
|
||||
if (TaskValidate(task)) {
|
||||
if (doc->doc_signature==DOC_SIGNATURE_VAL) {
|
||||
doc_e=doc->cur_entry;
|
||||
if (doc_e!=doc) {
|
||||
if (doc_e->flags1&(DOCEF1_LINK|
|
||||
DOCEF1_RIGHT_CB|DOCEF1_RIGHT_MACRO|DOCEF1_RIGHT_EXP))
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,'\n',0,0);
|
||||
}
|
||||
}
|
||||
} else if (msg_code==MSG_IP_R_D_UP)
|
||||
QueMsg(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0);
|
||||
DocUnlock(doc);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
doc=doc->next_doc;
|
||||
} else if (msg_code==MSG_IP_R_D_UP)
|
||||
TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0);
|
||||
}
|
||||
old_ip_rb=FALSE;
|
||||
goto wmt_start;
|
||||
|
||||
@@ -257,7 +257,7 @@ public U0 WSDDisplayDefs(CDoc *doc,U8 *st,I64 num=-1)
|
||||
U0 WSDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL)
|
||||
{
|
||||
U8 *buf;
|
||||
buf=MSPrintF("WSDDisplayDefs(DocCur,\"%s\",%d);View;",st,num);
|
||||
buf=MSPrintF("WSDDisplayDefs(DocPut,\"%s\",%d);View;",st,num);
|
||||
PopUp(buf,parent);
|
||||
Free(buf);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ and #include this file.
|
||||
|
||||
I ran $LK-A,"::/TempleOS/Misc/Dollar.CPP"$ on it, first.
|
||||
|
||||
See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (20).
|
||||
See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$.
|
||||
*/
|
||||
|
||||
I64 WSDNextCmd(U8 **_ptr)
|
||||
|
||||
@@ -319,12 +319,10 @@ U0 WSSingleFileAdd(U8 *buf,I64 pass)
|
||||
ptr--;
|
||||
while (TRUE) {
|
||||
if (ch=*ptr2++) {
|
||||
if (ch!=CH_CURSOR) {
|
||||
if (!Bt(alpha_numeric_bitmap,ch))
|
||||
break;
|
||||
else
|
||||
*ptr3++=ch;
|
||||
}
|
||||
if (Bt(alpha_numeric_bitmap,ch))
|
||||
*ptr3++=ch;
|
||||
else if (ch!=CH_CURSOR)
|
||||
break;
|
||||
} else {
|
||||
ptr2--;
|
||||
break;
|
||||
@@ -460,7 +458,7 @@ U0 WSPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task)
|
||||
CHashWS *w2;
|
||||
F64 timeout_time=tS+0.5;
|
||||
CHashSrcSym *temph;
|
||||
CDoc *doc=DocCur;
|
||||
CDoc *doc=DocPut;
|
||||
|
||||
src=DocGetLine(focus_l,doc_e,&data_col);
|
||||
DocUnlock(focus_l);
|
||||
@@ -503,8 +501,9 @@ pc_done:
|
||||
DocRst(doc,TRUE);
|
||||
doc->flags|=DOCF_MIN_SIZE;
|
||||
DocCursor;
|
||||
DocCurAttr(LTBLUE<<4+WHITE);
|
||||
DocAuxAttr(LTBLUE<<4+BLACK);
|
||||
Fs->text_attr=LTBLUE<<4+WHITE;
|
||||
Fs->border_src =BDS_CONST;
|
||||
Fs->border_attr=LTBLUE<<4+BLACK;
|
||||
DocPrintF(doc,"Word:%s\n",ws_cur_word);
|
||||
for (i=0;i<ws_num_fillins;i++) {
|
||||
st=ws_sorted_words[ws_fillin_matches[i]]->str;
|
||||
@@ -543,12 +542,11 @@ U0 WSTask(I64)
|
||||
original_focus_task=focus_task=sys_focus_task;
|
||||
while (TaskValidate(focus_task) && Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK))
|
||||
focus_task=focus_task->parent_task;
|
||||
if (TaskValidate(focus_task) && (doc=DocCur(focus_task)) &&
|
||||
if (TaskValidate(focus_task) && (doc=DocPut(focus_task)) &&
|
||||
focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) {
|
||||
DocLock(doc);
|
||||
if (TaskValidate(focus_task) && original_focus_task==sys_focus_task &&
|
||||
doc->doc_signature==DOC_SIGNATURE_VAL && doc==DocCur(focus_task) &&
|
||||
(doc_e=doc->cur_entry)) {
|
||||
doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) {
|
||||
if (doc_e==doc) doc_e=doc_e->last;
|
||||
while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE ||
|
||||
doc_e->type_u8==DOCT_SOFT_NEW_LINE))
|
||||
|
||||
Reference in new issue
Block a user