本文整理汇总了C++中CFile::Length方法的典型用法代码示例。如果您正苦于以下问题:C++ CFile::Length方法的具体用法?C++ CFile::Length怎么用?C++ CFile::Length使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CFile
的用法示例。
在下文中一共展示了CFile::Length方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PiggyInitPigFile
//------------------------------------------------------------------------------
//initialize a pigfile, reading headers
//returns the size of all the bitmap data
void PiggyInitPigFile (char *filename)
{
CFile *cfP = cfPiggy + gameStates.app.bD1Data;
char szName [16];
char szNameRead [16];
char szPigName [FILENAME_LEN];
int nHeaderSize, nBitmapNum, nDataSize, nDataStart, i;
grsBitmap bmTemp;
tPIGBitmapHeader bmh;
PiggyCloseFile (); //close old pig if still open
strcpy (szPigName, filename);
//rename pigfile for shareware
if (!stricmp (DEFAULT_PIGFILE, DEFAULT_PIGFILE_SHAREWARE) &&
!CFile::Exist (szPigName, gameFolders.szDataDir, 0))
strcpy (szPigName, DEFAULT_PIGFILE_SHAREWARE);
strlwr (szPigName);
if (!cfP->Open (szPigName, gameFolders.szDataDir, "rb", 0)) {
#ifdef EDITOR
return; //if editor, ok to not have pig, because we'll build one
#else
if (!CopyPigFileFromCD (*cfP, szPigName))
return;
#endif
}
int pig_id = cfP->ReadInt ();
int pigVersion = cfP->ReadInt ();
if (pig_id != PIGFILE_ID || pigVersion != PIGFILE_VERSION) {
cfP->Close (); //out of date pig
return;
}
strncpy (szCurrentPigFile [0], szPigName, sizeof (szCurrentPigFile [0]));
nBitmapNum = cfP->ReadInt ();
nHeaderSize = nBitmapNum * sizeof (tPIGBitmapHeader);
nDataStart = nHeaderSize + cfP->Tell ();
nDataSize = cfP->Length () - nDataStart;
gameData.pig.tex.nBitmaps [0] = 1;
for (i = 0; i < nBitmapNum; i++) {
PIGBitmapHeaderRead (&bmh, *cfP);
memcpy (szNameRead, bmh.name, 8);
szNameRead [8] = 0;
if (bmh.dflags & DBM_FLAG_ABM)
sprintf (szName, "%s#%d", szNameRead, bmh.dflags & DBM_NUM_FRAMES);
else
strcpy (szName, szNameRead);
memset (&bmTemp, 0, sizeof (grsBitmap));
bmTemp.bmProps.w = bmTemp.bmProps.rowSize = bmh.width + ((short) (bmh.wh_extra & 0x0f) << 8);
bmTemp.bmProps.h = bmh.height + ((short) (bmh.wh_extra & 0xf0) << 4);
bmTemp.bmProps.flags |= BM_FLAG_PAGED_OUT;
bmTemp.bmAvgColor = bmh.bmAvgColor;
gameData.pig.tex.bitmapFlags [0][i+1] = bmh.flags & BM_FLAGS_TO_COPY;
bitmapOffsets [0][i+1] = bmh.offset + nDataStart;
Assert ((i+1) == gameData.pig.tex.nBitmaps [0]);
PiggyRegisterBitmap (&bmTemp, szName, 1);
}
bPigFileInitialized = 1;
}
示例2: PiggyInitPigFile
//------------------------------------------------------------------------------
//initialize a pigfile, reading headers
//returns the size of all the bitmap data
void PiggyInitPigFile (char *filename)
{
CFile *cfP = cfPiggy + gameStates.app.bD1Data;
char szName [16];
char szNameRead [16];
char szPigName [FILENAME_LEN];
int nHeaderSize, nBitmapNum, nDataSize, nDataStart, i;
CBitmap bm;
tPIGBitmapHeader bmh;
PiggyCloseFile (); //close old pig if still open
strcpy (szPigName, filename);
//rename pigfile for shareware
if (!stricmp (DefaultPigFile (), DefaultPigFile (1)) &&
!CFile::Exist (szPigName, gameFolders.szDataDir, 0))
strcpy (szPigName, DefaultPigFile (1));
strlwr (szPigName);
if (!cfP->Open (szPigName, gameFolders.szDataDir, "rb", 0)) {
if (!CopyPigFileFromCD (*cfP, szPigName))
return;
}
int pig_id = cfP->ReadInt ();
int pigVersion = cfP->ReadInt ();
if (pig_id != PIGFILE_ID || pigVersion != PIGFILE_VERSION) {
cfP->Close (); //out of date pig
return;
}
strncpy (szCurrentPigFile [0], szPigName, sizeof (szCurrentPigFile [0]));
nBitmapNum = cfP->ReadInt ();
nHeaderSize = nBitmapNum * sizeof (tPIGBitmapHeader);
nDataStart = nHeaderSize + cfP->Tell ();
nDataSize = cfP->Length () - nDataStart;
gameData.pig.tex.nBitmaps [0] = 1;
for (i = 0; i < nBitmapNum; i++) {
PIGBitmapHeaderRead (&bmh, *cfP);
memcpy (szNameRead, bmh.name, 8);
szNameRead [8] = 0;
if (bmh.dflags & DBM_FLAG_ABM)
sprintf (szName, "%s#%d", szNameRead, bmh.dflags & DBM_NUM_FRAMES);
else
strcpy (szName, szNameRead);
memset (&bm, 0, sizeof (CBitmap));
bm.SetWidth (bmh.width + ((short) (bmh.wh_extra & 0x0f) << 8));
bm.SetHeight (bmh.height + ((short) (bmh.wh_extra & 0xf0) << 4));
bm.SetBPP (1);
bm.SetFlags (BM_FLAG_PAGED_OUT);
bm.SetAvgColorIndex (bmh.avgColor);
gameData.pig.tex.bitmapFlags [0][i+1] = bmh.flags & BM_FLAGS_TO_COPY;
bitmapOffsets [0][i+1] = bmh.offset + nDataStart;
Assert ((i+1) == gameData.pig.tex.nBitmaps [0]);
PiggyRegisterBitmap (&bm, szName, 1);
}
bPigFileInitialized = 1;
}
示例3: Init
int CSubTitles::Init (const char* filename)
{
CFile cf;
int size, readCount;
ubyte *p;
int bHaveBinary = 0;
m_nCaptions = 0;
if (!gameOpts->movies.bSubTitles)
return 0;
if (!cf.Open (filename, gameFolders.szDataDir, "rb", 0)) { // first try text version
char filename2 [FILENAME_LEN]; //no text version, try binary version
CFile::ChangeFilenameExtension (filename2, filename, ".txb");
if (!cf.Open (filename2, gameFolders.szDataDir, "rb", 0))
return 0;
bHaveBinary = 1;
}
size = cf.Length ();
m_rawDataP = new ubyte [size+1];
readCount = (int) cf.Read (m_rawDataP, 1, size);
cf.Close ();
m_rawDataP [size] = 0;
if (readCount != size) {
delete[] m_rawDataP;
return 0;
}
p = m_rawDataP;
while (p && (p < m_rawDataP + size)) {
char* endp = strchr (reinterpret_cast<char*> (p), '\n');
if (endp) {
if (endp [-1] == '\r')
endp [-1] = 0; //handle 0d0a pair
*endp = 0; //string termintor
}
if (bHaveBinary)
DecodeTextLine (reinterpret_cast<char*> (p));
if (*p != ';') {
m_captions [m_nCaptions].first_frame = atoi (reinterpret_cast<char*> (p));
if (!(p = NextField (p)))
continue;
m_captions [m_nCaptions].last_frame = atoi (reinterpret_cast<char*> (p));
if (!(p = NextField (p)))
continue;
m_captions [m_nCaptions].msg = reinterpret_cast<char*> (p);
Assert (m_nCaptions==0 || m_captions [m_nCaptions].first_frame >= m_captions [m_nCaptions-1].first_frame);
Assert (m_captions [m_nCaptions].last_frame >= m_captions [m_nCaptions].first_frame);
m_nCaptions++;
}
p = reinterpret_cast<ubyte*> (endp + 1);
}
return 1;
}
示例4: AddPalette
/* calculate table to translate d1 bitmaps to current palette,
* return -1 on error
*/
ubyte *LoadD1Palette (void)
{
tPalette palette;
CFile cf;
if (!cf.Open (D1_PALETTE, gameFolders.szDataDir, "rb", 1) || (cf.Length () != 9472))
return NULL;
cf.Read (palette, 256, 3);
cf.Close ();
palette [254] = SUPER_TRANSP_COLOR;
palette [255] = TRANSPARENCY_COLOR;
return d1Palette = AddPalette (palette);
}
示例5: AddPalette
ubyte *GrUsePaletteTable (const char *pszFile, const char *pszLevel)
{
CFile cf;
int i = 0, fsize;
tPalette palette;
#ifdef SWAP_0_255
ubyte c;
#endif
if (pszLevel) {
char ifile_name [FILENAME_LEN];
CFile::ChangeFilenameExtension (ifile_name, pszLevel, ".pal");
i = cf.Open (ifile_name, gameFolders.szDataDir, "rb", 0);
}
if (!i)
i = cf.Open (pszFile, gameFolders.szDataDir, "rb", 0);
// the following is a hack to enable the loading of d2 levels
// even if only the d2 mac shareware datafiles are present.
// However, if the pig file is present but the palette file isn't,
// the textures in the level will look wierd...
if (!i)
i = cf.Open (DEFAULT_LEVEL_PALETTE, gameFolders.szDataDir, "rb", 0);
if (!i) {
Error(TXT_PAL_FILES, pszFile, DEFAULT_LEVEL_PALETTE);
return NULL;
}
fsize = cf.Length ();
Assert (fsize == 9472);
cf.Read (palette, 256*3, 1);
cf.Read (grFadeTable, 256*34, 1);
cf.Close ();
// This is the TRANSPARENCY COLOR
for (i = 0; i < GR_FADE_LEVELS; i++)
grFadeTable [i * 256 + 255] = 255;
gameData.render.nComputedColors = 0; // Flush palette cache.
// swap colors 0 and 255 of the palette along with fade table entries
#ifdef SWAP_0_255
for (i = 0; i < 3; i++) {
c = palette [i];
palette [i] = palette [765 + i];
palette [765 + i] = c;
}
for (i = 0; i < GR_FADE_LEVELS * 256; i++)
if (grFadeTable [i] == 0)
grFadeTable [i] = 255;
for (i = 0; i < GR_FADE_LEVELS; i++)
grFadeTable [i * 256] = TRANSPARENCY_COLOR;
#endif
return fadePalette = AddPalette (palette);
}
示例6: D1
/* calculate table to translate d1 bitmaps to current palette,
* return -1 on error
*/
CPalette* CPaletteManager::LoadD1 (void)
{
CPalette palette;
CFile cf;
if (!cf.Open (D1_PALETTE, gameFolders.szDataDir, "rb", 1) || (cf.Length () != 9472))
return NULL;
palette.Read (cf);
cf.Close ();
palette.Raw () [254] = SUPER_TRANSP_COLOR;
palette.Raw () [255] = TRANSPARENCY_COLOR;
SetD1 (Add (palette));
return D1 ();
}
示例7: PiggyBitmapReadD1
void PiggyBitmapReadD1 (
CFile &cf,
CBitmap *bmP, /* read into this bmP */
int nBmDataOffs, /* specific to file */
tPIGBitmapHeader *bmh, /* header info for bmP */
ubyte **pNextBmP, /* where to write it (if 0, use reinterpret_cast<ubyte*> (D2_ALLOC) */
ubyte *colorMap) /* how to translate bmP's colors */
{
int zSize, bSwap0255;
memset (bmP, 0, sizeof (CBitmap));
bmP->SetWidth (bmh->width + ((short) (bmh->wh_extra&0x0f)<<8));
bmP->SetHeight (bmh->height + ((short) (bmh->wh_extra&0xf0)<<4));
bmP->SetBPP (1);
bmP->SetAvgColorIndex (bmh->avgColor);
bmP->AddFlags (bmh->flags & BM_FLAGS_TO_COPY);
cf.Seek (nBmDataOffs + bmh->offset, SEEK_SET);
if (bmh->flags & BM_FLAG_RLE) {
zSize = cf.ReadInt ();
cf.Seek (-4, SEEK_CUR);
}
else
zSize = bmP->Width () * bmP->Width ();
if (pNextBmP) {
bmP->SetBuffer (*pNextBmP);
*pNextBmP += zSize;
}
else {
if (bmP->CreateBuffer ())
UseBitmapCache (bmP, (int) bmP->FrameSize ());
else
return;
}
bmP->Read (cf, zSize);
bSwap0255 = 0;
switch (cf.Length ()) {
case D1_MAC_PIGSIZE:
case D1_MAC_SHARE_PIGSIZE:
if (bmh->flags & BM_FLAG_RLE)
bSwap0255 = 1;
else
bmP->Swap_0_255 ();
}
if (bmh->flags & BM_FLAG_RLE)
bmP->RLEExpand (NULL, bSwap0255);
bmP->Remap (paletteManager.D1 (), TRANSPARENCY_COLOR, -1);
}
示例8: PiggyBitmapReadD1
void PiggyBitmapReadD1 (
CFile &cf,
grsBitmap *bmP, /* read into this bmP */
int nBmDataOffs, /* specific to file */
tPIGBitmapHeader *bmh, /* header info for bmP */
ubyte **pNextBmP, /* where to write it (if 0, use (ubyte *) D2_ALLOC) */
ubyte *palette, /* what palette the bmP has */
ubyte *colorMap) /* how to translate bmP's colors */
{
int zSize, bSwap0255;
memset (bmP, 0, sizeof (grsBitmap));
bmP->bmProps.w = bmP->bmProps.rowSize = bmh->width + ((short) (bmh->wh_extra&0x0f)<<8);
bmP->bmProps.h = bmh->height + ((short) (bmh->wh_extra&0xf0)<<4);
bmP->bmAvgColor = bmh->bmAvgColor;
bmP->bmProps.flags |= bmh->flags & BM_FLAGS_TO_COPY;
cf.Seek (nBmDataOffs + bmh->offset, SEEK_SET);
if (bmh->flags & BM_FLAG_RLE) {
zSize = cf.ReadInt ();
cf.Seek (-4, SEEK_CUR);
}
else
zSize = bmP->bmProps.h * bmP->bmProps.w;
if (pNextBmP) {
bmP->bmTexBuf = *pNextBmP;
*pNextBmP += zSize;
}
else {
bmP->bmTexBuf = (ubyte *) D2_ALLOC (bmP->bmProps.h * bmP->bmProps.rowSize);
UseBitmapCache (bmP, (int) bmP->bmProps.h * (int) bmP->bmProps.rowSize);
}
cf.Read (bmP->bmTexBuf, 1, zSize);
bSwap0255 = 0;
switch (cf.Length ()) {
case D1_MAC_PIGSIZE:
case D1_MAC_SHARE_PIGSIZE:
if (bmh->flags & BM_FLAG_RLE)
bSwap0255 = 1;
else
swap_0_255 (bmP);
}
if (bmh->flags & BM_FLAG_RLE)
rle_expand (bmP, NULL, bSwap0255);
GrRemapBitmapGood (bmP, d1Palette, TRANSPARENCY_COLOR, -1);
}
示例9: Add
CPalette *CPaletteManager::Load (const char *pszFile, const char *pszLevel)
{
CFile cf;
int i = 0, fsize;
CPalette palette;
#ifdef SWAP_0_255
ubyte c;
#endif
if (pszLevel) {
char ifile_name [FILENAME_LEN];
CFile::ChangeFilenameExtension (ifile_name, pszLevel, ".pal");
i = cf.Open (ifile_name, gameFolders.szDataDir, "rb", 0);
}
if (!i)
i = cf.Open (pszFile, gameFolders.szDataDir, "rb", 0);
// the following is a hack to enable the loading of d2 levels
// even if only the d2 mac shareware datafiles are present.
// However, if the pig file is present but the palette file isn't,
// the textures in the level will look wierd...
if (!i)
i = cf.Open (DEFAULT_LEVEL_PALETTE, gameFolders.szDataDir, "rb", 0);
if (!i) {
Error(TXT_PAL_FILES, pszFile, DEFAULT_LEVEL_PALETTE);
return NULL;
}
fsize = cf.Length ();
Assert (fsize == 9472);
palette.Read (cf);
cf.Read (m_data.fadeTable, sizeof (m_data.fadeTable), 1);
cf.Close ();
// This is the TRANSPARENCY COLOR
for (i = 0; i < MAX_FADE_LEVELS; i++)
m_data.fadeTable [i * 256 + 255] = 255;
// swap colors 0 and 255 of the palette along with fade table entries
#ifdef SWAP_0_255
palette.SwapTransparency ();
for (i = 0; i < MAX_FADE_LEVELS * 256; i++)
if (m_fadeTable [i] == 0)
m_fadeTable [i] = 255;
for (i = 0; i < MAX_FADE_LEVELS; i++)
m_fadeTable [i * 256] = TRANSPARENCY_COLOR;
#endif
ClearEffect (&palette);
return Add (palette);
}
示例10: LoadD1PigHeader
void LoadD1PigHeader (CFile& cf, int *pSoundNum, int *pBmHdrOffs, int *pBmDataOffs, int *pBitmapNum, int bReadTMapNums)
{
# define D1_PIG_LOAD_FAILED "Failed loading " D1_PIGFILE
int nPigDataStart,
nHeaderSize,
nBmHdrOffs,
nBmDataOffs,
nSoundNum,
nBitmapNum;
switch (cf.Length ()) {
case D1_SHARE_BIG_PIGSIZE:
case D1_SHARE_10_PIGSIZE:
case D1_SHARE_PIGSIZE:
case D1_10_BIG_PIGSIZE:
case D1_10_PIGSIZE:
nPigDataStart = 0;
Warning ("%s %s. %s", TXT_LOAD_FAILED, D1_PIGFILE, TXT_D1_SUPPORT);
return;
default:
Warning ("%s %s", TXT_UNKNOWN_SIZE, D1_PIGFILE);
Int3 ();
// fall through
case D1_PIGSIZE:
case D1_OEM_PIGSIZE:
case D1_MAC_PIGSIZE:
case D1_MAC_SHARE_PIGSIZE:
nPigDataStart = cf.ReadInt ();
if (bReadTMapNums)
BMReadD1TMapNums (cf);
break;
}
cf.Seek (nPigDataStart, SEEK_SET);
nBitmapNum = cf.ReadInt ();
nSoundNum = cf.ReadInt ();
nHeaderSize = nBitmapNum * PIGBITMAPHEADER_D1_SIZE + nSoundNum * sizeof (tPIGSoundHeader);
nBmHdrOffs = nPigDataStart + 2 * sizeof (int);
nBmDataOffs = nBmHdrOffs + nHeaderSize;
if (pSoundNum)
*pSoundNum = nSoundNum;
*pBmHdrOffs = nBmHdrOffs;
*pBmDataOffs = nBmDataOffs;
*pBitmapNum = nBitmapNum;
}
示例11: do_ipc
int do_ipc(int qid, struct msgbuf *buf, int flags)
{
int ipc_read;
CFile cf;
int l=0;
ipc_read = msgrcv(qid,buf,16,0,flags | MSG_NOERROR);
switch (ipc_read)
{
case -1:
if (errno == ENOMSG)
break;
perror("IPC trouble");
break;
case 0:
break;
default:
//printf ("do_ipc %s\n", buf->mtext);//##########3
switch (buf->mtext[0])
{
case 'v':
volume=(double) ((double) buf->mtext[0]/127.0);
break;
case 'p':
if (cf.Open(&cf, (buf->mtext+1), gameFolders.szDataDir,"rb", 0)) {
l = cf.Length(&cf);
data=realloc(data,(size_t) l);
cf.Read(data, l, 1);
cf.Close(&cf);
//printf ("good. fpr=%p l=%i data=%p\n", fptr, l, data);//##########3
}
stop = 0;
break;
case 's':
stop = 2;
break;
case 'q':
// SDL_KillThread(player_thread);
break;
}
}
return ipc_read;
}
示例12: ReadWAV
int CAudioChannel::ReadWAV (void)
{
CFile cf;
int l;
if (!cf.Open ("d2x-temp.wav", gameFolders.szDataDir, "rb", 0))
return 0;
if (0 >= (l = cf.Length ()))
l = -1;
else if (!m_info.sample.Create (l))
l = -1;
else if (m_info.sample.Read (cf, l) != (size_t) l)
l = -1;
cf.Close ();
if ((l < 0) && m_info.sample.Buffer ()) {
m_info.sample.Destroy ();
}
return l > 0;
}
示例13: LoadReplacementBitmaps
void LoadReplacementBitmaps (const char *pszLevelName)
{
char szFilename [SHORT_FILENAME_LEN];
CFile cf;
int i, j;
CBitmap bm;
//first, free up data allocated for old bitmaps
PrintLog (" loading replacement textures\n");
CFile::ChangeFilenameExtension (szFilename, pszLevelName, ".pog");
if (cf.Open (szFilename, gameFolders.szDataDir, "rb", 0)) {
int id, version, nBitmapNum, bTGA;
int bmDataSize, bmDataOffset, bmOffset;
ushort *indices;
tPIGBitmapHeader *bmh;
id = cf.ReadInt ();
version = cf.ReadInt ();
if (id != MAKE_SIG ('G','O','P','D') || version != 1) {
cf.Close ();
return;
}
nBitmapNum = cf.ReadInt ();
indices = new ushort [nBitmapNum];
bmh = new tPIGBitmapHeader [nBitmapNum];
#if 0
cf.Read (indices, nBitmapNum * sizeof (ushort), 1);
cf.Read (bmh, nBitmapNum * sizeof (tPIGBitmapHeader), 1);
#else
for (i = 0; i < nBitmapNum; i++)
indices [i] = cf.ReadShort ();
for (i = 0; i < nBitmapNum; i++)
PIGBitmapHeaderRead (bmh + i, cf);
#endif
bmDataOffset = cf.Tell ();
bmDataSize = cf.Length () - bmDataOffset;
for (i = 0; i < nBitmapNum; i++) {
bmOffset = bmh [i].offset;
memset (&bm, 0, sizeof (CBitmap));
bm.AddFlags (bmh [i].flags & (BM_FLAGS_TO_COPY | BM_FLAG_TGA));
bm.SetWidth (bmh [i].width + ((short) (bmh [i].wh_extra & 0x0f) << 8));
bm.SetRowSize (bm.Width ());
if ((bTGA = (bm.Flags () & BM_FLAG_TGA)) && (bm.Width () > 256))
bm.SetHeight (bm.Width () * bmh [i].height);
else
bm.SetHeight (bmh [i].height + ((short) (bmh [i].wh_extra & 0xf0) << 4));
bm.SetBPP (bTGA ? 4 : 1);
if (!(bm.Width () * bm.Width ()))
continue;
bm.SetAvgColorIndex (bmh [i].avgColor);
bm.SetType (BM_TYPE_ALT);
if (!bm.CreateBuffer ())
break;
cf.Seek (bmDataOffset + bmOffset, SEEK_SET);
#if DBG
if (indices [i] == nDbgTexture)
nDbgTexture = nDbgTexture;
#endif
if (bTGA) {
int nFrames = bm.Height () / bm.Width ();
tTgaHeader h;
h.width = bm.Width ();
h.height = bm.Width ();
h.bits = 32;
if (!ReadTGAImage (cf, &h, &bm, -1, 1.0, 0, 1)) {
bm.DestroyBuffer ();
break;
}
bm.SetFrameCount ((ubyte) nFrames);
if (nFrames > 1) {
tEffectClip *ecP = NULL;
tWallClip *wcP;
tVideoClip *vcP;
while ((ecP = FindEffect (ecP, indices [i]))) {
//e->vc.nFrameCount = nFrames;
ecP->flags |= EF_ALTFMT | EF_FROMPOG;
}
if (!ecP) {
if ((wcP = FindWallAnim (indices [i]))) {
//w->nFrameCount = nFrames;
wcP->flags |= WCF_ALTFMT | WCF_FROMPOG;
}
else if ((vcP = FindVClip (i))) {
//v->nFrameCount = nFrames;
vcP->flags |= WCF_ALTFMT | WCF_FROMPOG;
}
}
}
j = indices [i];
bm.SetId (j);
}
else {
#if DBG
if (j == nDbgTexture)
nDbgTexture = nDbgTexture;
#endif
ReadBitmap (&bm, int (bm.Width ()) * int (bm.Height ()), &cf, true, false);
j = indices [i];
//.........这里部分代码省略.........