JD2022-TU1/main/extern/Camcam/LIBS/Input/TEXT_IO.cpp

555 lines
No EOL
13 KiB
C++

#include "SCENE.h"
#include "TRACK.h"
#include "MEDIA.h"
int AddfonRes(char *Str)
{
return AddFontResourceEx((LPCSTR)Str,FR_PRIVATE,(PVOID)0);
}
int TEXT_Grabber::END(void)
{
if (TEXT) CC_free(TEXT);
TEXT = NULL;
Image.Delete();
return 0;
}
u32 BSWAP_UPPER(u32 Code)
{
u32 ReturnV;
ReturnV = 0;
ReturnV |= Upper((Code >> 24) & 0xff)<<0;
ReturnV |= Upper((Code >> 16) & 0xff)<<8;
ReturnV |= Upper((Code >> 8) & 0xff)<<16;
ReturnV |= Upper((Code >> 0) & 0xff)<<24;
return ReturnV;
}
u32 POPNUM(char **NUMB)
{
u32 ReturnV;
ReturnV = 0;
while (**NUMB == ' ') {(*NUMB)++;};
while ((**NUMB >= '0') && (**NUMB <= '9'))
{
ReturnV *= 10;
ReturnV += **NUMB - '0';
(*NUMB)++;
}
return ReturnV;
}
u32 POPNUMH(char **NUMB)
{
u32 ReturnV;
ReturnV = 0;
while (**NUMB == ' ') {(*NUMB)++;};
while (((**NUMB >= '0') && (**NUMB <= '9')) || ((Upper(**NUMB) >= 'A') && (Upper(**NUMB) <= 'F')))
{
ReturnV <<= 4;
if (Upper(**NUMB) >= 'A')
ReturnV += Upper(**NUMB) - 'A' + 10;
else
ReturnV += **NUMB - '0';
(*NUMB)++;
}
return ReturnV;
}
#define DEFAULT_TEXT_PARRAMS "$$HCNT 0;VCNT 0;LINH 0;MULT 0;FONT 0;NUMB 0;PASS 0;EDIT 0;PIXW 256;PIXH 32;COLF FFFFFFFF;COLB 0;CELF FFFFFFFF;CELB 0$$\n"
char*TEXT_Grabber::ComputeParrams(char*Parrams)
{
if (*(u16*)Parrams == '$$')
{
Parrams += 2;
u32 OK = 1;
TT.AutoSizeX=TT.AutoSizeY=0;
ColorFront = ColorFront_EDIT = 0xffffffff;
ColorBack = ColorBack_EDIT = 0xff000000;
while (OK)
{
u32 Code;
Code = BSWAP_UPPER(*(u32*)Parrams);
Parrams += 4;
switch (Code)
{
case 'HCNT':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.HCentered = 0;
else TT.HCentered = 1;
break;
case 'VCNT':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.VCentered = 0;
else TT.VCentered = 1;
break;
case 'MULT':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.Multiline = 0;
else TT.Multiline = 1;
break;
case 'FONT':
while (*Parrams == ' ') {Parrams++;};
break;
case 'NUMB':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.IsNumber = 0;
else TT.IsNumber = 1;
break;
case 'EDIT':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.Editable = 0;
else TT.Editable = 1;
break;
case 'TEXT':
return Parrams;
case 'PIXW':
ulTextW_Pixels = POPNUM(&Parrams);
if (ulTextW_Pixels == 0)
TT.AutoSizeX=1;
break;
case 'PIXH':
ulTextH_Pixels = POPNUM(&Parrams);
if (ulTextH_Pixels == 0)
TT.AutoSizeY=1;
break;
case 'COLF':
ColorFront = POPNUMH(&Parrams);
break;
case 'COLB':
ColorBack = POPNUMH(&Parrams);
break;
case 'CELF':
ColorFront_EDIT = POPNUMH(&Parrams);
break;
case 'CELB':
ColorBack_EDIT = POPNUMH(&Parrams);
break;
case 'LINH':
InterlineSize = POPNUMH(&Parrams);
break;
case 'PASS':
while (*Parrams == ' ') {Parrams++;};
if (*Parrams == '0') TT.Password = 0;
else TT.Password = 1;
break;
break;
default:
Parrams -= 4;
if ((*Parrams == 0) || (*Parrams == '\n')|| (*Parrams == '\r'))
OK = 0;
break;
}
if (*Parrams) Parrams ++;
}
}
return Parrams;
}
void TEXT_Grabber::ComputeTextSize()
{
u32 ulTextWCurrent;
ulTextWCurrent = ulTextH = ulTextW = 0;
ulTextW = ulTextH = 1;
if (TEXT && ulTextLenght)
{
if (((FontIndex != -1)) && pScene && pScene->DI && (pScene->ID_MEDIA[FontIndex]->GetType() == IOtype_FONT))
{
POINT TextSize;
SIZE *CharBounds = (SIZE *) pScene->ID_MEDIA[FontIndex]->GetData(0);
pScene->DI->GetTextSize((u8 *)TEXT,(int*)&TextSize.x,(int*)&TextSize.y,CharBounds);
if (TT.AutoSizeX) ulTextW_Pixels = 0;
if (TT.AutoSizeY) ulTextH_Pixels = 0;
if (ulTextH_Pixels == 0) ulTextH_Pixels = TextSize.y + 4;
if (ulTextW_Pixels == 0) ulTextW_Pixels = TextSize.x + 4;
}
else
{
u32 TC = 0;
while( TEXT[TC])
{
if (TEXT[TC] == '\n')
{
ulTextH++;
ulTextWCurrent=1;
} else
ulTextWCurrent++;
if (ulTextWCurrent > ulTextW) ulTextW = ulTextWCurrent;
TC++;
}
if (TT.AutoSizeX) ulTextW_Pixels = 0;
if (TT.AutoSizeY) ulTextH_Pixels = 0;
if (ulTextH_Pixels == 0) ulTextH_Pixels = ulTextH * 16 + 4;
if (ulTextW_Pixels == 0) ulTextW_Pixels = ulTextW * 8 + 4;
}
}
if (ulTextH_Pixels>512) ulTextH_Pixels=512;
if (ulTextW_Pixels>1024) ulTextW_Pixels=1024;
}
u32 TEXT_Grabber::SetFont(u32 FontI)
{
char TEXTSAVE[4096];
if (FontIndex != FontI)
{
FontIndex = FontI;
strcpy(TEXTSAVE,TEXT);
UPDATETEXT(TEXTSAVE);
}
return 0;
}
u32 TEXT_Grabber::UPDATETEXT(char *NewTEXT)
{
/* Reset old text */
if (TEXT)
{
//if (strcmp(TEXT,NewTEXT) == 0) return 0;
CC_free(TEXT);
}
TEXT = NULL;
ulTextLenght = strlen(NewTEXT)*2 + 8;
TEXT = (char*)CC_malloc(ulTextLenght*1);
u32 TB;
TB = 0;
/* Treat endtry string according to media feature (multiline, number ...) */
if (TT.Multiline)
{
while (*NewTEXT)
{
if (*NewTEXT != '\r')
{
if ((!TT.IsNumber) || ((*NewTEXT>='0') && (*NewTEXT<='9')))
{
if (*NewTEXT == 9) // TAB CODE
TEXT[TB++] = ' ';
else
TEXT[TB++] = *NewTEXT;
}
}
NewTEXT++;
}
} else
{
if (*NewTEXT == '\r') *NewTEXT = '\n';
while (*NewTEXT && (*NewTEXT != '\n'))
{
if ((!TT.IsNumber) || ((*NewTEXT>='0') && (*NewTEXT<='9')))
{
if (*NewTEXT == 9) // TAB CODE
TEXT[TB++] = ' ';
else
TEXT[TB++] = *NewTEXT;
}
NewTEXT++;
}
}
TEXT[TB] = 0;
ComputeTextSize();
u32 MustRecompute = 0;
if (Image.SetSize(ulTextW_Pixels, ulTextH_Pixels))
MustRecompute = 1;
u32 EditMode;
DrwTEXT_UI D_UILocal;
memset(&D_UILocal,0,sizeof(DrwTEXT_UI));
EditMode = 0;
if (pScene && (pScene->pTG == this))
{
D_UILocal = pScene->D_UI;
EditMode = 1;
}
D_UILocal.HCenter = TT.HCentered;
D_UILocal.ColorFront = ColorFront;
D_UILocal.ColorBack = ColorBack;
D_UILocal.ModePassword = TT.Password;
/* */
u32 Counter = Image.SX * Image.SY;
s32 *pBASE = Image.GetBase();
while (Counter--) pBASE[Counter] = D_UILocal.ColorBack;
char *TEXTParser,*TEXTParserEnd,TEXTParserEndSave;
u32 OriginalL,LinNumber,LinVSize,CursorPosInLine,PosInLine;
s32 CurrentCursorLine;
OriginalL = strlen(TEXT);
TEXT[OriginalL] = ' ';
TEXT[OriginalL+1] = 0;
LinNumber = 0;
CurrentCursorLine = 0;
CursorPosInLine = 0;
PosInLine = 0 ;
TEXTParser = TEXT;
D_UILocal.CursorPosUP = D_UILocal.CursorPosDown = D_UILocal.CursorPos;
D_UILocal.FONT_CharBounds = NULL;
D_UILocal.FONT_CharPos = NULL;
D_UILocal.FONT_Image = NULL;
D_UILocal.FONT_AlphaMode = 0;
LinVSize = InterlineSize;
if (FontIndex != -1)
{
if (pScene && (pScene->ID_MEDIA[FontIndex]->GetType() == IOtype_FONT))
{
D_UILocal.FONT_CharBounds = (SIZE*)pScene->ID_MEDIA[FontIndex]->GetData(0);
D_UILocal.FONT_CharPos = (SIZE*)pScene->ID_MEDIA[FontIndex]->GetData(1);
D_UILocal.FONT_Image = &pScene->ID_MEDIA[FontIndex]->Image;
D_UILocal.FONT_AlphaMode = (u32)(pScene->ID_MEDIA[FontIndex]->GetData(2)) & 1<<5;
D_UILocal.FONT_Metrix = (TEXTMETRIC *)pScene->ID_MEDIA[FontIndex]->GetData(3);
if (LinVSize == 0)
LinVSize = D_UILocal.FONT_Metrix->tmHeight;
}
}
if (LinVSize == 0)
{
LinVSize = 16;
}
if (EditMode)
{
D_UILocal.ColorFront = ColorFront_EDIT;
D_UILocal.ColorBack = ColorBack_EDIT;
} //else
// D_UILocal.CursorPos = strlen(TEXT);
{
D_UILocal.X = 0;
D_UILocal.Y = Image.SY-LinVSize;
}
while (*(TEXTParser))
{
if (D_UILocal.CursorPos == TEXTParser - TEXT)
{
CurrentCursorLine = LinNumber;
CursorPosInLine = PosInLine;
}
PosInLine++;
if (*(TEXTParser) == '\n')
{
if (D_UILocal.CursorPos > TEXTParser - TEXT) D_UILocal.CursorPosUP = TEXTParser - TEXT - PosInLine + 1;
if ((D_UILocal.CursorPos <= TEXTParser - TEXT) &&
(D_UILocal.CursorPosDown == D_UILocal.CursorPos))
D_UILocal.CursorPosDown = (TEXTParser - TEXT) + 1;
LinNumber++;
PosInLine=0;
}
TEXTParser++;
}
if (D_UILocal.CursorPosUP >= strlen(TEXT)) D_UILocal.CursorPosUP = strlen(TEXT);
if (D_UILocal.CursorPosDown >= strlen(TEXT)) D_UILocal.CursorPosDown = strlen(TEXT);
while (CursorPosInLine--)
{
if (TEXT[D_UILocal.CursorPosUP] && TEXT[D_UILocal.CursorPosUP]!='\n')
D_UILocal.CursorPosUP++;
if (TEXT[D_UILocal.CursorPosDown] && TEXT[D_UILocal.CursorPosDown]!='\n')
D_UILocal.CursorPosDown++;
}
if (TT.VCentered)
{
if (D_UILocal.FONT_CharBounds) // Anti-bug ;-(
D_UILocal.Y = (Image.SY>>1)-(LinVSize>>1) + ((LinVSize *LinNumber)>>1);
else
D_UILocal.Y = (Image.SY>>1)-(8) + ((LinVSize *LinNumber)>>1);
}
if (EditMode && TT.Multiline)
{
CurrentCursorLine = D_UILocal.Y - LinVSize * CurrentCursorLine;
if (CurrentCursorLine < 0)
D_UILocal.Y -= CurrentCursorLine;
if (CurrentCursorLine > (int)(Image.SY-LinVSize))
D_UILocal.Y -= CurrentCursorLine - (Image.SY-LinVSize);
}
int SaveY;
TEXTParser = TEXT;
SaveY = D_UILocal.Y;
while (*TEXTParser)
{
char LocalCPY[2048];
TEXTParserEnd = TEXTParser;
while (*TEXTParserEnd && (*TEXTParserEnd != '\n')) TEXTParserEnd++;
if (*TEXTParserEnd == '\n') TEXTParserEnd++;
TEXTParserEndSave = *TEXTParserEnd;
*TEXTParserEnd = 0;
strcpy(LocalCPY,TEXTParser);
for (int i = 0 ; i < strlen(LocalCPY);i++)
{
if (LocalCPY[i] == '\n') LocalCPY[i] = ' ';
}
D_UILocal.DontDraw = 1;
/* Draw in hiden mode to compute BV */
D_UILocal.CurrentCursorPos = TEXTParser - TEXT;
DRawTEXT_UserInterface((u8*)LocalCPY,(u32*)Image.GetBase(),(u32)Image.PITCH, (u32)Image.SY, &D_UILocal);
if (TT.HCentered)
{
D_UILocal.X = (Image.SX>>1) - ((D_UILocal.XEnd - D_UILocal.X)>>1);
D_UILocal.CurrentCursorPos = TEXTParser - TEXT;
DRawTEXT_UserInterface((u8*)LocalCPY,(u32*)Image.GetBase(),(u32)Image.PITCH, (u32)Image.SY, &D_UILocal);
}
/* then centering on computed BV */
if (EditMode)
{
if (D_UILocal.CursorPosX > (s32)ulTextW_Pixels - 8) D_UILocal.X -= D_UILocal.CursorPosX - ulTextW_Pixels + 8;
if (D_UILocal.CursorPosX < (s32)2) D_UILocal.X += (s32)2 - D_UILocal.CursorPosX ;
}
else D_UILocal.CursorPos = D_UILocal.SelStart = D_UILocal.SelEnd = -1;
D_UILocal.DontDraw = 0;
D_UILocal.CurrentCursorPos = TEXTParser - TEXT;
DRawTEXT_UserInterface((u8*)LocalCPY,(u32*)Image.GetBase(),(u32)Image.PITCH, (u32)Image.SY, &D_UILocal);
TEXTParser = TEXTParserEnd;
*TEXTParserEnd = TEXTParserEndSave;
D_UILocal.Y -= LinVSize;
}
D_UILocal.Y = SaveY;
TEXT[OriginalL] = 0;
if (EditMode) pScene->D_UI = D_UILocal;
if (ulAssociatedTextureIndex != -1)
{
if (MustRecompute)
{
pScene->DI->DestroyTexture(ulAssociatedTextureIndex);
ulAssociatedTextureIndex = pScene->DI->CreateTexture(&Image,ulColorMode);
}
pScene->DI->UpdateTexture_BM_2_HW(ulAssociatedTextureIndex, false);
}
return 1;
}
u32 TEXT_Grabber::LOADTEXT(MAP *RefMap,char *Filename)
{
FILE *F;
char NewTEXT[2048];
ulTextLenght = strlen(Filename);
if ((GetFileNameExtend(Filename) == 'TEXT') && (ulTextLenght > 6) && (Filename[ulTextLenght - 5] != '.'))
{
/* this is not a file */
strcpy(NewTEXT,Filename);
NewTEXT[ulTextLenght-5] = 0;
} else
{
F = GetSceneFileHanler(Filename);//,"rb");
if (!F) return 0;
ulTextLenght = GetFileLenght(Filename) + 1;
if (ulTextLenght > 2040) ulTextLenght = 2040;
fread(NewTEXT,1,ulTextLenght-1,F);
NewTEXT[ulTextLenght-1] = 0;
CC_fclose(F);
/* interpret NewTEXT */
{
if (*(u16*)NewTEXT != '$$')
{
FILE *GetSceneFileHanler_SAVE(char *Name);
/* Resave with Default Parrams */
F = GetSceneFileHanler_SAVE(Filename);
if (F)
{
char DefaultText[] = DEFAULT_TEXT_PARRAMS;
fwrite(DefaultText,1,strlen(DefaultText),F);
fwrite(NewTEXT,1,strlen(NewTEXT),F);
CC_fclose(F);
/* ReloadIt */
F = GetSceneFileHanler(Filename);//,"rb");
if (!F) return 0;
ulTextLenght = GetFileLenght(Filename) + 1;
if (ulTextLenght > 2040) ulTextLenght = 2040;
fread(NewTEXT,1,ulTextLenght-1,F);
NewTEXT[ulTextLenght-1] = 0;
CC_fclose(F);
}
}
}
}
if (*(u16*)NewTEXT == '$$')
/* Interpret parrams... */
UPDATETEXT(ComputeParrams((char*)NewTEXT));
else
UPDATETEXT(NewTEXT);
return 1;
}
int TEXT_Grabber::FRAME(void)
{
if (pScene && (pScene->pTG == this))
{
ulFileAsbeenTouched = 0;
UPDATETEXT(pScene -> CurrentlyEditedText);
return 0;
}//*/
if (ulFileAsbeenTouched)
{
if (LOADTEXT(&Image,(char*)MediaName))
{
ulFileAsbeenTouched = 0;
return 1;
} else
return 0;
}
return 0;
};
INPUT_IO *TEXT_CREATE(WORLD *pScene,char *Filename)
{
INPUT_IO *Ret;
u32 Fl;
u8 *Fi;
// Fl = GetFileLenght(Filename);
// if (Fl)
{
Ret = (INPUT_IO *)new(TEXT_Grabber);
((TEXT_Grabber *)Ret)->pScene = pScene;
((TEXT_Grabber *)Ret)->ulAssociatedTextureIndex = -1;
memset(&Ret->Image, 0, sizeof(Ret->Image));
memset(&((TEXT_Grabber *)Ret)->TT,0,sizeof(TEXTType));
((TEXT_Grabber *)Ret)->TT.VCentered = 1;
((TEXT_Grabber *)Ret)->TT.HCentered = 1;
((TEXT_Grabber *)Ret)->TT.Multiline = 0;
((TEXT_Grabber *)Ret)->TT.IsNumber = 0;
((TEXT_Grabber *)Ret)->TT.Editable = 1;
((TEXT_Grabber *)Ret)->TT.AutoSizeX=1;
((TEXT_Grabber *)Ret)->TT.AutoSizeY=1;
((TEXT_Grabber *)Ret)->FontIndex = -1;
((TEXT_Grabber *)Ret)->TEXT = NULL;
if (((TEXT_Grabber *)Ret)->LOADTEXT(&Ret->Image,Filename))
{
Ret->dTotalTime = 0;
Ret->dAvgFramePerSecond = 30.0;
strcpy((char*)Ret->MediaName,Filename);
return (INPUT_IO *)Ret;
}
}
return ERROR_CREATE("TEXT file\nnot Found!");
}