png_dynamic_io.hppGo to the documentation of this file.00001 /* 00002 Copyright 2005-2007 Adobe Systems Incorporated 00003 00004 Use, modification and distribution are subject to the Boost Software License, 00005 Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 00006 http://www.boost.org/LICENSE_1_0.txt). 00007 00008 See http://opensource.adobe.com/gil for most recent version including documentation. 00009 */ 00010 00011 /*************************************************************************************************/ 00012 00013 #ifndef GIL_PNG_DYNAMIC_IO_H 00014 #define GIL_PNG_DYNAMIC_IO_H 00015 00023 // 00024 // We are currently providing the following functions: 00025 // template <typename Images> void png_read_image(const char*,any_image<Images>&) 00026 // template <typename Images> void png_read_image(FILE*,any_image<Images>&,std::size_t) 00027 // template <typename Views> void png_write_view(const char*,const any_image_view<View>&) 00028 // template <typename Views> void png_write_view(FILE*,const any_image_view<View>&) 00029 00030 00031 #include <string> 00032 #include <stdio.h> 00033 #include <boost/mpl/bool.hpp> 00034 #include <boost/shared_ptr.hpp> 00035 #include "../dynamic_image/dynamic_image_all.hpp" 00036 #include "io_error.hpp" 00037 #include "png_io.hpp" 00038 #include "png_io_private.hpp" 00039 #include "dynamic_io.hpp" 00040 00041 namespace boost { namespace gil { 00042 00043 namespace detail { 00044 00045 struct png_write_is_supported { 00046 template<typename View> struct apply 00047 : public mpl::bool_<png_write_support<View>::is_supported> {}; 00048 }; 00049 00050 class png_writer_dynamic : public png_writer { 00051 public: 00052 png_writer_dynamic(FILE* file ) : png_writer(file) {} 00053 png_writer_dynamic(const char* filename) : png_writer(filename){} 00054 00055 template <typename Views> 00056 void write_view(const any_image_view<Views>& runtime_view) { 00057 dynamic_io_fnobj<png_write_is_supported, png_writer> op(this); 00058 apply_operation(runtime_view,op); 00059 } 00060 }; 00061 00062 class png_type_format_checker { 00063 int _bit_depth; 00064 int _color_type; 00065 public: 00066 png_type_format_checker(int bit_depth_in,int color_type_in) : 00067 _bit_depth(bit_depth_in),_color_type(color_type_in) {} 00068 template <typename Image> 00069 bool apply() { 00070 return png_read_support<typename Image::view_t>::bit_depth==_bit_depth && 00071 png_read_support<typename Image::view_t>::color_type==_color_type; 00072 } 00073 }; 00074 00075 struct png_read_is_supported { 00076 template<typename View> struct apply 00077 : public mpl::bool_<png_read_support<View>::is_supported> {}; 00078 }; 00079 00080 class png_reader_dynamic : public png_reader { 00081 public: 00082 png_reader_dynamic(FILE* file) : png_reader(file) {} 00083 png_reader_dynamic(const char* filename) : png_reader(filename){} 00084 00085 template <typename Images> 00086 void read_image(any_image<Images>& im) { 00087 png_uint_32 width, height; 00088 int bit_depth, color_type, interlace_type; 00089 png_get_IHDR(_png_ptr, _info_ptr, 00090 &width, &height,&bit_depth,&color_type,&interlace_type, 00091 int_p_NULL, int_p_NULL); 00092 if (!construct_matched(im,png_type_format_checker(bit_depth,color_type))) { 00093 io_error("png_reader_dynamic::read_image(): no matching image type between those of the given any_image and that of the file"); 00094 } else { 00095 im.recreate(width,height); 00096 dynamic_io_fnobj<png_read_is_supported, png_reader> op(this); 00097 apply_operation(view(im),op); 00098 } 00099 } 00100 }; 00101 00102 } // namespace detail 00103 00109 template <typename Images> 00110 inline void png_read_image(const char* filename,any_image<Images>& im) { 00111 detail::png_reader_dynamic m(filename); 00112 m.read_image(im); 00113 } 00114 00117 template <typename Images> 00118 inline void png_read_image(const std::string& filename,any_image<Images>& im) { 00119 png_read_image(filename.c_str(),im); 00120 } 00121 00126 template <typename Views> 00127 inline void png_write_view(const char* filename,const any_image_view<Views>& runtime_view) { 00128 detail::png_writer_dynamic m(filename); 00129 m.write_view(runtime_view); 00130 } 00131 00134 template <typename Views> 00135 inline void png_write_view(const std::string& filename,const any_image_view<Views>& runtime_view) { 00136 png_write_view(filename.c_str(),runtime_view); 00137 } 00138 00139 } } // namespace boost::gil 00140 00141 #endif Generated on Sat May 2 13:50:14 2009 for Generic Image Library by 1.5.6 |