Commit 565c5bfe authored by hybrid's avatar hybrid

Finally made the PPM loader, as promised.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@996 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 42a78559
// Copyright (C) 2007 Christian Stehno
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#include "CImageLoaderPPM.h"
#include "IReadFile.h"
#include "CColorConverter.h"
#include "CImage.h"
#include "os.h"
#include "fast_atof.h"
#include "coreutil.h"
namespace irr
{
namespace video
{
//! constructor
CImageLoaderPPM::CImageLoaderPPM()
{
#ifdef _DEBUG
setDebugName("CImageLoaderPPM");
#endif
}
//! returns true if the file maybe is able to be loaded by this class
//! based on the file extension (e.g. ".tga")
bool CImageLoaderPPM::isALoadableFileExtension(const c8* fileName) const
{
return strstr(fileName, ".ppm") || strstr(fileName, ".pgm") || strstr(fileName, ".pbm");
}
//! returns true if the file maybe is able to be loaded by this class
bool CImageLoaderPPM::isALoadableFileFormat(io::IReadFile* file) const
{
c8 id[2];
file->read(&id, 2);
return (id[0]=='P' && id[1]>'0' && id[1]<'7');
}
//! creates a surface from the file
IImage* CImageLoaderPPM::loadImage(io::IReadFile* file) const
{
IImage* image;
if (file->getSize() < 12)
return 0;
c8 id[2];
file->read(&id, 2);
if (id[0]!='P' || id[1]<'1' || id[1]>'6')
return 0;
const u8 format = id[1] - '0';
const bool binary = format>3;
core::stringc token;
getNextToken(file, token);
const u32 width = core::strtol10(token.c_str());
getNextToken(file, token);
const u32 height = core::strtol10(token.c_str());
u8* data = 0;
const u32 size = width*height;
if (format==1 || format==4)
{
skipToNextToken(file); // go to start of data
const u32 bytesize = size/8+(size & 3)?1:0;
if (binary)
{
if (file->getSize()-file->getPos() < bytesize)
return 0;
data = new u8[bytesize];
file->read(data, bytesize);
}
else
{
if (file->getSize()-file->getPos() < 2*size) // optimistic test
return 0;
data = new u8[bytesize];
memset(data, 0, bytesize);
u32 shift=0;
for (u32 i=0; i<size; ++i)
{
getNextToken(file, token);
if (token == "1")
data[i/8] |= (0x01 << shift);
if (++shift == 8)
shift=0;
}
}
image = new CImage(ECF_A1R5G5B5, core::dimension2d<s32>(width, height));
if (image)
CColorConverter::convert1BitTo16Bit(data, (s16*)image->lock(), width, height);
}
else
{
getNextToken(file, token);
const u32 maxDepth = core::strtol10(token.c_str());
if (maxDepth > 255) // no double bytes yet
return 0;
skipToNextToken(file); // go to start of data
if (format==2 || format==5)
{
if (binary)
{
if (file->getSize()-file->getPos() < size)
return 0;
data = new u8[size];
file->read(data, size);
image = new CImage(ECF_A8R8G8B8, core::dimension2d<s32>(width, height));
if (image)
{
u8* ptr = (u8*)image->lock();
for (u32 i=0; i<size; ++i)
{
*ptr++ = data[i];
*ptr++ = data[i];
*ptr++ = data[i];
*ptr++ = 255;
}
}
}
else
{
if (file->getSize()-file->getPos() < 2*size) // optimistic test
return 0;
image = new CImage(ECF_A8R8G8B8, core::dimension2d<s32>(width, height));
if (image)
{
u8* ptr = (u8*)image->lock();
for (u32 i=0; i<size; ++i)
{
getNextToken(file, token);
const u32 num = core::strtol10(token.c_str());
*ptr++ = num;
*ptr++ = num;
*ptr++ = num;
*ptr++ = 255;
}
}
}
}
else
{
const u32 bytesize = 3*size;
if (binary)
{
if (file->getSize()-file->getPos() < bytesize)
return 0;
data = new u8[bytesize];
file->read(data, bytesize);
image = new CImage(ECF_A8R8G8B8, core::dimension2d<s32>(width, height));
if (image)
{
u8* ptr = (u8*)image->lock();
for (u32 i=0; i<size; ++i)
{
*ptr++ = data[3*i];
*ptr++ = data[3*i+1];
*ptr++ = data[3*i+2];
*ptr++ = 255;
}
}
}
else
{
if (file->getSize()-file->getPos() < 2*bytesize) // optimistic test
return 0;
image = new CImage(ECF_A8R8G8B8, core::dimension2d<s32>(width, height));
if (image)
{
u8* ptr = (u8*)image->lock();
for (u32 i=0; i<size; ++i)
{
getNextToken(file, token);
*ptr++ = core::strtol10(token.c_str());
getNextToken(file, token);
*ptr++ = core::strtol10(token.c_str());
getNextToken(file, token);
*ptr++ = core::strtol10(token.c_str());
*ptr++ = 255;
}
}
}
}
}
if (image)
image->unlock();
delete [] data;
return image;
}
//! read the next token from file
void CImageLoaderPPM::getNextToken(io::IReadFile* file, core::stringc& token) const
{
token = "";
c8 c;
while(file->getPos()<file->getSize())
{
file->read(&c, 1);
if (c=='#')
{
while (c!='\n' && c!='\r' && (file->getPos()<file->getSize()))
file->read(&c, 1);
}
else if (!core::isspace(c))
{
token.append(c);
break;
}
}
while(file->getPos()<file->getSize())
{
file->read(&c, 1);
if (c=='#')
{
while (c!='\n' && c!='\r' && (file->getPos()<file->getSize()))
file->read(&c, 1);
}
else if (!core::isspace(c))
token.append(c);
else
break;
}
}
//! skip to next token (skip whitespace)
void CImageLoaderPPM::skipToNextToken(io::IReadFile* file) const
{
c8 c;
while(file->getPos()<file->getSize())
{
file->read(&c, 1);
if (c=='#')
{
while (c!='\n' && c!='\r' && (file->getPos()<file->getSize()))
file->read(&c, 1);
}
else if (!core::isspace(c))
{
file->seek(-1, true); // put back
break;
}
}
}
//! creates a loader which is able to load windows bitmaps
IImageLoader* createImageLoaderPPM()
{
return new CImageLoaderPPM;
}
} // end namespace video
} // end namespace irr
// Copyright (C) 2007 Christian Stehno
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __C_IMAGE_LOADER_PPM_H_INCLUDED__
#define __C_IMAGE_LOADER_PPM_H_INCLUDED__
#include "IImageLoader.h"
#include "irrString.h"
namespace irr
{
namespace video
{
/*!
Surface Loader for Windows bitmaps
*/
class CImageLoaderPPM : public IImageLoader
{
public:
//! constructor
CImageLoaderPPM();
//! returns true if the file maybe is able to be loaded by this class
//! based on the file extension (e.g. ".tga")
virtual bool isALoadableFileExtension(const c8* fileName) const;
//! returns true if the file maybe is able to be loaded by this class
virtual bool isALoadableFileFormat(io::IReadFile* file) const;
//! creates a surface from the file
virtual IImage* loadImage(io::IReadFile* file) const;
private:
//! read the next token from file
void getNextToken(io::IReadFile* file, core::stringc& token) const;
//! skip to next token (skip whitespace)
void skipToNextToken(io::IReadFile* file) const;
};
} // end namespace video
} // end namespace irr
#endif
...@@ -37,6 +37,9 @@ IImageLoader* createImageLoaderPCX(); ...@@ -37,6 +37,9 @@ IImageLoader* createImageLoaderPCX();
//! creates a loader which is able to load png images //! creates a loader which is able to load png images
IImageLoader* createImageLoaderPNG(); IImageLoader* createImageLoaderPNG();
//! creates a loader which is able to load ppm/pgm/pbm images
IImageLoader* createImageLoaderPPM();
//! creates a loader which is able to load bmp images //! creates a loader which is able to load bmp images
IImageWriter* createImageWriterBMP(); IImageWriter* createImageWriterBMP();
...@@ -87,6 +90,7 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<s32>& scre ...@@ -87,6 +90,7 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<s32>& scre
SurfaceLoader.push_back(video::createImageLoaderPSD()); SurfaceLoader.push_back(video::createImageLoaderPSD());
SurfaceLoader.push_back(video::createImageLoaderPCX()); SurfaceLoader.push_back(video::createImageLoaderPCX());
SurfaceLoader.push_back(video::createImageLoaderPNG()); SurfaceLoader.push_back(video::createImageLoaderPNG());
SurfaceLoader.push_back(video::createImageLoaderPPM());
SurfaceWriter.push_back(video::createImageWriterBMP()); SurfaceWriter.push_back(video::createImageWriterBMP());
SurfaceWriter.push_back(video::createImageWriterJPG()); SurfaceWriter.push_back(video::createImageWriterJPG());
......
...@@ -9,7 +9,7 @@ CppCompiler=-D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -D_USRDLL -DIR ...@@ -9,7 +9,7 @@ CppCompiler=-D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -D_USRDLL -DIR
Includes=..\..\include;zlib Includes=..\..\include;zlib
Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lopengl32_@@_ Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lopengl32_@@_
Libs= Libs=
UnitCount=590 UnitCount=592
Folders=doc,gui_impl,include,include/core,include/gui,include/io,include/scene,include/video,io_impl,other_impl,other_impl/extern,other_impl/extern/jpeglib,other_impl/extern/libpng,other_impl/extern/zlib,scene_impl,scene_impl/animators,scene_impl/collision,scene_impl/mesh,scene_impl/mesh/loaders,scene_impl/mesh/writers,scene_impl/nodes,scene_impl/nodes/particles,video_impl,"video_impl/Burning Video",video_impl/DirectX8,video_impl/DirectX9,video_impl/Null,video_impl/OpenGL,video_impl/Software Folders=doc,gui_impl,include,include/core,include/gui,include/io,include/scene,include/video,io_impl,other_impl,other_impl/extern,other_impl/extern/jpeglib,other_impl/extern/libpng,other_impl/extern/zlib,scene_impl,scene_impl/animators,scene_impl/collision,scene_impl/mesh,scene_impl/mesh/loaders,scene_impl/mesh/writers,scene_impl/nodes,scene_impl/nodes/particles,video_impl,"video_impl/Burning Video",video_impl/DirectX8,video_impl/DirectX9,video_impl/Null,video_impl/OpenGL,video_impl/Software
ObjFiles= ObjFiles=
PrivateResource= PrivateResource=
...@@ -5947,3 +5947,23 @@ Priority=1000 ...@@ -5947,3 +5947,23 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit591]
FileName=CImageLoaderPPM.cpp
Folder=video_impl/Null
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
[Unit592]
FileName=CImageLoaderPPM.h
Folder=video_impl/Null
Compile=1
CompileCpp=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
...@@ -977,10 +977,16 @@ ...@@ -977,10 +977,16 @@
RelativePath="CImageLoaderPCX.h"> RelativePath="CImageLoaderPCX.h">
</File> </File>
<File <File
RelativePath=".\CImageLoaderPNG.cpp"> RelativePath="CImageLoaderPNG.cpp">
</File> </File>
<File <File
RelativePath=".\CImageLoaderPNG.h"> RelativePath="CImageLoaderPNG.h">
</File>
<File
RelativePath="CImageLoaderPPM.cpp">
</File>
<File
RelativePath="CImageLoaderPPM.h">
</File> </File>
<File <File
RelativePath="CImageLoaderPSD.cpp"> RelativePath="CImageLoaderPSD.cpp">
......
...@@ -1348,11 +1348,19 @@ ...@@ -1348,11 +1348,19 @@
> >
</File> </File>
<File <File
RelativePath=".\CImageLoaderPNG.cpp" RelativePath="CImageLoaderPNG.cpp"
> >
</File> </File>
<File <File
RelativePath=".\CImageLoaderPNG.h" RelativePath="CImageLoaderPNG.h"
>
</File>
<File
RelativePath="CImageLoaderPPM.cpp"
>
</File>
<File
RelativePath="CImageLoaderPPM.h"
> >
</File> </File>
<File <File
......
...@@ -334,6 +334,8 @@ ...@@ -334,6 +334,8 @@
<Unit filename="CImageLoaderPCX.h" /> <Unit filename="CImageLoaderPCX.h" />
<Unit filename="CImageLoaderPNG.cpp" /> <Unit filename="CImageLoaderPNG.cpp" />
<Unit filename="CImageLoaderPNG.h" /> <Unit filename="CImageLoaderPNG.h" />
<Unit filename="CImageLoaderPPM.cpp" />
<Unit filename="CImageLoaderPPM.h" />
<Unit filename="CImageLoaderPSD.cpp" /> <Unit filename="CImageLoaderPSD.cpp" />
<Unit filename="CImageLoaderPSD.h" /> <Unit filename="CImageLoaderPSD.h" />
<Unit filename="CImageLoaderTGA.cpp" /> <Unit filename="CImageLoaderTGA.cpp" />
......
...@@ -28,7 +28,10 @@ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \ ...@@ -28,7 +28,10 @@ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \
IRROBJ = CBillboardSceneNode.o CCameraFPSSceneNode.o CCameraMayaSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctTreeSceneNode.o COctTreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o IRROBJ = CBillboardSceneNode.o CCameraFPSSceneNode.o CCameraMayaSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctTreeSceneNode.o COctTreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o
IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o
IRRANIMOBJ = CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o IRRANIMOBJ = CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o
IRRVIDEOOBJ = COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CColorConverter.o CFPSCounter.o CImage.o CImageLoaderBMP.o CImageLoaderJPG.o CImageLoaderPCX.o CImageLoaderPNG.o CImageLoaderPSD.o CImageLoaderTGA.o CImageWriterBMP.o CImageWriterJPG.o CImageWriterPCX.o CImageWriterPNG.o CImageWriterPPM.o CImageWriterPSD.o CImageWriterTGA.o CNullDriver.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o CVideoModeList.o IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o
IRRIMAGEOBJ = CColorConverter.o CImage.o CImageLoaderBMP.o CImageLoaderJPG.o CImageLoaderPCX.o CImageLoaderPNG.o CImageLoaderPSD.o CImageLoaderTGA.o CImageLoaderPPM.o\
CImageWriterBMP.o CImageWriterJPG.o CImageWriterPCX.o CImageWriterPNG.o CImageWriterPPM.o CImageWriterPSD.o CImageWriterTGA.o
IRRVIDEOOBJ = CVideoModeList.o CFPSCounter.o $(IRRDRVROBJ) $(IRRIMAGEOBJ)
IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CTRGouraud.o CTRGouraudWire.o CTRTextureFlat.o CTRTextureFlatWire.o CTRTextureGouraud.o CTRTextureGouraudAdd.o CTRTextureGouraudNoZ.o CTRTextureGouraudWire.o CZBuffer.o CTRTextureGouraudVertexAlpha2.o CTRTextureGouraudNoZ2.o CTRTextureLightMap2_M2.o CTRTextureLightMap2_M4.o CTRTextureLightMap2_M1.o CSoftwareDriver2.o CSoftwareTexture2.o CTRTextureGouraud2.o CTRGouraud2.o CTRGouraudAlpha2.o CTRGouraudAlphaNoZ2.o CTRTextureDetailMap2.o CTRTextureGouraudAdd2.o CTRTextureGouraudAddNoZ2.o CTRTextureWire2.o CTRTextureLightMap2_Add.o CTRTextureLightMapGouraud2_M4.o IBurningShader.o CTRTextureBlend.o CTRTextureGouraudAlpha.o CTRTextureGouraudAlphaNoZ.o CDepthBuffer.o IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CTRGouraud.o CTRGouraudWire.o CTRTextureFlat.o CTRTextureFlatWire.o CTRTextureGouraud.o CTRTextureGouraudAdd.o CTRTextureGouraudNoZ.o CTRTextureGouraudWire.o CZBuffer.o CTRTextureGouraudVertexAlpha2.o CTRTextureGouraudNoZ2.o CTRTextureLightMap2_M2.o CTRTextureLightMap2_M4.o CTRTextureLightMap2_M1.o CSoftwareDriver2.o CSoftwareTexture2.o CTRTextureGouraud2.o CTRGouraud2.o CTRGouraudAlpha2.o CTRGouraudAlphaNoZ2.o CTRTextureDetailMap2.o CTRTextureGouraudAdd2.o CTRTextureGouraudAddNoZ2.o CTRTextureWire2.o CTRTextureLightMap2_Add.o CTRTextureLightMapGouraud2_M4.o IBurningShader.o CTRTextureBlend.o CTRTextureGouraudAlpha.o CTRTextureGouraudAlphaNoZ.o CDepthBuffer.o
IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryReadFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CZipReader.o CPakReader.o irrXML.o CAttributes.o IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryReadFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CZipReader.o CPakReader.o irrXML.o CAttributes.o
IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceStub.o CIrrDeviceWin32.o CLogger.o COSOperator.o Irrlicht.o os.o IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceStub.o CIrrDeviceWin32.o CLogger.o COSOperator.o Irrlicht.o os.o
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment