Integrated Reader with lodepng copy-paste

This commit is contained in:
Alex Zolotarev 2011-07-03 03:34:52 +03:00 committed by Alex Zolotarev
parent 10409ecd52
commit ed59aa6cb9
5 changed files with 38 additions and 37 deletions

View file

@ -30,9 +30,6 @@ You are free to name this file lodepng.cpp or lodepng.c depending on your usage.
#include "lodepng.hpp"
#include "file_reader.hpp"
#include "file_writer.hpp"
#define VERSION_STRING "20100314"
/* ////////////////////////////////////////////////////////////////////////// */
@ -4257,9 +4254,8 @@ namespace LodePNG
//#ifdef LODEPNG_COMPILE_DISK
void loadFile(std::vector<unsigned char>& buffer, const std::string& filename) //designed for loading files from hard disk in an std::vector
void loadFile(std::vector<unsigned char>& buffer, ReaderPtr<Reader> & reader) //designed for loading files from hard disk in an std::vector
{
FileReader reader(filename);
uint64_t const sz = reader.Size();
if (sz > 0)
{
@ -4269,15 +4265,15 @@ namespace LodePNG
}
/*write given buffer to the file, overwriting the file, it doesn't append to it.*/
void saveFile(const std::vector<unsigned char>& buffer, const std::string& filename)
{
size_t const sz = buffer.size();
if (sz > 0)
{
FileWriter writer(filename);
writer.Write(&buffer[0], sz);
}
}
// void saveFile(const std::vector<unsigned char>& buffer, const std::string& filename)
// {
// size_t const sz = buffer.size();
// if (sz > 0)
// {
// FileWriter writer(filename);
// writer.Write(&buffer[0], sz);
// }
// }
//#endif /*LODEPNG_COMPILE_DISK*/

View file

@ -30,6 +30,8 @@ freely, subject to the following restrictions:
#include <stdlib.h>
#include <string.h>
#include "reader.hpp"
/* ////////////////////////////////////////////////////////////////////////// */
/* Code Sections */
/* ////////////////////////////////////////////////////////////////////////// */
@ -488,8 +490,8 @@ namespace LodePNG
//#ifdef LODEPNG_COMPILE_DISK
//free functions allowing to load and save a file from/to harddisk
void loadFile(std::vector<unsigned char>& buffer, const std::string& filename);
void saveFile(const std::vector<unsigned char>& buffer, const std::string& filename);
void loadFile(std::vector<unsigned char>& buffer, ReaderPtr<Reader> & reader);
// void saveFile(const std::vector<unsigned char>& buffer, const std::string& filename);
//#endif //LODEPNG_COMPILE_DISK
} //namespace LodePNG

View file

@ -41,17 +41,17 @@ namespace boost { namespace gil {
/// \ingroup LODEPNG_IO
/// \brief Returns the width and height of the PNG file at the specified location.
/// Throws std::ios_base::failure if the location does not correspond to a valid PNG file
inline point2<std::ptrdiff_t> lodepng_read_dimensions(const char *filename) {
detail::lodepng_reader m(filename);
inline point2<std::ptrdiff_t> lodepng_read_dimensions(ReaderPtr<Reader> & reader) {
detail::lodepng_reader m(reader);
return m.get_dimensions();
}
/// \ingroup LODEPNG_IO
/// \brief Returns the width and height of the PNG file at the specified location.
/// Throws std::ios_base::failure if the location does not correspond to a valid PNG file
inline point2<std::ptrdiff_t> lodepng_read_dimensions(const std::string& filename) {
return lodepng_read_dimensions(filename.c_str());
}
//inline point2<std::ptrdiff_t> lodepng_read_dimensions(ReaderPtr<Reader> & reader) {
// return lodepng_read_dimensions(reader);
//}
/// \ingroup LODEPNG_IO
/// \brief Determines whether the given view type is supported for reading
@ -143,8 +143,8 @@ inline void lodepng_read_and_convert_view(const std::string& filename,const View
/// \brief Allocates a new image whose dimensions are determined by the given png image file, loads and color-converts the pixels into it.
/// Throws std::ios_base::failure if the file is not a valid PNG file
template <typename Image,typename CC>
inline void lodepng_read_and_convert_image(const char* filename,Image& im,CC cc) {
detail::lodepng_reader_color_convert<CC> m(filename,cc);
inline void lodepng_read_and_convert_image(ReaderPtr<Reader> & reader,Image& im,CC cc) {
detail::lodepng_reader_color_convert<CC> m(reader,cc);
m.read_image(im);
}

View file

@ -145,11 +145,11 @@ struct lodepng_write_support_private<bits16,rgba_t> {
BOOST_STATIC_CONSTANT(int,color_type=LODEPNG_COLOR_TYPE_RGBA);
};
class lodepng_reader : public file_mgr {
class lodepng_reader {
protected:
LodePNG::Decoder m_decoder;
std::string m_fileName;
ReaderPtr<Reader> & m_reader;
int sig_cmp(unsigned char * sig, size_t start, size_t num_to_check)
{
@ -174,15 +174,16 @@ protected:
void init()
{
unsigned char buf[30];
io_error_if(fread(buf, 1, 30, get()) != 30,
"lodepng_check_validity: fail to read file");
m_decoder.inspect(buf, 30);
unsigned char buf[30];
m_reader.Read(0, buf, 30);
// io_error_if(fread(buf, 1, 30, get()) != 30,
// "lodepng_check_validity: fail to read file");
m_decoder.inspect(buf, 30);
}
public:
lodepng_reader(const char* filename) : file_mgr(filename, "rb"), m_fileName(filename) { init(); }
lodepng_reader(ReaderPtr<Reader> & reader) : m_reader(reader) { init(); }
point2<std::ptrdiff_t> get_dimensions() {
return point2<std::ptrdiff_t>(m_decoder.getWidth(), m_decoder.getHeight());
@ -205,7 +206,7 @@ public:
io_error("lodepng_read_view: input view type is incompatible with the image type(colorType mismatch)");
std::vector<unsigned char> inputData;
LodePNG::loadFile(inputData, m_fileName);
LodePNG::loadFile(inputData, m_reader);
std::vector<unsigned char> decodedData;
m_decoder.decode(decodedData, inputData);
@ -239,8 +240,8 @@ class lodepng_reader_color_convert : public lodepng_reader {
private:
CC _cc;
public:
lodepng_reader_color_convert(const char* filename,CC cc_in) : lodepng_reader(filename),_cc(cc_in) {}
lodepng_reader_color_convert(const char* filename) : lodepng_reader(filename) {}
lodepng_reader_color_convert(ReaderPtr<Reader> & reader, CC cc_in) : lodepng_reader(reader),_cc(cc_in) {}
lodepng_reader_color_convert(ReaderPtr<Reader> & reader) : lodepng_reader(reader) {}
template <typename View>
void apply(const View& view)
{
@ -249,7 +250,7 @@ public:
"lodepng_read_view: input view size does not match PNG file size");
std::vector<unsigned char> inputData;
LodePNG::loadFile(inputData, m_fileName);
LodePNG::loadFile(inputData, m_reader);
std::vector<unsigned char> decodedData;
m_decoder.decode(decodedData, inputData);
@ -417,7 +418,7 @@ public:
view.height()
);
LodePNG::saveFile(buffer, m_fileName);
// LodePNG::saveFile(buffer, m_fileName);
}
};

View file

@ -20,7 +20,8 @@ namespace yg
inline m2::PointU const GetDimensions(string const & fileName)
{
gil::point2<ptrdiff_t> size = gil::lodepng_read_dimensions(GetPlatform().ReadPathForFile(fileName));
ReaderPtr<Reader> reader = GetPlatform().GetReader(fileName);
gil::point2<ptrdiff_t> size = gil::lodepng_read_dimensions(reader);
return m2::PointU(size.x, size.y);
}
@ -50,7 +51,8 @@ namespace yg
Texture(string const & fileName) : BaseTexture(GetDimensions(fileName))
{
typename Traits::image_t image(width(), height());
gil::lodepng_read_and_convert_image(GetPlatform().ReadPathForFile(fileName), image, typename Traits::color_converter());
ReaderPtr<Reader> reader = GetPlatform().GetReader(fileName);
gil::lodepng_read_and_convert_image(reader, image, typename Traits::color_converter());
upload(&gil::view(image)(0, 0));
}