forked from organicmaps/organicmaps
Integrated Reader with lodepng copy-paste
This commit is contained in:
parent
10409ecd52
commit
ed59aa6cb9
5 changed files with 38 additions and 37 deletions
|
@ -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*/
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue