[Hdrflow-svn] SF.net SVN: hdrflow: [102] lib/openlibraries/src/openimagelib/plugins/jpg
Status: Pre-Alpha
Brought to you by:
glslang
|
From: <gl...@us...> - 2007-04-23 23:07:51
|
Revision: 102
http://hdrflow.svn.sourceforge.net/hdrflow/?rev=102&view=rev
Author: glslang
Date: 2007-04-23 16:07:38 -0700 (Mon, 23 Apr 2007)
Log Message:
-----------
+ JPEG HDR support - largely untested (for now)
Modified Paths:
--------------
lib/openlibraries/src/openimagelib/plugins/jpg/jpg_plugin.cpp
lib/openlibraries/src/openimagelib/plugins/jpg/jpg_vc8.vcproj
Modified: lib/openlibraries/src/openimagelib/plugins/jpg/jpg_plugin.cpp
===================================================================
--- lib/openlibraries/src/openimagelib/plugins/jpg/jpg_plugin.cpp 2007-04-22 22:25:15 UTC (rev 101)
+++ lib/openlibraries/src/openimagelib/plugins/jpg/jpg_plugin.cpp 2007-04-23 23:07:38 UTC (rev 102)
@@ -5,6 +5,10 @@
// Released under the LGPL.
// For more information, see http://www.openlibraries.org.
+#ifdef HAVE_CONFIG_H
+#include <openlibraries_global_config.hpp>
+#endif
+
#include <cstdlib>
#include <vector>
#include <string>
@@ -12,63 +16,137 @@
#include <openimagelib/plugins/jpg/jpg_plugin.hpp>
extern "C" {
-#include <jpeglib.h>
+#include <jpeglib.h>
}
+#ifdef HAVE_JPEGHDR
+#include <jpeghdr.h>
+#include <color.h>
+#endif
+
+namespace pl = olib::openpluginlib;
+
namespace olib { namespace openimagelib { namespace plugins { namespace JPG {
namespace
{
+ FILE* Fopen_s( const pl::string& path, const char* mode )
+ {
+#if _MSC_VER >= 1400
+ FILE* file;
+ fopen_s( &file, path.c_str( ), mode );
+ return file;
+#else
+ return fopen( path.c_str( ), mode );
+#endif
+ }
+
void destroy( il::image_type* im )
{ delete im; }
-
- il::image_type_ptr jpeg_pixelformat_to_image_type( int components, int width, int height )
+
+ void read_jpeg( jpeg_decompress_struct* info, il::image_type::pointer pixels, size_t pitch )
{
- switch( components )
+ int stride = info->output_width * info->output_components;
+
+ JSAMPARRAY buffer = ( *info->mem->alloc_sarray )( ( j_common_ptr ) info, JPOOL_IMAGE, stride, 1 );
+
+ while( info->output_scanline < info->output_height )
{
- case 3:
- return il::allocate( L"r8g8b8", width, height );
-
- default:
- return il::image_type_ptr( );
+ jpeg_read_scanlines( info, buffer, 1 );
+ memcpy( pixels, buffer[ 0 ], stride );
+ pixels += pitch;
}
+
+ ( *info->mem->free_pool )( ( j_common_ptr ) info, JPOOL_IMAGE );
+
+ jpeg_finish_decompress( info );
+ jpeg_destroy_decompress( info );
}
+#ifdef HAVE_JPEGHDR
+ void read_jpeg_hdr( jpeghdr_decompress_struct* info, il::image_type::pointer pixels, size_t pitch )
+ {
+ COLOR* buffer;
+
+ buffer = new COLOR [ info->cinfo.output_width ];
+
+ while( info->cinfo.output_scanline < info->cinfo.output_height )
+ {
+ jpeghdr_read_scanline( info, ( float* ) buffer );
+ memcpy( pixels, buffer, info->cinfo.output_width * sizeof( COLOR ) );
+ pixels += pitch;
+ }
+
+ delete[ ] buffer;
+
+ jpeghdr_finish_decompress( info );
+ jpeghdr_destroy_decompress( info );
+ }
+#endif
+
il::image_type_ptr load_jpg( const boost::filesystem::path& path )
{
- FILE* infile = fopen( path.native_directory_string( ).c_str( ), "rb" );
+ FILE* infile = Fopen_s( path.native_directory_string( ), "rb" );
if( infile == NULL ) return il::image_type_ptr( );
// TODO: some proper exception handling is needed. can't really be bothered
// with that setjmp thingie...
+#ifdef HAVE_JPEGHDR
+ jpeghdr_decompress_struct info;
+#else
struct jpeg_decompress_struct info;
+#endif
+ // set error structure.
struct jpeg_error_mgr jerr;
+#ifdef HAVE_JPEGHDR
+ info.cinfo.err = jpeg_std_error( &jerr );
+#else
info.err = jpeg_std_error( &jerr );
+#endif
+
+#ifdef HAVE_JPEGHDR
+ jpeghdr_create_decompress( &info );
+ jpeg_stdio_src( &info.cinfo, infile );
+ switch( jpeghdr_read_header( &info ) )
+ {
+ case JPEG_HEADER_OK:
+ info.cinfo.out_color_space = JCS_RGB;
+ jpeg_start_decompress( &info.cinfo );
+ break;
+
+ case JPEG_HEADER_HDR:
+ jpeghdr_start_decompress( &info );
+ break;
+
+ default:
+ return il::image_type_ptr( );
+ }
+#else
jpeg_create_decompress( &info );
jpeg_stdio_src( &info, infile );
jpeg_read_header( &info, TRUE );
jpeg_start_decompress( &info );
+#endif
- il::image_type_ptr image = jpeg_pixelformat_to_image_type( info.output_components, info.output_width, info.output_height );
+#ifdef HAVE_JPEGHDR
+ il::image_type_ptr image = il::allocate( L"r32g32b32f", info.cinfo.output_width, info.cinfo.output_height );
+#else
+ il::image_type_ptr image = il::allocate( L"r8g8b8", info.output_width, info.output_height );
+#endif
if( !image ) return il::image_type_ptr( );
-
- int stride = info.output_width * info.output_components;
- JSAMPARRAY buffer = ( *info.mem->alloc_sarray )( ( j_common_ptr ) &info, JPOOL_IMAGE, stride, 1 );
-
- int linesize = image->linesize( );
- unsigned char* pixels = image->data( );
- while( info.output_scanline < info.output_height )
- {
- jpeg_read_scanlines( &info, buffer, 1 );
- memcpy( pixels, buffer[ 0 ], linesize );
- pixels += image->pitch( );
- }
+ il::image_type::pointer pixels = image->data( );
- jpeg_finish_decompress( &info );
- jpeg_destroy_decompress( &info );
+#ifdef HAVE_JPEGHDR
+ if( jpeghdr_decompress_ishdr( &info ) )
+ read_jpeg_hdr( &info, pixels, image->pitch( ) );
+ else
+ read_jpeg( &info.cinfo, pixels, image->pitch( ) );
+#else
+ read_jpeg( &info, pixels, image->pitch( ) );
+#endif
fclose( infile );
@@ -81,7 +159,7 @@
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
unsigned char *line;
- FILE *out = fopen( path.native_directory_string( ).c_str( ), "wb" );
+ FILE *out = Fopen_s( path.native_directory_string( ), "wb" );
il::image_type_ptr image = il::convert( img, L"r8g8b8" );
image = il::conform( image, 0 );
Modified: lib/openlibraries/src/openimagelib/plugins/jpg/jpg_vc8.vcproj
===================================================================
--- lib/openlibraries/src/openimagelib/plugins/jpg/jpg_vc8.vcproj 2007-04-22 22:25:15 UTC (rev 101)
+++ lib/openlibraries/src/openimagelib/plugins/jpg/jpg_vc8.vcproj 2007-04-23 23:07:38 UTC (rev 102)
@@ -41,7 +41,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories=""$(SolutionDir)\src";"C:\Boost\include\boost-1_33_1";"C:\Program Files\HDR\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;OPENIMAGELIB_BUILD;HAVE_FLEX_STRING"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;OPENIMAGELIB_BUILD;HAVE_FLEX_STRING;HAVE_JPEGHDR"
MinimalRebuild="true"
ExceptionHandling="2"
BasicRuntimeChecks="3"
@@ -131,7 +131,7 @@
Name="VCCLCompilerTool"
Optimization="3"
AdditionalIncludeDirectories=""$(SolutionDir)\src";"C:\Boost\include\boost-1_33_1";"C:\Program Files\HDR\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;OPENIMAGELIB_BUILD;HAVE_FLEX_STRING"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;JPG_EXPORTS;OPENIMAGELIB_BUILD;HAVE_FLEX_STRING;HAVE_JPEGHDR"
ExceptionHandling="2"
RuntimeLibrary="0"
BufferSecurityCheck="false"
@@ -158,10 +158,11 @@
<Tool
Name="VCLinkerTool"
IgnoreImportLibrary="true"
- AdditionalDependencies="libjpeg.lib"
+ AdditionalDependencies="libjpeg.lib libjpeghdr.lib"
OutputFile="$(OutDir)/openimagelib_jpg-vc80-r-0_4_0.dll"
LinkIncremental="1"
AdditionalLibraryDirectories="C:\Boost\lib;"C:\Program Files\HDR\lib""
+ IgnoreDefaultLibraryNames="libc.lib"
GenerateDebugInformation="false"
SubSystem="2"
OptimizeReferences="2"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|