Now using stb_image directly for loading image files, instead of SOIL (which is not maintained anymore)

git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1542 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
LaurentGom 2010-07-31 14:06:30 +00:00
parent 42173d6d04
commit ff367bdb57
14 changed files with 5502 additions and 311 deletions

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_workspace_file>
<Workspace title="SFML workspace">
<Project filename="sfml-system.cbp" active="1" />
<Project filename="sfml-system.cbp" />
<Project filename="sfml-window.cbp" />
<Project filename="sfml-network.cbp" />
<Project filename="sfml-graphics.cbp" />
<Project filename="sfml-graphics.cbp" active="1" />
<Project filename="sfml-audio.cbp" />
<Project filename="sfml-main.cbp" />
<Project filename="..\..\samples\build\codeblocks\ftp.cbp" />

View File

@ -63,8 +63,6 @@ echo Adding external libraries to libsfml-graphics-s...
ar x %SFML%\extlibs\libs-mingw\libfreetype.a
ar x %SFML%\extlibs\libs-mingw\libglew.a
ar x %SFML%\extlibs\libs-mingw\libjpeg.a
ar x %SFML%\extlibs\libs-mingw\libpng.a
ar x %SFML%\extlibs\libs-mingw\libsoil.a
ar rs libsfml-graphics-s.a *.o
ar rs libsfml-graphics-s-d.a *.o
del *.o /f /q

View File

@ -33,8 +33,6 @@
<Add library="..\..\extlibs\libs-mingw\libfreetype.a" />
<Add library="..\..\extlibs\libs-mingw\libglew.a" />
<Add library="..\..\extlibs\libs-mingw\libjpeg.a" />
<Add library="..\..\extlibs\libs-mingw\libpng.a" />
<Add library="..\..\extlibs\libs-mingw\libsoil.a" />
<Add library="libopengl32.a" />
<Add directory="..\..\extlibs" />
</Linker>
@ -67,8 +65,6 @@
<Add library="..\..\extlibs\libs-mingw\libfreetype.a" />
<Add library="..\..\extlibs\libs-mingw\libglew.a" />
<Add library="..\..\extlibs\libs-mingw\libjpeg.a" />
<Add library="..\..\extlibs\libs-mingw\libpng.a" />
<Add library="..\..\extlibs\libs-mingw\libsoil.a" />
<Add library="libopengl32.a" />
<Add directory="..\..\extlibs" />
</Linker>
@ -124,7 +120,6 @@
<Add directory="..\..\src" />
<Add directory="..\..\include" />
<Add directory="..\..\extlibs\headers" />
<Add directory="..\..\extlibs\headers\png" />
<Add directory="..\..\extlibs\headers\jpeg" />
</Compiler>
<Linker>

View File

@ -1,6 +1,6 @@
SRC = $(wildcard $(SRCROOT)/Graphics/*.cpp $(SRCROOT)/Graphics/Linux/*.cpp)
OBJ = $(SRC:.cpp=.o)
LIB = libsfml-graphics.so
LIB = libsfml-graphics.so
LIBNAME = $(LIB).$(VERSION)
FULLLIBNAME = $(LIBPATH)/$(LIBNAME)
LINK = $(LN) $(LNFLAGS) $(LIBNAME) $(DESTLIBDIR)/$(LIB)
@ -8,7 +8,7 @@ LINK = $(LN) $(LNFLAGS) $(LIBNAME) $(DESTLIBDIR)/$(LIB)
all: $(LIB)
libsfml-graphics.so: $(OBJ)
$(CPP) $(LDFLAGS) -Wl,-soname,$(LIBNAME) -o $(FULLLIBNAME) $(OBJ) -lGLEW -ljpeg -lpng -lSOIL -lfreetype -lX11 -lGL
$(CPP) $(LDFLAGS) -Wl,-soname,$(LIBNAME) -o $(FULLLIBNAME) $(OBJ) -lGLEW -ljpeg -lfreetype -lX11 -lGL
$(OBJ): %.o: %.cpp
$(CPP) -o $@ -c $< $(CFLAGS) -I/usr/include/freetype2
@ -21,7 +21,7 @@ clean:
mrproper: clean
rm -rf $(FULLLIBNAME)
install:
objcopy --only-keep-debug $(FULLLIBNAME) $(DESTDBGDIR)/$(LIBNAME)
install:
objcopy --only-keep-debug $(FULLLIBNAME) $(DESTDBGDIR)/$(LIBNAME)
objcopy --strip-unneeded $(FULLLIBNAME) $(DESTLIBDIR)/$(LIBNAME)
$(LINK)

View File

@ -49,7 +49,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;SFML_EXPORTS;SFML_DYNAMIC;GLEW_STATIC"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@ -71,7 +71,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2005\$(ProjectName)-d.dll"
LinkIncremental="2"
AdditionalLibraryDirectories=""
@ -143,7 +143,7 @@
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;SFML_DYNAMIC;GLEW_STATIC;STBI_FAILURE_USERMSG"
StringPooling="true"
RuntimeLibrary="2"
@ -167,7 +167,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2005\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories=""
@ -236,7 +236,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;SFML_EXPORTS;GLEW_STATIC"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@ -258,7 +258,7 @@
/>
<Tool
Name="VCLibrarianTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2005\$(ProjectName)-s-d.lib"
AdditionalLibraryDirectories=""
/>
@ -315,7 +315,7 @@
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;GLEW_STATIC;STBI_FAILURE_USERMSG"
StringPooling="true"
MinimalRebuild="false"
@ -340,7 +340,7 @@
/>
<Tool
Name="VCLibrarianTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2005\$(ProjectName)-s.lib"
AdditionalLibraryDirectories=""
/>
@ -488,6 +488,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="0"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -496,6 +497,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="0"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -504,6 +506,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="0"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -512,6 +515,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="0"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>

View File

@ -51,7 +51,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;SFML_EXPORTS;SFML_DYNAMIC;GLEW_STATIC"
MinimalRebuild="false"
BasicRuntimeChecks="3"
@ -72,7 +72,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2008\$(ProjectName)-d.dll"
LinkIncremental="2"
AdditionalLibraryDirectories=""
@ -144,7 +144,7 @@
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;SFML_DYNAMIC;GLEW_STATIC;STBI_FAILURE_USERMSG"
StringPooling="true"
RuntimeLibrary="2"
@ -167,7 +167,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2008\$(ProjectName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories=""
@ -236,7 +236,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;SFML_EXPORTS;GLEW_STATIC"
MinimalRebuild="false"
BasicRuntimeChecks="3"
@ -258,7 +258,7 @@
<Tool
Name="VCLibrarianTool"
AdditionalOptions="/VERBOSE:LIB"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2008\$(ProjectName)-s-d.lib"
AdditionalLibraryDirectories=""
/>
@ -316,7 +316,7 @@
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\png&quot;"
AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\src&quot;;&quot;$(SolutionDir)..\..\include&quot;;&quot;$(SolutionDir)..\..\extlibs\headers&quot;;&quot;$(SolutionDir)..\..\extlibs\headers\jpeg&quot;"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;GLEW_STATIC;STBI_FAILURE_USERMSG"
StringPooling="true"
RuntimeLibrary="2"
@ -340,7 +340,7 @@
/>
<Tool
Name="VCLibrarianTool"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\png.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\soil.lib&quot;"
AdditionalDependencies="opengl32.lib &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\freetype.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\glew.lib&quot; &quot;$(SolutionDir)..\..\extlibs\libs-vc2005\jpeg.lib&quot;"
OutputFile="$(SolutionDir)..\..\lib\vc2008\$(ProjectName)-s.lib"
AdditionalLibraryDirectories=""
/>
@ -488,6 +488,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="3"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -496,6 +497,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="3"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -504,6 +506,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="3"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>
@ -512,6 +515,7 @@
>
<Tool
Name="VCCLCompilerTool"
WarningLevel="3"
DisableSpecificWarnings="4611"
/>
</FileConfiguration>

View File

@ -1,151 +0,0 @@
/**
@mainpage SOIL
Jonathan Dummer
2007-07-26-10.36
Simple OpenGL Image Library
A tiny c library for uploading images as
textures into OpenGL. Also saving and
loading of images is supported.
I'm using Sean's Tool Box image loader as a base:
http://www.nothings.org/
I'm upgrading it to load TGA and DDS files, and a direct
path for loading DDS files straight into OpenGL textures,
when applicable.
Image Formats:
- BMP load & save
- TGA load & save
- DDS load & save
- PNG load
- JPG load
OpenGL Texture Features:
- resample to power-of-two sizes
- MIPmap generation
- compressed texture S3TC formats (if supported)
- can pre-multiply alpha for you, for better compositing
- can flip image about the y-axis (except pre-compressed DDS files)
Thanks to:
* Sean Barret - for the awesome stb_image
* Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts
* everybody at gamedev.net
**/
#ifndef HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
#define HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY
#ifdef __cplusplus
extern "C" {
#endif
/**
The format of images that may be loaded (force_channels).
SOIL_LOAD_AUTO leaves the image in whatever format it was found.
SOIL_LOAD_L forces the image to load as Luminous (greyscale)
SOIL_LOAD_LA forces the image to load as Luminous with Alpha
SOIL_LOAD_RGB forces the image to load as Red Green Blue
SOIL_LOAD_RGBA forces the image to load as Red Green Blue Alpha
**/
enum
{
SOIL_LOAD_AUTO = 0,
SOIL_LOAD_L = 1,
SOIL_LOAD_LA = 2,
SOIL_LOAD_RGB = 3,
SOIL_LOAD_RGBA = 4
};
/**
The types of images that may be saved.
(TGA supports uncompressed RGB / RGBA)
(BMP supports uncompressed RGB)
(DDS supports DXT1 and DXT5)
**/
enum
{
SOIL_SAVE_TYPE_TGA = 0,
SOIL_SAVE_TYPE_BMP = 1,
SOIL_SAVE_TYPE_DDS = 2
};
/**
Loads an image from disk into an array of unsigned chars.
Note that *channels return the original channel count of the
image. If force_channels was other than SOIL_LOAD_AUTO,
the resulting image has force_channels, but *channels may be
different (if the original image had a different channel
count).
\return 0 if failed, otherwise returns 1
**/
unsigned char*
SOIL_load_image
(
const char *filename,
int *width, int *height, int *channels,
int force_channels
);
/**
Loads an image from memory into an array of unsigned chars.
Note that *channels return the original channel count of the
image. If force_channels was other than SOIL_LOAD_AUTO,
the resulting image has force_channels, but *channels may be
different (if the original image had a different channel
count).
\return 0 if failed, otherwise returns 1
**/
unsigned char*
SOIL_load_image_from_memory
(
const unsigned char *const buffer,
int buffer_length,
int *width, int *height, int *channels,
int force_channels
);
/**
Saves an image from an array of unsigned chars (RGBA) to disk
\return 0 if failed, otherwise returns 1
**/
int
SOIL_save_image
(
const char *filename,
int image_type,
int width, int height, int channels,
const unsigned char *const data
);
/**
Frees the image data (note, this is just C's "free()"...this function is
present mostly so C++ programmers don't forget to use "free()" and call
"delete []" instead [8^)
**/
void
SOIL_free_image_data
(
unsigned char *img_data
);
/**
This function resturn a pointer to a string describing the last thing
that happened inside SOIL. It can be used to determine why an image
failed to load.
**/
const char*
SOIL_last_result
(
void
);
#ifdef __cplusplus
}
#endif
#endif /* HEADER_SIMPLE_OPENGL_IMAGE_LIBRARY */

Binary file not shown.

Binary file not shown.

View File

@ -74,9 +74,9 @@ public :
////////////////////////////////////////////////////////////
/// \brief Load the image from a file on disk
///
/// The supported image formats are bmp, png, tga, jpg, dds
/// and psd. Some format options are not supported, like
/// progressive jpeg.
/// The supported image formats are bmp, png, tga, jpg, gif,
/// psd, hdr and pic. Some format options are not supported,
/// like progressive jpeg.
/// The maximum size for an image depends on the graphics
/// driver and can be retrieve with the GetMaximumSize function.
///
@ -92,9 +92,9 @@ public :
////////////////////////////////////////////////////////////
/// \brief Load the image from a file in memory
///
/// The supported image formats are bmp, png, tga, jpg, dds
/// and psd. Some format options are not supported, like
/// progressive jpeg.
/// The supported image formats are bmp, png, tga, jpg, gif,
/// psd, hdr and pic. Some format options are not supported,
/// like progressive jpeg.
/// The maximum size for an image depends on the graphics
/// driver and can be retrieve with the GetMaximumSize function.
///
@ -133,7 +133,7 @@ public :
///
/// The format of the image is automatically deduced from
/// the extension. The supported image formats are bmp, png,
/// tga, jpg, dds and psd. The destination file is overwritten
/// tga and jpg. The destination file is overwritten
/// if it already exists.
///
/// \param filename Path of the file to save

View File

@ -27,26 +27,27 @@
////////////////////////////////////////////////////////////
#include <SFML/Graphics/ImageLoader.hpp>
#include <SFML/System/Err.hpp>
#include <SFML/Graphics/stb_image/stb_image.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <SFML/Graphics/stb_image/stb_image_write.h>
extern "C"
{
#include <jpeglib.h>
#include <jerror.h>
}
#include <png.h>
#include <SOIL/SOIL.h>
#include <ctype.h>
// For compatibility with versions of libpng < 1.4.0
#ifndef png_jmpbuf
#define png_jmpbuf(png) png->jmpbuf
#endif
namespace
{
////////////////////////////////////////////////////////////
void PngErrorHandler(png_structp png, png_const_charp message)
std::string ToLower(const std::string& str)
{
sf::Err() << "Failed to write PNG image. Reason : " << message << std::endl;
longjmp(png_jmpbuf(png), 1);
std::string lower = str;
for (std::string::iterator it = lower.begin(); it != lower.end(); ++it)
*it = static_cast<char>(tolower(*it));
return str;
}
}
@ -86,7 +87,7 @@ bool ImageLoader::LoadImageFromFile(const std::string& filename, std::vector<Uin
// Load the image and get a pointer to the pixels in memory
int imgWidth, imgHeight, imgChannels;
unsigned char* ptr = SOIL_load_image(filename.c_str(), &imgWidth, &imgHeight, &imgChannels, SOIL_LOAD_RGBA);
unsigned char* ptr = stbi_load(filename.c_str(), &imgWidth, &imgHeight, &imgChannels, STBI_rgb_alpha);
if (ptr)
{
@ -99,14 +100,14 @@ bool ImageLoader::LoadImageFromFile(const std::string& filename, std::vector<Uin
memcpy(&pixels[0], ptr, pixels.size());
// Free the loaded pixels (they are now in our own pixel buffer)
SOIL_free_image_data(ptr);
stbi_image_free(ptr);
return true;
}
else
{
// Error, failed to load the image
Err() << "Failed to load image \"" << filename << "\". Reason : " << SOIL_last_result() << std::endl;
Err() << "Failed to load image \"" << filename << "\". Reason : " << stbi_failure_reason() << std::endl;
return false;
}
@ -122,7 +123,7 @@ bool ImageLoader::LoadImageFromMemory(const void* data, std::size_t size, std::v
// Load the image and get a pointer to the pixels in memory
int imgWidth, imgHeight, imgChannels;
const unsigned char* buffer = static_cast<const unsigned char*>(data);
unsigned char* ptr = SOIL_load_image_from_memory(buffer, static_cast<int>(size), &imgWidth, &imgHeight, &imgChannels, SOIL_LOAD_RGBA);
unsigned char* ptr = stbi_load_from_memory(buffer, static_cast<int>(size), &imgWidth, &imgHeight, &imgChannels, STBI_rgb_alpha);
if (ptr)
{
@ -135,14 +136,14 @@ bool ImageLoader::LoadImageFromMemory(const void* data, std::size_t size, std::v
memcpy(&pixels[0], ptr, pixels.size());
// Free the loaded pixels (they are now in our own pixel buffer)
SOIL_free_image_data(ptr);
stbi_image_free(ptr);
return true;
}
else
{
// Error, failed to load the image
Err() << "Failed to load image from memory. Reason : " << SOIL_last_result() << std::endl;
Err() << "Failed to load image from memory. Reason : " << stbi_failure_reason() << std::endl;
return false;
}
@ -153,35 +154,39 @@ bool ImageLoader::LoadImageFromMemory(const void* data, std::size_t size, std::v
bool ImageLoader::SaveImageToFile(const std::string& filename, const std::vector<Uint8>& pixels, unsigned int width, unsigned int height)
{
// Deduce the image type from its extension
int type = -1;
if (filename.size() > 3)
{
// Extract the extension
std::string extension = filename.substr(filename.size() - 3);
if (extension == "bmp" || extension == "BMP") type = SOIL_SAVE_TYPE_BMP;
else if (extension == "tga" || extension == "TGA") type = SOIL_SAVE_TYPE_TGA;
else if (extension == "dds" || extension == "DDS") type = SOIL_SAVE_TYPE_DDS;
// Special handling for PNG and JPG -- not handled by SOIL
else if (extension == "png" || extension == "PNG") return WritePng(filename, pixels, width, height);
else if (extension == "jpg" || extension == "JPG") return WriteJpg(filename, pixels, width, height);
if (ToLower(extension) == "bmp")
{
// BMP format
if (stbi_write_bmp(filename.c_str(), width, height, 4, &pixels[0]))
return true;
}
else if (ToLower(extension) == "tga")
{
// TGA format
if (stbi_write_tga(filename.c_str(), width, height, 4, &pixels[0]))
return true;
}
else if(ToLower(extension) == "png")
{
// PNG format
if (stbi_write_png(filename.c_str(), width, height, 4, &pixels[0], 0))
return true;
}
else if (ToLower(extension) == "jpg")
{
// JPG format
if (WriteJpg(filename, pixels, width, height))
return true;
}
}
if (type == -1)
{
// Error, incompatible type
Err() << "Failed to save image \"" << filename << "\". Reason: this image format is not supported" << std::endl;
return false;
}
// Finally save the image
if (!SOIL_save_image(filename.c_str(), type, static_cast<int>(width), static_cast<int>(height), 4, &pixels[0]))
{
// Error, failed to save the image
Err() << "Failed to save image \"" << filename << "\". Reason: " << SOIL_last_result() << std::endl;
return false;
}
return true;
Err() << "Failed to save image \"" << filename << "\"" << std::endl;
return false;
}
@ -191,10 +196,7 @@ bool ImageLoader::WriteJpg(const std::string& filename, const std::vector<Uint8>
// Open the file to write in
FILE* file = fopen(filename.c_str(), "wb");
if (!file)
{
Err() << "Failed to save image file \"" << filename << "\". Reason : cannot open file" << std::endl;
return false;
}
// Initialize the error handler
jpeg_compress_struct compressInfos;
@ -241,76 +243,6 @@ bool ImageLoader::WriteJpg(const std::string& filename, const std::vector<Uint8>
return true;
}
////////////////////////////////////////////////////////////
bool ImageLoader::WritePng(const std::string& filename, const std::vector<Uint8>& pixels, unsigned int width, unsigned int height)
{
// Open the file to write in
FILE* file = fopen(filename.c_str(), "wb");
if (!file)
{
Err() << "Failed to save image file \"" << filename << "\". Reason : cannot open file" << std::endl;
return false;
}
// Create the main PNG structure
png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, &PngErrorHandler, NULL);
if (!png)
{
fclose(file);
Err() << "Failed to save image file \"" << filename << "\". Reason : cannot allocate PNG write structure" << std::endl;
return false;
}
// Initialize the image informations
png_infop pngInfos = png_create_info_struct(png);
if (!pngInfos)
{
fclose(file);
png_destroy_write_struct(&png, NULL);
Err() << "Failed to save image file \"" << filename << "\". Reason : cannot allocate PNG info structure" << std::endl;
return false;
}
// For proper error handling...
if (setjmp(png_jmpbuf(png)))
{
png_destroy_write_struct(&png, &pngInfos);
return false;
}
// Link the file to the PNG structure
png_init_io(png, file);
// Set the image informations
png_set_IHDR(png, pngInfos, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
// Write the header
png_write_info(png, pngInfos);
// Get the pointers to the pixels rows into an array
png_byte* ptr = (png_byte*)&pixels[0];
std::vector<png_byte*> rawPointers(height);
for (unsigned int i = 0; i < height; ++i)
{
rawPointers[i] = ptr;
ptr += width * 4;
}
// Write pixels row by row
png_set_rows(png, pngInfos, &rawPointers[0]);
png_write_png(png, pngInfos, PNG_TRANSFORM_IDENTITY, NULL);
// Finish writing the file
png_write_end(png, pngInfos);
// Cleanup resources
png_destroy_write_struct(&png, &pngInfos);
fclose(file);
return true;
}
} // namespace priv
} // namespace sf

View File

@ -119,19 +119,6 @@ private :
///
////////////////////////////////////////////////////////////
bool WriteJpg(const std::string& filename, const std::vector<Uint8>& pixels, unsigned int width, unsigned int height);
////////////////////////////////////////////////////////////
/// \brief Save an image file in PNG format
///
/// \param filename Path of image file to save
/// \param pixels Array of pixels to save to image
/// \param width Width of image to save, in pixels
/// \param height Height of image to save, in pixels
///
/// \return True if saving was successful
///
////////////////////////////////////////////////////////////
bool WritePng(const std::string& filename, const std::vector<Uint8>& pixels, unsigned int width, unsigned int height);
};
} // namespace priv

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,504 @@
/* stbiw-0.91 - public domain - http://nothings.org/stb/stb_image_write.h
writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010
no warranty implied; use at your own risk
Before including,
#define STB_IMAGE_WRITE_IMPLEMENTATION
in the file that you want to have the implementation.
ABOUT:
This header file is a library for writing images to C stdio. It could be
adapted to write to memory or a general streaming interface; let me know.
The PNG output is not optimal; it is 20-50% larger than the file
written by a decent optimizing implementation. This library is designed
for source code compactness and simplicitly, not optimal image file size
or run-time performance.
USAGE:
There are three functions, one for each image file format:
int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
Each function returns 0 on failure and non-0 on success.
The functions create an image file defined by the parameters. The image
is a rectangle of pixels stored from left-to-right, top-to-bottom.
Each pixel contains 'comp' channels of data stored interleaved with 8-bits
per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is
monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.
The *data pointer points to the first byte of the top-left-most pixel.
For PNG, "stride_in_bytes" is the distance in bytes from the first byte of
a row of pixels to the first byte of the next row of pixels.
PNG creates output files with the same number of components as the input.
The BMP and TGA formats expand Y to RGB in the file format. BMP does not
output alpha.
PNG supports writing rectangles of data even when the bytes storing rows of
data are not consecutive in memory (e.g. sub-rectangles of a larger image),
by supplying the stride between the beginning of adjacent rows. The other
formats do not. (Thus you cannot write a native-format BMP through the BMP
writer, both because it is in BGR order and because it may have padding
at the end of the line.)
*/
#ifndef INCLUDE_STB_IMAGE_WRITE_H
#define INCLUDE_STB_IMAGE_WRITE_H
#ifdef __cplusplus
extern "C" {
#endif
extern int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);
extern int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);
extern int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);
#ifdef __cplusplus
}
#endif
#endif//INCLUDE_STB_IMAGE_WRITE_H
#ifdef STB_IMAGE_WRITE_IMPLEMENTATION
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
typedef unsigned int stbiw_uint32;
typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];
static void writefv(FILE *f, const char *fmt, va_list v)
{
while (*fmt) {
switch (*fmt++) {
case ' ': break;
case '1': { unsigned char x = va_arg(v, int); fputc(x,f); break; }
case '2': { int x = va_arg(v,int); unsigned char b[2]; b[0] = x; b[1] = x>>8; fwrite(b,2,1,f); break; }
case '4': { stbiw_uint32 x = va_arg(v,int); unsigned char b[4]; b[0]=x; b[1]=x>>8; b[2]=x>>16; b[3]=x>>24; fwrite(b,4,1,f); break; }
default:
assert(0);
return;
}
}
}
static void write3(FILE *f, unsigned char a, unsigned char b, unsigned char c)
{
unsigned char arr[3];
arr[0] = a, arr[1] = b, arr[2] = c;
fwrite(arr, 3, 1, f);
}
static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad)
{
unsigned char bg[3] = { 255, 0, 255}, px[3];
stbiw_uint32 zero = 0;
int i,j,k, j_end;
if (y <= 0)
return;
if (vdir < 0)
j_end = -1, j = y-1;
else
j_end = y, j = 0;
for (; j != j_end; j += vdir) {
for (i=0; i < x; ++i) {
unsigned char *d = (unsigned char *) data + (j*x+i)*comp;
if (write_alpha < 0)
fwrite(&d[comp-1], 1, 1, f);
switch (comp) {
case 1:
case 2: write3(f, d[0],d[0],d[0]);
break;
case 4:
if (!write_alpha) {
// composite against pink background
for (k=0; k < 3; ++k)
px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255;
write3(f, px[1-rgb_dir],px[1],px[1+rgb_dir]);
break;
}
/* FALLTHROUGH */
case 3:
write3(f, d[1-rgb_dir],d[1],d[1+rgb_dir]);
break;
}
if (write_alpha > 0)
fwrite(&d[comp-1], 1, 1, f);
}
fwrite(&zero,scanline_pad,1,f);
}
}
static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, const char *fmt, ...)
{
FILE *f;
if (y < 0 || x < 0) return 0;
f = fopen(filename, "wb");
if (f) {
va_list v;
va_start(v, fmt);
writefv(f, fmt, v);
va_end(v);
write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad);
fclose(f);
}
return f != NULL;
}
int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)
{
int pad = (-x*3) & 3;
return outfile(filename,-1,-1,x,y,comp,(void *) data,0,pad,
"11 4 22 4" "4 44 22 444444",
'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header
40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header
}
int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)
{
int has_alpha = !(comp & 1);
return outfile(filename, -1,-1, x, y, comp, (void *) data, has_alpha, 0,
"111 221 2222 11", 0,0,2, 0,0,0, 0,0,x,y, 24+8*has_alpha, 8*has_alpha);
}
// stretchy buffer; stbi__sbpush() == vector<>::push_back() -- stbi__sbcount() == vector<>::size()
#define stbi__sbraw(a) ((int *) (a) - 2)
#define stbi__sbm(a) stbi__sbraw(a)[0]
#define stbi__sbn(a) stbi__sbraw(a)[1]
#define stbi__sbneedgrow(a,n) ((a)==0 || stbi__sbn(a)+n >= stbi__sbm(a))
#define stbi__sbmaybegrow(a,n) (stbi__sbneedgrow(a,(n)) ? stbi__sbgrow(a,n) : 0)
#define stbi__sbgrow(a,n) stbi__sbgrowf((void **) &(a), (n), sizeof(*(a)))
#define stbi__sbpush(a, v) (stbi__sbmaybegrow(a,1), (a)[stbi__sbn(a)++] = (v))
#define stbi__sbcount(a) ((a) ? stbi__sbn(a) : 0)
#define stbi__sbfree(a) ((a) ? free(stbi__sbraw(a)),0 : 0)
static void *stbi__sbgrowf(void **arr, int increment, int itemsize)
{
int m = *arr ? 2*stbi__sbm(*arr)+increment : increment+1;
void *p = realloc(*arr ? stbi__sbraw(*arr) : 0, itemsize * m + sizeof(int)*2);
assert(p);
if (p) {
if (!*arr) ((int *) p)[1] = 0;
*arr = (void *) ((int *) p + 2);
stbi__sbm(*arr) = m;
}
return *arr;
}
static unsigned char *stbi__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)
{
while (*bitcount >= 8) {
stbi__sbpush(data, *bitbuffer);
*bitbuffer >>= 8;
*bitcount -= 8;
}
return data;
}
static int stbi__zlib_bitrev(int code, int codebits)
{
int res=0;
while (codebits--) {
res = (res << 1) | (code & 1);
code >>= 1;
}
return res;
}
static unsigned int stbi__zlib_countm(unsigned char *a, unsigned char *b, int limit)
{
int i;
for (i=0; i < limit && i < 258; ++i)
if (a[i] != b[i]) break;
return i;
}
static unsigned int stbi__zhash(unsigned char *data)
{
stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
}
#define stbi__zlib_flush() (out = stbi__zlib_flushf(out, &bitbuf, &bitcount))
#define stbi__zlib_add(code,codebits) \
(bitbuf |= (code) << bitcount, bitcount += (codebits), stbi__zlib_flush())
#define stbi__zlib_huffa(b,c) stbi__zlib_add(stbi__zlib_bitrev(b,c),c)
// default huffman tables
#define stbi__zlib_huff1(n) stbi__zlib_huffa(0x30 + (n), 8)
#define stbi__zlib_huff2(n) stbi__zlib_huffa(0x190 + (n)-144, 9)
#define stbi__zlib_huff3(n) stbi__zlib_huffa(0 + (n)-256,7)
#define stbi__zlib_huff4(n) stbi__zlib_huffa(0xc0 + (n)-280,8)
#define stbi__zlib_huff(n) ((n) <= 143 ? stbi__zlib_huff1(n) : (n) <= 255 ? stbi__zlib_huff2(n) : (n) <= 279 ? stbi__zlib_huff3(n) : stbi__zlib_huff4(n))
#define stbi__zlib_huffb(n) ((n) <= 143 ? stbi__zlib_huff1(n) : stbi__zlib_huff2(n))
#define stbi__ZHASH 16384
unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)
{
static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };
static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 };
static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };
static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
unsigned int bitbuf=0;
int i,j, bitcount=0;
unsigned char *out = NULL;
unsigned char **hash_table[stbi__ZHASH]; // 64KB on the stack!
if (quality < 5) quality = 5;
stbi__sbpush(out, 0x78); // DEFLATE 32K window
stbi__sbpush(out, 0x5e); // FLEVEL = 1
stbi__zlib_add(1,1); // BFINAL = 1
stbi__zlib_add(1,2); // BTYPE = 1 -- fixed huffman
for (i=0; i < stbi__ZHASH; ++i)
hash_table[i] = NULL;
i=0;
while (i < data_len-3) {
// hash next 3 bytes of data to be compressed
int h = stbi__zhash(data+i)&(stbi__ZHASH-1), best=3;
unsigned char *bestloc = 0;
unsigned char **hlist = hash_table[h];
int n = stbi__sbcount(hlist);
for (j=0; j < n; ++j) {
if (hlist[j]-data > i-32768) { // if entry lies within window
int d = stbi__zlib_countm(hlist[j], data+i, data_len-i);
if (d >= best) best=d,bestloc=hlist[j];
}
}
// when hash table entry is too long, delete half the entries
if (hash_table[h] && stbi__sbn(hash_table[h]) == 2*quality) {
memcpy(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);
stbi__sbn(hash_table[h]) = quality;
}
stbi__sbpush(hash_table[h],data+i);
if (bestloc) {
// "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal
h = stbi__zhash(data+i+1)&(stbi__ZHASH-1);
hlist = hash_table[h];
n = stbi__sbcount(hlist);
for (j=0; j < n; ++j) {
if (hlist[j]-data > i-32767) {
int e = stbi__zlib_countm(hlist[j], data+i+1, data_len-i-1);
if (e > best) { // if next match is better, bail on current match
bestloc = NULL;
break;
}
}
}
}
if (bestloc) {
int d = data+i - bestloc; // distance back
assert(d <= 32767 && best <= 258);
for (j=0; best > lengthc[j+1]-1; ++j);
stbi__zlib_huff(j+257);
if (lengtheb[j]) stbi__zlib_add(best - lengthc[j], lengtheb[j]);
for (j=0; d > distc[j+1]-1; ++j);
stbi__zlib_add(stbi__zlib_bitrev(j,5),5);
if (disteb[j]) stbi__zlib_add(d - distc[j], disteb[j]);
i += best;
} else {
stbi__zlib_huffb(data[i]);
++i;
}
}
// write out final bytes
for (;i < data_len; ++i)
stbi__zlib_huffb(data[i]);
stbi__zlib_huff(256); // end of block
// pad with 0 bits to byte boundary
while (bitcount)
stbi__zlib_add(0,1);
for (i=0; i < stbi__ZHASH; ++i)
(void) stbi__sbfree(hash_table[i]);
{
// compute adler32 on input
unsigned int i=0, s1=1, s2=0, blocklen = data_len % 5552;
int j=0;
while (j < data_len) {
for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1;
s1 %= 65521, s2 %= 65521;
j += blocklen;
blocklen = 5552;
}
stbi__sbpush(out, s2 >> 8);
stbi__sbpush(out, s2);
stbi__sbpush(out, s1 >> 8);
stbi__sbpush(out, s1);
}
*out_len = stbi__sbn(out);
// make returned pointer freeable
memmove(stbi__sbraw(out), out, *out_len);
return (unsigned char *) stbi__sbraw(out);
}
unsigned int stbi__crc32(unsigned char *buffer, int len)
{
static unsigned int crc_table[256];
unsigned int crc = ~0;
int i,j;
if (crc_table[1] == 0)
for(i=0; i < 256; i++)
for (crc_table[i]=i, j=0; j < 8; ++j)
crc_table[i] = (crc_table[i] >> 1) ^ (crc_table[i] & 1 ? 0xedb88320 : 0);
for (i=0; i < len; ++i)
crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];
return ~crc;
}
#define stbi__wpng4(o,a,b,c,d) ((o)[0]=(a),(o)[1]=(b),(o)[2]=(c),(o)[3]=(d),(o)+=4)
#define stbi__wp32(data,v) stbi__wpng4(data, v>>24,v>>16,v>>8,v);
#define stbi__wptag(data,s) stbi__wpng4(data, s[0],s[1],s[2],s[3])
static void stbi__wpcrc(unsigned char **data, int len)
{
unsigned int crc = stbi__crc32(*data - len - 4, len+4);
stbi__wp32(*data, crc);
}
static int stbi__paeth(int a, int b, int c)
{
int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);
if (pa <= pb && pa <= pc) return a;
if (pb <= pc) return b;
return c;
}
unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)
{
int ctype[5] = { -1, 0, 4, 2, 6 };
unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };
unsigned char *out,*o, *filt, *zlib;
signed char *line_buffer;
int i,j,k,p,zlen;
if (stride_bytes == 0)
stride_bytes = x * n;
filt = (unsigned char *) malloc((x*n+1) * y); if (!filt) return 0;
line_buffer = (signed char *) malloc(x * n); if (!line_buffer) { free(filt); return 0; }
for (j=0; j < y; ++j) {
static int mapping[] = { 0,1,2,3,4 };
static int firstmap[] = { 0,1,0,5,6 };
int *mymap = j ? mapping : firstmap;
int best = 0, bestval = 0x7fffffff;
for (p=0; p < 2; ++p) {
for (k= p?best:0; k < 5; ++k) {
int type = mymap[k],est=0;
unsigned char *z = pixels + stride_bytes*j;
for (i=0; i < n; ++i)
switch (type) {
case 0: line_buffer[i] = z[i]; break;
case 1: line_buffer[i] = z[i]; break;
case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;
case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break;
case 4: line_buffer[i] = z[i] - stbi__paeth(0,z[i-stride_bytes],0); break;
case 5: line_buffer[i] = z[i]; break;
case 6: line_buffer[i] = z[i]; break;
}
for (i=n; i < x*n; ++i) {
switch (type) {
case 0: line_buffer[i] = z[i]; break;
case 1: line_buffer[i] = z[i] - z[i-n]; break;
case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;
case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break;
case 4: line_buffer[i] = z[i] - stbi__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break;
case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;
case 6: line_buffer[i] = z[i] - stbi__paeth(z[i-n], 0,0); break;
}
}
if (p) break;
for (i=0; i < x*n; ++i)
est += abs((signed char) line_buffer[i]);
if (est < bestval) { bestval = est; best = k; }
}
}
// when we get here, best contains the filter type, and line_buffer contains the data
filt[j*(x*n+1)] = best;
memcpy(filt+j*(x*n+1)+1, line_buffer, x*n);
}
free(line_buffer);
zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory
free(filt);
if (!zlib) return 0;
// each tag requires 12 bytes of overhead
out = (unsigned char *) malloc(8 + 12+13 + 12+zlen + 12);
if (!out) return 0;
*out_len = 8 + 12+13 + 12+zlen + 12;
o=out;
memcpy(o,sig,8); o+= 8;
stbi__wp32(o, 13); // header length
stbi__wptag(o, "IHDR");
stbi__wp32(o, x);
stbi__wp32(o, y);
*o++ = 8;
*o++ = ctype[n];
*o++ = 0;
*o++ = 0;
*o++ = 0;
stbi__wpcrc(&o,13);
stbi__wp32(o, zlen);
stbi__wptag(o, "IDAT");
memcpy(o, zlib, zlen); o += zlen; free(zlib);
stbi__wpcrc(&o, zlen);
stbi__wp32(o,0);
stbi__wptag(o, "IEND");
stbi__wpcrc(&o,0);
assert(o == out + *out_len);
return out;
}
int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)
{
FILE *f;
int len;
unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);
if (!png) return 0;
f = fopen(filename, "wb");
if (!f) { free(png); return 0; }
fwrite(png, 1, len, f);
fclose(f);
free(png);
return 1;
}
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
/* Revision history
0.91 (2010-07-17)
first public release
0.90 first internal release
*/