diff options
| author | Steven Fuller <relnev@icculus.org> | 2001-07-01 00:55:22 +0000 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-20 02:09:04 +0200 |
| commit | 2186d5f3f95cd74a070a490d899291648d58667a (patch) | |
| tree | 55241a1afa3e1a22e0b6593a8dead0b703800f44 /src/win95/awpnmld.cpp | |
| parent | 218ca90543758a20ac326e444ca0643174ca7384 (diff) | |
Initial revision
Diffstat (limited to 'src/win95/awpnmld.cpp')
| -rw-r--r-- | src/win95/awpnmld.cpp | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/win95/awpnmld.cpp b/src/win95/awpnmld.cpp new file mode 100644 index 0000000..4e54f2e --- /dev/null +++ b/src/win95/awpnmld.cpp @@ -0,0 +1,239 @@ +#include "advwin32.h" +#ifndef DB_LEVEL +#define DB_LEVEL 4 +#endif +#include "db.h" + +#include "awTexLd.hpp" + +// PNM loaders + +class AwPnmLoader : public AwTl::TypicalTexFileLoader +{ + protected: + void _AWTL_VARARG ParseHeader(unsigned nFields,...); + + MediaMedium * m_pMedium; +}; + +void _AWTL_VARARG AwPnmLoader::ParseHeader(unsigned nFields,...) +{ + va_list ap; + va_start(ap,nFields); + + m_pMedium->MovePos(+2); // skip past magic + + BYTE c = 0; + while (nFields) + { + unsigned * fieldP = va_arg(ap,unsigned *); + bool comment = false; + bool done = false; + do + { + MediaRead(m_pMedium, &c); + switch (c) + { + case '\n': + comment = false; + break; + case '#': + comment = true; + break; + default: + if (!comment && !isspace(c)) + done = true; + } + } + while (!done); + char bufA[512]; + char * bufP = bufA; + do + { + *bufP++ = c; + MediaRead(m_pMedium, &c); + } + while (!isspace(c)); + *bufP = 0; + *fieldP = atoi(bufA); + + -- nFields; + } + // c should now be a newline character + if ('\n'!=c) + awTlLastErr = AW_TLE_BADFILEDATA; + + va_end(ap); +} + +class AwPpmLoader : public AwPnmLoader +{ + protected: + virtual void LoadHeaderInfo(MediaMedium * pMedium); + virtual AwTl::Colour * GetPalette(); + virtual void LoadNextRow(AwTl::PtrUnion pRow); + + unsigned pm_maxval; +}; + +void AwPpmLoader::LoadHeaderInfo(MediaMedium * pMedium) +{ + m_pMedium = pMedium; + + db_log4("\tLoading a PPM file"); + + ParseHeader(3,&m_nWidth,&m_nHeight,&pm_maxval); + + db_logf4(("\tPPM_maxval is %u",pm_maxval)); + if (pm_maxval > 255) + { + awTlLastErr = AW_TLE_BADFILEFORMAT; + db_log3("AwCreateTexture(): PPM_maxval too large"); + } + + m_nPaletteSize = 0; +} + +AwTl::Colour * AwPpmLoader::GetPalette() +{ + // never palettized + return NULL; +} + +void AwPpmLoader::LoadNextRow(AwTl::PtrUnion pRow) +{ + if (pm_maxval != 255) + for (unsigned colcount = m_nWidth; colcount; --colcount) + { + BYTE byte; + MediaRead(m_pMedium,&byte); + pRow.colourP->r = static_cast<BYTE>(static_cast<unsigned>(byte)*255/pm_maxval); + MediaRead(m_pMedium,&byte); + pRow.colourP->g = static_cast<BYTE>(static_cast<unsigned>(byte)*255/pm_maxval); + MediaRead(m_pMedium,&byte); + pRow.colourP->b = static_cast<BYTE>(static_cast<unsigned>(byte)*255/pm_maxval); + ++pRow.colourP; + } + else + for (unsigned colcount = m_nWidth; colcount; --colcount) + { + MediaRead(m_pMedium,&pRow.colourP->r); + MediaRead(m_pMedium,&pRow.colourP->g); + MediaRead(m_pMedium,&pRow.colourP->b); + ++pRow.colourP; + } +} + + +class AwPgmLoader : public AwPnmLoader +{ + protected: + virtual void LoadHeaderInfo(MediaMedium * pMedium); + virtual AwTl::Colour * GetPalette(); + virtual void LoadNextRow(AwTl::PtrUnion pRow); + + unsigned pm_maxval; +}; + +void AwPgmLoader::LoadHeaderInfo(MediaMedium * pMedium) +{ + m_pMedium = pMedium; + + db_log4("\tLoading a PGM file"); + + ParseHeader(3,&m_nWidth,&m_nHeight,&pm_maxval); + + db_logf4(("\tPGM_maxval is %u",pm_maxval)); + if (pm_maxval > 255) + { + awTlLastErr = AW_TLE_BADFILEFORMAT; + db_log3("AwCreateTexture(): PGM_maxval too large"); + } + + m_nPaletteSize = pm_maxval+1; +} + +AwTl::Colour * AwPgmLoader::GetPalette() +{ + db_assert1(m_nPaletteSize); + db_assert1(m_pPalette); + + unsigned step8 = (256*255)/pm_maxval; + unsigned val8 = 127; + AwTl::Colour * pmP = m_pPalette; + for (unsigned pc = m_nPaletteSize; pc; --pc,++pmP,val8+=step8) + pmP->r = pmP->g = pmP->b = static_cast<BYTE>(val8/256); + + return m_pPalette; +} + +void AwPgmLoader::LoadNextRow(AwTl::PtrUnion pRow) +{ + m_pMedium->ReadBlock(pRow,m_nWidth); +} + + +class AwPbmLoader : public AwPnmLoader +{ + protected: + virtual void LoadHeaderInfo(MediaMedium * pMedium); + virtual AwTl::Colour * GetPalette(); + virtual void LoadNextRow(AwTl::PtrUnion pRow); +}; + + +void AwPbmLoader::LoadHeaderInfo(MediaMedium * pMedium) +{ + m_pMedium = pMedium; + + db_log4("\tLoading a PBM file"); + + ParseHeader(2,&m_nWidth,&m_nHeight); + + m_nPaletteSize = 2; +} + +AwTl::Colour * AwPbmLoader::GetPalette() +{ + db_assert1(m_nPaletteSize); + db_assert1(m_pPalette); + + m_pPalette[0].r = 0; + m_pPalette[0].g = 0; + m_pPalette[0].b = 0; + m_pPalette[1].r = 255; + m_pPalette[1].g = 255; + m_pPalette[1].b = 255; + + return m_pPalette; +} + +void AwPbmLoader::LoadNextRow(AwTl::PtrUnion pRow) +{ + unsigned shift = 0; + BYTE byte = 0; + + for (unsigned colcount = m_nWidth; colcount; --colcount) + { + if (!shift) + { + shift = 8; + MediaRead(m_pMedium,&byte); + byte = (BYTE) ~byte; + } + --shift; + *pRow.byteP++ = static_cast<BYTE>(byte>>shift & 1); + } +} + +#ifdef _MSC_VER + // VC5.0 tries to compile out code that is in a library + // and it thinks isn't being used + #line 228 +#endif +AWTEXLD_IMPLEMENT_DYNCREATE("P6",AwPpmLoader) +AWTEXLD_IMPLEMENT_DYNCREATE("P5",AwPgmLoader) +AWTEXLD_IMPLEMENT_DYNCREATE("P4",AwPbmLoader) + + + |
