diff --git a/build/codeblocks/nana.cbp b/build/codeblocks/nana.cbp
index bf4b1d0b..03e6b72f 100644
--- a/build/codeblocks/nana.cbp
+++ b/build/codeblocks/nana.cbp
@@ -14,8 +14,11 @@
+
+
+
@@ -26,8 +29,11 @@
-
+
+
+
+
diff --git a/build/codeblocks/nana.layout b/build/codeblocks/nana.layout
deleted file mode 100644
index f540b83b..00000000
--- a/build/codeblocks/nana.layout
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/makefile/makefile b/build/makefile/makefile
index 8b1fbde8..db31cf6e 100644
--- a/build/makefile/makefile
+++ b/build/makefile/makefile
@@ -35,7 +35,7 @@ $(BIN): $(LINKOBJ)
ranlib ../bin/$(BIN)
.cpp.o:
- $(GCC) -g -c $< -o $@ $(INCS) -std=c++0x -Wall
+ $(GCC) -g -c $< -o $@ $(INCS) -std=c++11 -Wall
clean:
rm -f $(LINKOBJ)
diff --git a/build/vc2013/nana.vcxproj b/build/vc2013/nana.vcxproj
index 9739063d..41477943 100644
--- a/build/vc2013/nana.vcxproj
+++ b/build/vc2013/nana.vcxproj
@@ -68,31 +68,35 @@
../bin/
- ..\..\include;..\..\extrlib;$(IncludePath)
+ ..\..\include;..\..\extrlib\vc2013;$(IncludePath)
..\..\source;$(VC_SourcePath);
$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)
..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\
+ ..\..\extrlib\vc2013;$(LibraryPath)
- ..\..\include;$(IncludePath)
+ ..\..\include;..\..\extrlib\vc2013;$(IncludePath)
..\..\source;$(VC_SourcePath);
../bin/
$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)
..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\
+ ..\..\extrlib\vc2013;$(LibraryPath)
../bin/
- ..\..\include;$(IncludePath)
- ..\..\source;$(VC_SourcePath);
+ ..\..\include;..\..\extrlib\vc2013;$(IncludePath)
+ ..\..\source;$(VC_SourcePath)
$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)
..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\
+ ..\..\extrlib\vc2013;$(LibraryPath)
- ..\..\include;$(IncludePath)
+ ..\..\include;..\..\extrlib\vc2013;$(IncludePath)
..\..\source;$(VC_SourcePath);
../bin/
$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)
..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\
+ ..\..\extrlib\vc2013;$(LibraryPath)
diff --git a/build/vc2015/nana.vcxproj b/build/vc2015/nana.vcxproj
index fd9219b1..a58481fa 100644
--- a/build/vc2015/nana.vcxproj
+++ b/build/vc2015/nana.vcxproj
@@ -70,14 +70,24 @@
- ../../include;$(IncludePath)
+ ../../include;../../extrlib/vc2015;$(IncludePath)
..\bin\vc2015\
lib$(ProjectName)
+ ../../extrlib/vc2015;$(LibraryPath)
- ../../include;../../extrlib;$(IncludePath)
+ ../../include;../../extrlib/vc2015;$(IncludePath)
..\bin\vc2015\
lib$(ProjectName)d
+ ../../extrlib/vc2015;$(LibraryPath)
+
+
+ ../../include;../../extrlib/vc2015;$(IncludePath)
+ ../../extrlib/vc2015;$(LibraryPath)
+
+
+ ../../include;../../extrlib/vc2015;$(IncludePath)
+ ../../extrlib/vc2015;$(LibraryPath)
diff --git a/include/nana/config.hpp b/include/nana/config.hpp
index 6d2cf836..9e0a2df7 100644
--- a/include/nana/config.hpp
+++ b/include/nana/config.hpp
@@ -78,13 +78,15 @@
#endif
#endif
+///////////////////
//Support for PNG
-// Comment it to disable the feature of support for PNG.
-//#define NANA_ENABLE_PNG
+// Define the NANA_ENABLE_PNG to enable the support of PNG.
+//
+//#define NANA_ENABLE_PNG //!
#if defined(NANA_ENABLE_PNG)
- //Comment it to use libpng from operating system.
- #define NANA_LIBPNG
+ #define NANA_LIBPNG //Comment it to use libpng from operating system.
#endif
+
#endif //NANA_CONFIG_HPP
diff --git a/include/nana/paint/detail/image_processor.hpp b/include/nana/paint/detail/image_processor.hpp
index da3b8fb8..ae4355b0 100644
--- a/include/nana/paint/detail/image_processor.hpp
+++ b/include/nana/paint/detail/image_processor.hpp
@@ -28,6 +28,18 @@ namespace detail
{
namespace algorithms
{
+ ///@brief Seek a pixel address by using offset bytes
+ ///@return the specified pixel address
+ inline pixel_color_t * pixel_at(pixel_color_t * p, std::size_t bytes) //deprecated
+ {
+ return reinterpret_cast(reinterpret_cast(p) + bytes);
+ }
+
+ inline const pixel_color_t * pixel_at(const pixel_color_t * p, std::size_t bytes)
+ {
+ return reinterpret_cast(reinterpret_cast(p) + bytes);
+ }
+
class proximal_interoplation
: public image_process::stretch_interface
{
diff --git a/include/nana/paint/pixel_buffer.hpp b/include/nana/paint/pixel_buffer.hpp
index 81af6024..49d2fc4e 100644
--- a/include/nana/paint/pixel_buffer.hpp
+++ b/include/nana/paint/pixel_buffer.hpp
@@ -1,7 +1,7 @@
/*
* Pixel Buffer Implementation
* Nana C++ Library(http://www.nanapro.org)
- * Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
+ * Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
@@ -18,18 +18,6 @@
namespace nana{ namespace paint
{
- ///@brief Seek a pixel address by using offset bytes
- ///@return the specified pixel address
- inline pixel_color_t * pixel_at(pixel_color_t * p, std::size_t bytes)
- {
- return reinterpret_cast(reinterpret_cast(p)+bytes);
- }
-
- inline const pixel_color_t * pixel_at(const pixel_color_t * p, std::size_t bytes)
- {
- return reinterpret_cast(reinterpret_cast(p)+bytes);
- }
-
class pixel_buffer
{
struct pixel_buffer_storage;
@@ -65,6 +53,8 @@ namespace nana{ namespace paint
pixel_color_t * raw_ptr(std::size_t row) const;
pixel_color_t * operator[](std::size_t row) const;
+ void fill_row(std::size_t row, const unsigned char* buffer, std::size_t bytes, unsigned bits_per_pixel);
+
void put(const unsigned char* rawbits, std::size_t width, std::size_t height, std::size_t bits_per_pixel, std::size_t bytes_per_line, bool is_negative);
void line(const std::string& name);
diff --git a/source/paint/detail/image_bmp.hpp b/source/paint/detail/image_bmp.hpp
index f8b08848..72d7f851 100644
--- a/source/paint/detail/image_bmp.hpp
+++ b/source/paint/detail/image_bmp.hpp
@@ -13,7 +13,8 @@
#ifndef NANA_PAINT_DETAIL_IMAGE_BMP_HPP
#define NANA_PAINT_DETAIL_IMAGE_BMP_HPP
-#include
+#include "image_pixbuf.hpp"
+
#include
namespace nana{ namespace paint
@@ -65,7 +66,7 @@ namespace nana{ namespace paint
#endif
class image_bmp
- :public image::image_impl_interface
+ :public basic_image_pixbuf
{
public:
image_bmp(){}
@@ -340,35 +341,6 @@ namespace nana{ namespace paint
{
return false;
}
-
- bool empty() const override
- {
- return pixbuf_.empty();
- }
-
- void close() override
- {
- pixbuf_.close();
- }
-
- nana::size size() const override
- {
- return pixbuf_.size();
- }
-
- void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
- {
- if(graph && pixbuf_)
- pixbuf_.paste(src_r, graph.handle(), p_dst);
- }
-
- void stretch(const nana::rectangle& src_r, graph_reference graph, const nana::rectangle& r) const override
- {
- if(graph && pixbuf_)
- pixbuf_.stretch(src_r, graph.handle(), r);
- }
- private:
- nana::paint::pixel_buffer pixbuf_;
};//end class bmpfile
}//end namespace detail
}//end namespace paint
diff --git a/source/paint/detail/image_pixbuf.hpp b/source/paint/detail/image_pixbuf.hpp
new file mode 100644
index 00000000..4c30f5e8
--- /dev/null
+++ b/source/paint/detail/image_pixbuf.hpp
@@ -0,0 +1,63 @@
+/*
+* Basic Image PixelBuffer Implementation
+* Nana C++ Library(http://www.nanapro.org)
+* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
+*
+* Distributed under the Boost Software License, Version 1.0.
+* (See accompanying file LICENSE_1_0.txt or copy at
+* http://www.boost.org/LICENSE_1_0.txt)
+*
+* @file: nana/paint/detail/image_pixbuf.hpp
+*/
+
+#ifndef NANA_PAINT_DETAIL_IMAGE_PIXBUF_HPP
+#define NANA_PAINT_DETAIL_IMAGE_PIXBUF_HPP
+
+#include
+#include
+
+namespace nana
+{
+ namespace paint{ namespace detail{
+
+ class basic_image_pixbuf
+ : public image::image_impl_interface
+ {
+ public:
+ bool alpha_channel() const override
+ {
+ return pixbuf_.alpha_channel();
+ }
+
+ bool empty() const override
+ {
+ return pixbuf_.empty();
+ }
+
+ void close() override
+ {
+ pixbuf_.close();
+ }
+
+ ::nana::size size() const override
+ {
+ return pixbuf_.size();
+ }
+
+ void paste(const ::nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
+ {
+ pixbuf_.paste(src_r, graph.handle(), p_dst);
+ }
+
+ void stretch(const ::nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const override
+ {
+ pixbuf_.stretch(src_r, dst.handle(), r);
+ }
+ protected:
+ pixel_buffer pixbuf_;
+ };
+ }//end namespace detail
+ }//end namespace paint
+}//end namespace nana
+
+#endif
diff --git a/source/paint/detail/image_png.hpp b/source/paint/detail/image_png.hpp
index 9ac776fe..ac42fafa 100644
--- a/source/paint/detail/image_png.hpp
+++ b/source/paint/detail/image_png.hpp
@@ -1,7 +1,7 @@
#ifndef NANA_PAINT_DETAIL_IMAGE_PNG_HPP
#define NANA_PAINT_DETAIL_IMAGE_PNG_HPP
-#include
+#include "image_pixbuf.hpp"
//Separate the libpng from the package that system provides.
#if defined(NANA_LIBPNG)
@@ -11,14 +11,13 @@
#endif
#include
-#include
namespace nana
{
namespace paint{ namespace detail{
class image_png
- : public image::image_impl_interface
+ : public basic_image_pixbuf
{
public:
bool open(const nana::char_t* png_file) override
@@ -164,39 +163,6 @@ namespace nana
throw std::logic_error("PNG is not supported for raw data buffer");
return false;
}
-
- bool alpha_channel() const override
- {
- return pixbuf_.alpha_channel();
- }
-
- virtual bool empty() const override
- {
- return pixbuf_.empty();
- }
-
- virtual void close() override
- {
- pixbuf_.close();
- }
-
- virtual nana::size size() const override
- {
- return pixbuf_.size();
- }
-
- void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
- {
- pixbuf_.paste(src_r, graph.handle(), p_dst);
- }
-
- void stretch(const nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const override
- {
- pixbuf_.stretch(src_r, dst.handle(), r);
- }
- private:
- nana::paint::pixel_buffer pixbuf_;
-
};
}//end namespace detail
}//end namespace paint
diff --git a/source/paint/image.cpp b/source/paint/image.cpp
index f27a55c9..144bb2e9 100644
--- a/source/paint/image.cpp
+++ b/source/paint/image.cpp
@@ -20,9 +20,12 @@
#include
#include
+
+
#if defined(NANA_ENABLE_PNG)
#include "detail/image_png.hpp"
#endif
+
#include "detail/image_bmp.hpp"
#include "detail/image_ico.hpp"
@@ -155,16 +158,17 @@ namespace paint
image::image_impl_interface::~image_impl_interface()
{}
-
- namespace detail
+ /*
+ namespace detail
{
- int toupper(int c)
+ int toupper(int c) //deprecated
{
return (('a' <= c && c <= 'z') ?
c - ('a' - 'A')
: c);
}
}//end namespace detail
+ //*/
//class image
image::image()
@@ -216,25 +220,48 @@ namespace paint
if(filename.size())
{
- nana::string fn;
- std::transform(filename.cbegin(), filename.cend(), std::back_inserter(fn), detail::toupper);
-
- if(filename.size() >= 4)
+ auto dotpos = filename.find_last_of('.');
+ if (dotpos != filename.npos)
{
- nana::string suffix = fn.substr(fn.size() - 4);
- if(STR(".ICO") == suffix)
+ auto type_str = ::nana::cistring(filename.substr(dotpos + 1).data());
+
+ do
{
+ if (STR("ICO") == type_str)
+ {
#if defined(NANA_WINDOWS)
- helper = new detail::image_ico(true);
+ helper = new detail::image_ico(true);
+#else
+ return false;
#endif
- }
+ break;
+ }
+
+ if (STR("PNG") == type_str)
+ {
#if defined(NANA_ENABLE_PNG)
- else if(STR(".PNG") == suffix)
- helper = new detail::image_png;
+ helper = new detail::image_png;
+#else
+ return false;
#endif
+ break;
+ }
+
+ if (STR("JPG") == type_str || STR("JPEG") == type_str)
+ {
+#if defined(NANA_ENABLE_JPEG)
+ helper = new detail::image_jpeg;
+#else
+ return false;
+#endif
+ break;
+ }
+ } while (false);
+
}
- if(0 == helper)
+ //Check for BMP
+ if(!helper)
{
#if defined(NANA_UNICODE)
std::ifstream ifs(std::string(nana::charset(filename)).c_str(), std::ios::binary);
diff --git a/source/paint/pixel_buffer.cpp b/source/paint/pixel_buffer.cpp
index 3c3a47c9..ff32bc11 100644
--- a/source/paint/pixel_buffer.cpp
+++ b/source/paint/pixel_buffer.cpp
@@ -611,6 +611,63 @@ namespace nana{ namespace paint
return reinterpret_cast(reinterpret_cast(sp->raw_pixel_buffer) + sp->bytes_per_line * row);
}
+ void pixel_buffer::fill_row(std::size_t row, const unsigned char* buffer, std::size_t bytes, unsigned bits_per_pixel)
+ {
+ auto sp = storage_.get();
+ if (!sp)
+ return;
+
+ auto row_ptr = sp->raw_pixel_buffer + sp->pixel_size.width * row;
+
+ //the number of pixels will be copied
+ auto const px_count = (sp->pixel_size.width <= (bytes / (bits_per_pixel / 8)) ? sp->pixel_size.width : (bytes / (bits_per_pixel / 8)));
+ if (32 == bits_per_pixel)
+ {
+ std::memcpy(row_ptr, buffer, px_count * 4);
+ }
+ else if (24 == bits_per_pixel)
+ {
+ for (auto p = row_ptr, end = row_ptr + px_count; p != end; ++p)
+ {
+ p->element.red = buffer[0];
+ p->element.green = buffer[1];
+ p->element.blue = buffer[2];
+
+ buffer += 3;
+ }
+ }
+ else if (16 == bits_per_pixel)
+ {
+ unsigned char palette[32];
+ for (std::size_t i = 0; i < 32; ++i)
+ palette[i] = static_cast(i * 255 / 31);
+
+#if defined(NANA_X11)
+ unsigned char palette_6bits[64];
+ for (std::size_t i = 0; i < 64; ++i)
+ palette_6bits[i] = static_cast(i * 255 / 63);
+#endif
+
+ auto px = reinterpret_cast(buffer);
+
+ for (auto p = row_ptr, end = row_ptr + px_count; p != end; ++p)
+ {
+ p->element.red = palette[(*px >> 11) & 0x1F];
+
+ //16-bits RGB format under X is 565, under Windows is 555
+#if defined(NANA_X11)
+ p->element.green = palette_6bits[(*px >> 5) & 0x3F];
+ p->element.blue = palette_[*px & 0x1F];
+#else
+ p->element.green = palette[(*px >> 6) & 0x1F];
+ p->element.blue = palette[(*px >> 1) & 0x1F];
+#endif
+ ++px;
+ }
+ }
+
+ }
+
void pixel_buffer::put(const unsigned char* rawbits, std::size_t width, std::size_t height, std::size_t bits_per_pixel, std::size_t bytes_per_line, bool is_negative)
{
if(storage_)