Load JPEG landscape textures

committer: Günther Brammer <gbrammer@gmx.de>
Günther Brammer 2009-05-09 17:08:10 +02:00
parent 955422b6ee
commit 6f18e7250c
8 changed files with 32 additions and 101 deletions

View File

@ -44,6 +44,7 @@ class C4Surface: public CSurface
BOOL Save(C4Group &hGroup, const char *szFilename);
BOOL SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha=true, bool fApplyGamma=false, bool fSaveOverlayOnly=false);
BOOL Copy(C4Surface &fromSfc);
bool Read(CStdStream &hGroup, const char * extension, bool fOwnPal=false);
BOOL ReadPNG(CStdStream &hGroup);
bool ReadJPEG(CStdStream &hGroup);
};

View File

@ -25,7 +25,6 @@ class C4Surface;
C4Surface *GroupReadSurface(CStdStream &hGroup, BYTE *bpPalette=NULL);
CSurface8 *GroupReadSurface8(CStdStream &hGroup);
C4Surface *GroupReadSurfacePNG(CStdStream &hGroup);
C4Surface *GroupReadSurfaceOwnPal(CStdStream &hGroup);
CSurface8 *GroupReadSurfaceOwnPal8(CStdStream &hGroup);

View File

@ -765,7 +765,7 @@ BOOL C4Def::Load(C4Group &hGroup,
if (hGroup.AccessEntry(C4CFN_RankFaces))
{
pRankSymbols = new C4FacetSurface();
if (!pRankSymbols->GetFace().Read(hGroup)) { delete pRankSymbols; pRankSymbols=NULL; }
if (!pRankSymbols->GetFace().ReadBMP(hGroup)) { delete pRankSymbols; pRankSymbols=NULL; }
}
// set size
if (pRankSymbols)

View File

@ -80,6 +80,8 @@ BOOL C4Surface::LoadAny(C4GroupSet &hGroupset, const char *szName, bool fOwnPal,
if (pGroup) break;
}
}
else
pGroup = hGroupset.FindEntry(szFilename);
if (!pGroup) return false;
// Load surface
return Load(*pGroup,szFilename,fOwnPal,fNoErrIfNotFound);
@ -117,15 +119,7 @@ BOOL C4Surface::Load(C4Group &hGroup, const char *szFilename, bool fOwnPal, bool
if (!fNoErrIfNotFound) LogF("%s: %s%c%s", LoadResStr("IDS_PRC_FILENOTFOUND"), hGroup.GetFullName().getData(), (char) DirectorySeparator, szFilename);
return FALSE;
}
// determine file type by file extension and load accordingly
bool fSuccess;
if (SEqualNoCase(GetExtension(szFilename), "png"))
fSuccess = !!ReadPNG(hGroup);
else if (SEqualNoCase(GetExtension(szFilename), "jpeg")
|| SEqualNoCase(GetExtension(szFilename), "jpg"))
fSuccess = ReadJPEG(hGroup);
else
fSuccess = !!Read(hGroup, fOwnPal);
bool fSuccess = Read(hGroup, GetExtension(szFilename), fOwnPal);
// loading error? log!
if (!fSuccess)
LogF("%s: %s%c%s", LoadResStr("IDS_ERR_NOFILE"), hGroup.GetFullName().getData(), (char) DirectorySeparator, szFilename);
@ -135,6 +129,20 @@ BOOL C4Surface::Load(C4Group &hGroup, const char *szFilename, bool fOwnPal, bool
return fSuccess;
}
bool C4Surface::Read(CStdStream &hGroup, const char * extension, bool fOwnPal)
{
// determine file type by file extension and load accordingly
if (SEqualNoCase(extension, "png"))
return ReadPNG(hGroup);
else if (SEqualNoCase(extension, "jpeg")
|| SEqualNoCase(extension, "jpg"))
return ReadJPEG(hGroup);
else if (SEqualNoCase(extension, "bmp"))
return ReadBMP(hGroup, fOwnPal);
else
return false;
}
BOOL C4Surface::ReadPNG(CStdStream &hGroup)
{
// create mem block

View File

@ -29,7 +29,7 @@ C4Surface *GroupReadSurface(CStdStream &hGroup, BYTE *bpPalette)
{
// create surface
C4Surface *pSfc=new C4Surface();
if (!pSfc->Read(hGroup, !!bpPalette))
if (!pSfc->ReadBMP(hGroup, !!bpPalette))
{ delete pSfc; return NULL; }
return pSfc;
}
@ -47,7 +47,7 @@ C4Surface *GroupReadSurfaceOwnPal(CStdStream &hGroup)
{
// create surface
C4Surface *pSfc=new C4Surface();
if (!pSfc->Read(hGroup, true))
if (!pSfc->ReadBMP(hGroup, true))
{ delete pSfc; return NULL; }
return pSfc;
}
@ -60,82 +60,3 @@ CSurface8 *GroupReadSurfaceOwnPal8(CStdStream &hGroup)
{ delete pSfc; return NULL; }
return pSfc;
}
C4Surface *GroupReadSurfacePNG(CStdStream &hGroup)
{
// create surface
C4Surface *pSfc=new C4Surface();
pSfc->ReadPNG(hGroup);
return pSfc;
}
/*BOOL SaveSurface(const char *szFilename,
SURFACE sfcSurface,
BYTE *bpPalette)
{
BITMAPINFOHEADER bmpinfo;
RGBQUAD rgbquad;
BITMAPFILEHEADER bmphead;
int cnt,lcnt,ladd,pitch;
int imgwdt,imghgt;
BYTE fbuf[4];
BYTE *timgbuf;
CStdFile hFile;
// Lock the sfcSurface
if (!(timgbuf=lpDDraw->LockSurface(sfcSurface,pitch,&imgwdt,&imghgt)))
return FALSE;
// Image line data in file is extended to be multiple of 4
ladd=0; if (imgwdt%4!=0) ladd=4-imgwdt%4;
// Set bitmap info
ZeroMem((BYTE*)&bmpinfo,sizeof(BITMAPINFOHEADER));
bmpinfo.biSize=sizeof(BITMAPINFOHEADER);
bmpinfo.biWidth=imgwdt;
bmpinfo.biHeight=imghgt;
bmpinfo.biPlanes=1;
bmpinfo.biBitCount=8;
bmpinfo.biCompression=0;
bmpinfo.biSizeImage=imgwdt*imghgt;
bmpinfo.biClrUsed=bmpinfo.biClrImportant=256;
// Set header
ZeroMem((BYTE*)&bmphead,sizeof(BITMAPFILEHEADER));
bmphead.bfType=*((const WORD*)"BM");
bmphead.bfSize=sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)
+256*sizeof(RGBQUAD)
+(imgwdt+ladd)*imghgt;
bmphead.bfOffBits=sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)
+256*sizeof(RGBQUAD);
if (!hFile.Create(szFilename,FALSE))
{ lpDDraw->UnLockSurface(sfcSurface); return FALSE; }
hFile.Write(&bmphead,sizeof(bmphead));
hFile.Write(&bmpinfo,sizeof(bmpinfo));
for (cnt=0; cnt<256; cnt++)
{
rgbquad.rgbRed= bpPalette[cnt*3+0];
rgbquad.rgbGreen=bpPalette[cnt*3+1];
rgbquad.rgbBlue= bpPalette[cnt*3+2];
hFile.Write(&rgbquad,sizeof(rgbquad));
}
for (lcnt=imghgt-1; lcnt>=0; lcnt--)
{
hFile.Write(timgbuf+(pitch*lcnt),imgwdt);
if (ladd>0) hFile.Write(fbuf,ladd);
}
lpDDraw->UnLockSurface(sfcSurface);
hFile.Close();
return TRUE;
}*/

View File

@ -283,19 +283,22 @@ int32_t C4TextureMap::LoadTextures(C4Group &hGroup, C4Group* OverloadFile)
size_t binlen;
// newgfx: load PNG-textures first
hGroup.ResetSearch();
while (hGroup.AccessNextEntry(C4CFN_PNGFiles,&binlen,texname))
while (hGroup.AccessNextEntry("*",&binlen,texname))
{
// check if it already exists in the map
SReplaceChar(texname,'.',0);
if (GetTexture(texname)) continue;
SAppend(".png", texname);
// load
if (ctex=GroupReadSurfacePNG(hGroup))
if (GetTexture(GetFilenameOnly(texname))) continue;
// create surface
ctex = new C4Surface();
if (ctex->Read(hGroup, GetExtension(texname)))
{
SReplaceChar(texname,'.',0);
if (AddTexture(texname,ctex)) texnum++;
else delete ctex;
}
else
{
delete ctex;
}
}
#endif
return texnum;

View File

@ -240,8 +240,7 @@ class CSurface
void Default();
void Clip(int iX, int iY, int iX2, int iY2);
void NoClip();
bool Read(class CStdStream &hGroup, bool fOwnPal=false);
BOOL Save(const char *szFilename);
bool ReadBMP(class CStdStream &hGroup, bool fOwnPal=false);
bool SavePNG(const char *szFilename, bool fSaveAlpha, bool fApplyGamma, bool fSaveOverlayOnly);
BOOL AttachPalette();
BOOL Wipe(); // empty to transparent

View File

@ -493,7 +493,7 @@ IDirect3DSurface9 *CSurface::GetSurface()
}
#endif //USE_DIRECTX
bool CSurface::Read(CStdStream &hGroup, bool fOwnPal)
bool CSurface::ReadBMP(CStdStream &hGroup, bool fOwnPal)
{
int lcnt,iLineRest;
CBitmap256Info BitmapInfo;