diff --git a/build/vc2013/nana.vcxproj b/build/vc2013/nana.vcxproj
index 9cdc46b0..610054bc 100644
--- a/build/vc2013/nana.vcxproj
+++ b/build/vc2013/nana.vcxproj
@@ -222,6 +222,7 @@
+
@@ -257,9 +258,129 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/build/vc2013/nana.vcxproj.filters b/build/vc2013/nana.vcxproj.filters
index ac073316..6ade66c7 100644
--- a/build/vc2013/nana.vcxproj.filters
+++ b/build/vc2013/nana.vcxproj.filters
@@ -58,6 +58,51 @@
{e95b4a72-643f-4416-af95-b0bbaf7f0c57}
+
+ {d421a05b-b868-4c3d-bdac-ff57d09f8d07}
+
+
+ {64c22f90-dce2-40dc-be98-edc9fe8951e8}
+
+
+ {91301ff5-79ac-40cc-a6db-bca2097ea763}
+
+
+ {81c62a28-ef5f-43f7-a6ce-e6c186cb411a}
+
+
+ {4a1db6f0-a4ee-4514-8e89-54ef9d52e3b8}
+
+
+ {c92e890a-ffd5-4efd-8b37-78ed9bbea1e1}
+
+
+ {63401f37-26a3-423e-87e6-6840344c3056}
+
+
+ {61385c08-f06b-4cf3-8e05-9b47d546164b}
+
+
+ {e9eadc97-4a14-4a4e-bb52-52d3a20e2693}
+
+
+ {5667eac1-0887-4936-9502-eac4dd8c1c1d}
+
+
+ {e6c4a4d9-b4b5-4c56-bb2a-486f3f777ecb}
+
+
+ {ac132633-f80c-4983-8e47-fa7fc17f666e}
+
+
+ {ee3e9e63-7221-409e-9659-25864e576e16}
+
+
+ {ef87057b-dff2-40aa-a05e-9dcd0b335c30}
+
+
+ {8ea232cf-bd7c-47e3-a694-6a8898b677d7}
+
@@ -74,6 +119,9 @@
Source Files\nana\detail\win32
+
+
+ Source Files\nana\filesystem
Source Files\nana\filesystem
@@ -300,18 +348,375 @@
Source Files\nana\gui\widgets
-
- Source Files\nana\filesystem
+
+
+
+ Source Files\nana\gui\widgets
-
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\widgets
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui\detail
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui
+
+
+ Header Files\gui\widgets\detail
+
+
+ Header Files\gui\widgets\detail
+
+
+ Header Files\gui\widgets\skeletons
+
+
+ Header Files\gui\widgets\skeletons
+
+
+ Header Files\gui\widgets\skeletons
+
+
+ Header Files\gui\widgets\skeletons
+
+
+ Header Files\gui\widgets\skeletons
+
+
Header Files
-
-
-
+
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files\detail\linux_X11
+
+
+ Header Files\detail\linux_X11
+
+
+ Header Files\detail\linux_X11
+
+
+ Header Files\detail\win32
+
+
+ Header Files\extrlib
+
+
+ Header Files\extrlib
+
+
+ Header Files\extrlib
+
+
+ Header Files\extrlib
+
+
+ Header Files\filesystem
+
+
+ Header Files\filesystem
+
+
+ Header Files\filesystem
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\paint\detail
+
+
+ Header Files\pat
+
+
+ Header Files\system
+
+
+ Header Files\system
+
+
+ Header Files\system
+
+
+ Header Files\system
+
+
+ Header Files\threads
+
+
+ Header Files\gui\widgets
+
-
\ No newline at end of file
+
diff --git a/build/vc2015/nana.vcxproj b/build/vc2015/nana.vcxproj
index 94b72562..d4f7f5d3 100644
--- a/build/vc2015/nana.vcxproj
+++ b/build/vc2015/nana.vcxproj
@@ -223,6 +223,7 @@
+
@@ -257,9 +258,6 @@
-
-
-
diff --git a/build/vc2015/nana.vcxproj.filters b/build/vc2015/nana.vcxproj.filters
index cb51dab8..81495341 100644
--- a/build/vc2015/nana.vcxproj.filters
+++ b/build/vc2015/nana.vcxproj.filters
@@ -303,10 +303,8 @@
Source Files\nana\filesystem
-
-
-
- Header Files
-
+
+ Source Files\nana\gui\widgets
+
\ No newline at end of file
diff --git a/include/nana/filesystem/filesystem.hpp b/include/nana/filesystem/filesystem.hpp
index b00760d2..284faea1 100644
--- a/include/nana/filesystem/filesystem.hpp
+++ b/include/nana/filesystem/filesystem.hpp
@@ -1,12 +1,13 @@
/*
* A filesystem Implementation
- * Copyright(C) 2003 Jinhao(cnjinhao@hotmail.com)
+ * 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: stdex/filesystem/filesystem.hpp
+ * @file: nana/filesystem/filesystem.hpp
* @description:
* file_iterator is a toolkit for applying each file and directory in a
* specified path.
diff --git a/include/nana/gui/detail/effects_renderer.hpp b/include/nana/gui/detail/effects_renderer.hpp
index 2937a1d5..2c4522a3 100644
--- a/include/nana/gui/detail/effects_renderer.hpp
+++ b/include/nana/gui/detail/effects_renderer.hpp
@@ -170,7 +170,7 @@ namespace nana{
pixbuf.pixel(0, r.height - 1, px2);
pixbuf.pixel(r.width - 1, r.height - 1, px3);
- pixbuf.paste(wd->root, r.x, r.y);
+ pixbuf.paste(wd->root, { r.x, r.y });
std::vector overlaps;
if(window_layer::read_overlaps(wd, visual, overlaps))
diff --git a/include/nana/gui/widgets/group.hpp b/include/nana/gui/widgets/group.hpp
new file mode 100644
index 00000000..cff1f21e
--- /dev/null
+++ b/include/nana/gui/widgets/group.hpp
@@ -0,0 +1,59 @@
+/**
+ * A group widget implementation
+ * Nana C++ Library(http://www.nanaro.org)
+ * Copyright(C) 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/gui/widgets/group.hpp
+ *
+ * @Author: Stefan Pfeifer(st-321), Ariel Vina-Rodriguez (qPCR4vir)
+ *
+ * @brief group is a widget used to visually group and layout other widgets.
+ */
+
+#ifndef NANA_GUI_WIDGETS_GROUP_HPP
+#define NANA_GUI_WIDGETS_GROUP_HPP
+
+#include
+#include
+
+namespace nana{
+ class group
+ : public panel
+ {
+ struct implement;
+ public:
+ group( window parent, ///<
+ std::wstring titel_ ={STR("")}, ///<
+ bool format =false, ///< Use a formated label?
+ unsigned gap =2, ///< betwen the content and the external limit
+ rectangle r ={} ///<
+ );
+
+ ~group();
+
+ place& get_place();
+
+ template
+ Widget* create_child(const char* field, Args && ... args)
+ {
+ auto wdg = new Widget(inner(), std::forward(args)...);
+ _m_add_child(field, wdg);
+ return wdg;
+ }
+
+ window inner();
+ private:
+ void _m_add_child(const char* field, widget*);
+
+ ::nana::string _m_caption() const override;
+ void _m_caption(::nana::string&&) override;
+ private:
+ std::unique_ptr impl_;
+ };
+
+}//end namespace nana
+#endif
diff --git a/include/nana/gui/widgets/skeletons/text_token_stream.hpp b/include/nana/gui/widgets/skeletons/text_token_stream.hpp
index beae23ee..eef80358 100644
--- a/include/nana/gui/widgets/skeletons/text_token_stream.hpp
+++ b/include/nana/gui/widgets/skeletons/text_token_stream.hpp
@@ -576,7 +576,7 @@ namespace nana{ namespace widgets{ namespace skeletons
if(size_ != image_.size())
image_.stretch(::nana::rectangle{ image_.size() }, graph, nana::rectangle(x, y, size_.width, size_.height));
else
- image_.paste(graph, x, y);
+ image_.paste(graph, point{ x, y });
}
virtual const nana::size & size() const override
diff --git a/include/nana/paint/detail/image_impl_interface.hpp b/include/nana/paint/detail/image_impl_interface.hpp
index b2a7df50..3d74ce5c 100644
--- a/include/nana/paint/detail/image_impl_interface.hpp
+++ b/include/nana/paint/detail/image_impl_interface.hpp
@@ -20,7 +20,7 @@ namespace nana{ namespace paint{
virtual bool empty() const = 0;
virtual void close() = 0;
virtual nana::size size() const = 0;
- virtual void paste(const nana::rectangle& src_r, graph_reference dst, int x, int y) const = 0;
+ virtual void paste(const nana::rectangle& src_r, graph_reference dst, const point& p_dst) const = 0;
virtual void stretch(const nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const = 0;
};//end class image::image_impl_interface
}//end namespace paint
diff --git a/include/nana/paint/image.hpp b/include/nana/paint/image.hpp
index b335a4fe..2b127586 100644
--- a/include/nana/paint/image.hpp
+++ b/include/nana/paint/image.hpp
@@ -43,7 +43,7 @@ namespace paint
bool alpha() const;
nana::size size() const;
- void paste(graphics& dst, int x, int y) const;
+ void paste(graphics& dst, const point& p_dst) const;
void paste(const nana::rectangle& r_src, graphics& dst, const point& p_dst) const;///< Paste the area of picture specified by r_src into the destination graphics specified by dst at position p_dst.
void stretch(const nana::rectangle& r_src, graphics& dst, const nana::rectangle& r_dst) const;///paste(tar, pos.x, pos.y);
+ frmobj.u.oneshot->paste(tar, pos);
});
break;
case frame::kind::framebuilder:
@@ -230,7 +230,7 @@ namespace nana
switch(frmobj.type)
{
case frame::kind::oneshot:
- frmobj.u.oneshot->paste(graph, pos.x, pos.y);
+ frmobj.u.oneshot->paste(graph, pos);
break;
case frame::kind::framebuilder:
if(rebuild_frame)
diff --git a/source/gui/widgets/button.cpp b/source/gui/widgets/button.cpp
index a43c47b4..9a4c676e 100644
--- a/source/gui/widgets/button.cpp
+++ b/source/gui/widgets/button.cpp
@@ -258,7 +258,7 @@ namespace nana{ namespace drawerbase
}
if(attr_.icon)
- attr_.icon->paste(graph, 3, (gsize.height - icon_sz.height) / 2);
+ attr_.icon->paste(graph, point{ 3, static_cast(gsize.height - icon_sz.height) / 2 });
}
void trigger::_m_draw(graph_reference graph)
diff --git a/source/gui/widgets/group.cpp b/source/gui/widgets/group.cpp
new file mode 100644
index 00000000..5b61a9e3
--- /dev/null
+++ b/source/gui/widgets/group.cpp
@@ -0,0 +1,113 @@
+/**
+ * A group widget implementation
+ * Nana C++ Library(http://www.nanaro.org)
+ * Copyright(C) 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/gui/widgets/group.cpp
+ *
+ * @Author: Stefan Pfeifer(st-321), Ariel Vina-Rodriguez (qPCR4vir)
+ *
+ * @brief group is a widget used to visually group and layout other widgets.
+ */
+
+
+#include
+#include
+#include
+
+namespace nana{
+
+ struct group::implement
+ {
+ label caption;
+ panel content;
+ place place_outter;
+ place place_content;
+
+ implement(group* host):
+ caption(*host),
+ content(*host),
+ place_outter(*host),
+ place_content(content)
+ {}
+ };
+
+ group::group( window parent, ///<
+ std::wstring titel_ /*={}*/, ///<
+ bool format /*=false*/, ///<
+ unsigned gap /*=2*/, ///<
+ rectangle r /*={} */ ///<
+ )
+ : panel (parent, r),
+ impl_(new implement(this))
+ {
+ impl_->caption.format(format);
+ ::nana::size sz = impl_->caption.measure(1000);
+ std::stringstream ft;
+
+ ft << "vert margin=[0," << gap << ","< >"
+ << " ";
+
+ auto & outter = impl_->place_outter;
+
+ outter.div(ft.str().c_str());
+
+ outter["titel"] << impl_->caption;
+ outter["content"] << impl_->content;
+ outter.collocate();
+
+ color pbg = API::bgcolor( parent);
+ impl_->caption.bgcolor(pbg.blend(colors::black, 0.975) );
+ color bg=pbg.blend(colors::black, 0.950 );
+
+ bgcolor(pbg);
+ impl_->content.bgcolor(bg);
+
+ drawing dw(*this);
+
+ // This drawing function is owner by the onwer of dw (the outer panel of the group widget), not by dw !!
+ dw.draw([gap, sz, bg, pbg](paint::graphics& graph)
+ {
+ graph.rectangle(true, pbg);
+ graph.round_rectangle(rectangle(point(gap - 1, sz.height / 2),
+ nana::size(graph.width() - 2 * (gap - 1), graph.height() - sz.height / 2 - (gap - 1))
+ ),
+ 3, 3, colors::gray_border, true, bg);
+ });
+ }
+
+ group::~group()
+ {
+ }
+
+ place& group::get_place()
+ {
+ return impl_->place_content;
+ }
+
+ window group::inner()
+ {
+ return impl_->content;
+ }
+
+ void group::_m_add_child(const char* field, widget* wdg)
+ {
+ impl_->place_content[field] << wdg->handle();
+ }
+
+ ::nana::string group::_m_caption() const
+ {
+ return impl_->caption.caption();
+ }
+
+ void group::_m_caption(::nana::string&& str)
+ {
+ return impl_->caption.caption(std::move(str));
+ }
+}//end namespace nana
+
diff --git a/source/gui/widgets/skeletons/text_editor.cpp b/source/gui/widgets/skeletons/text_editor.cpp
index 6cc33b51..d7a4533f 100644
--- a/source/gui/widgets/skeletons/text_editor.cpp
+++ b/source/gui/widgets/skeletons/text_editor.cpp
@@ -2534,8 +2534,34 @@ namespace nana{ namespace widgets
return true;
}
+ std::size_t eat_endl(const wchar_t* str, std::size_t pos)
+ {
+ auto ch = str[pos];
+ if (0 == ch)
+ return pos;
+
+ const wchar_t * endlstr;
+ switch (ch)
+ {
+ case L'\n':
+ endlstr = L"\n\r";
+ break;
+ case L'\r':
+ endlstr = L"\r\n";
+ break;
+ default:
+ return pos;
+ }
+
+ if (std::memcmp(str + pos, endlstr, sizeof(wchar_t) * 2) == 0)
+ return pos + 2;
+
+ return pos + 1;
+ }
+
bool text_editor::_m_resolve_text(const nana::string& text, std::vector> & lines)
{
+ auto const text_str = text.data();
std::size_t begin = 0;
while (true)
{
@@ -2548,13 +2574,23 @@ namespace nana{ namespace widgets
}
lines.emplace_back(begin, pos);
- begin = text.find_first_not_of(STR("\r\n"), pos + 1);
+
+ pos = eat_endl(text_str, pos);
+
+ begin = text.find_first_not_of(STR("\r\n"), pos);
//The number of new lines minus one
- const auto chp_end = text.data() + (begin == text.npos ? text.size() : begin);
- for (auto chp = text.data() + (pos + 1); chp != chp_end; ++chp)
- if (*chp == '\n')
+ const auto chp_end = text_str + (begin == text.npos ? text.size() : begin);
+
+ for (auto chp = text_str + pos; chp != chp_end; ++chp)
+ {
+ auto eats = eat_endl(chp, 0);
+ if (eats)
+ {
lines.emplace_back(0, 0);
+ chp += (eats - 1);
+ }
+ }
if (text.npos == begin)
{
@@ -2742,50 +2778,43 @@ namespace nana{ namespace widgets
const auto str_end = str + len;
auto & entities = parser.entities();
- for (auto & ent : entities)
+ for (auto & ent : entities)
+ {
+ const ::nana::char_t* ent_begin = nullptr;
+
+ int ent_off = 0;
+ if (str <= ent.begin && ent.begin < str_end)
{
- const ::nana::char_t* ent_begin = nullptr;
+ ent_begin = ent.begin;
+ ent_off = std::accumulate(glyphs, glyphs + (ent.begin - str), 0);
+ }
+ else if (ent.begin <= str && str < ent.end)
+ ent_begin = str;
- int ent_off = 0;
- if (str <= ent.begin && ent.begin < str_end)
+ if (ent_begin)
+ {
+ auto ent_end = (ent.end < str_end ? ent.end : str_end);
+ auto ent_pixels = std::accumulate(glyphs + (ent_begin - str), glyphs + (ent_end - str), unsigned{});
+
+ canvas.set_color(ent.scheme->bgcolor.invisible() ? _m_bgcolor() : ent.scheme->bgcolor);
+ canvas.set_text_color(ent.scheme->fgcolor.invisible() ? fgcolor : ent.scheme->fgcolor);
+
+ canvas.rectangle(true);
+
+ ent_pos.x += ent_off;
+ if (rtl)
{
- ent_begin = ent.begin;
- ent_off = std::accumulate(glyphs, glyphs + (ent.begin - str), 0);
+ //draw the whole text if it is a RTL text, because Arbic language is transformable.
+ canvas.string({}, str, len);
+ graph_.bitblt(::nana::rectangle{ ent_pos, ::nana::size{ ent_pixels, canvas.height() } }, canvas, ::nana::point{ ent_off, 0 });
}
- else if (ent.begin <= str && str < ent.end)
- ent_begin = str;
-
- if (ent_begin)
+ else
{
- auto ent_end = (ent.end < str_end ? ent.end : str_end);
- auto ent_pixels = std::accumulate(glyphs + (ent_begin - str), glyphs + (ent_end - str), unsigned{});
-
- if (ent.scheme->bgcolor.invisible())
- canvas.set_color(_m_bgcolor());
- else
- canvas.set_color(ent.scheme->bgcolor);
- canvas.rectangle(true);
-
- if (ent.scheme->fgcolor.invisible())
- canvas.set_text_color(fgcolor);
- else
- canvas.set_text_color(ent.scheme->fgcolor);
-
- ent_pos.x += ent_off;
-
- if (rtl)
- {
- //draw the whole text if it is a RTL text, because Arbic language is transformable.
- canvas.string({}, str, len);
- graph_.bitblt(::nana::rectangle{ ent_pos, ::nana::size{ ent_pixels, canvas.height() } }, canvas, ::nana::point{ ent_off, 0 });
- }
- else
- {
- canvas.string({}, ent_begin, ent_end - ent_begin);
- graph_.bitblt(::nana::rectangle{ ent_pos, ::nana::size{ ent_pixels, canvas.height() } }, canvas);
- }
+ canvas.string({}, ent_begin, ent_end - ent_begin);
+ graph_.bitblt(::nana::rectangle{ ent_pos, ::nana::size{ ent_pixels, canvas.height() } }, canvas);
}
}
+ }
}
void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& str, bool if_mask) const
@@ -2797,7 +2826,6 @@ namespace nana{ namespace widgets
if (if_mask && mask_char_)
mask_str.reset(new nana::string(str.size(), mask_char_));
-
auto & linestr = (if_mask && mask_char_ ? *mask_str : str);
unicode_bidi bidi;
diff --git a/source/gui/widgets/treebox.cpp b/source/gui/widgets/treebox.cpp
index 7e026e6c..98578aad 100644
--- a/source/gui/widgets/treebox.cpp
+++ b/source/gui/widgets/treebox.cpp
@@ -1263,7 +1263,7 @@ namespace nana
img->stretch(::nana::rectangle{ size }, graph, attr.area);
}
else
- img->paste(graph, attr.area.x + static_cast(attr.area.width - size.width) / 2, attr.area.y + static_cast(attr.area.height - size.height) / 2);
+ img->paste(graph, point{ attr.area.x + static_cast(attr.area.width - size.width) / 2, attr.area.y + static_cast(attr.area.height - size.height) / 2 });
}
}
}
diff --git a/include/nana/paint/detail/image_bmp.hpp b/source/paint/detail/image_bmp.hpp
similarity index 96%
rename from include/nana/paint/detail/image_bmp.hpp
rename to source/paint/detail/image_bmp.hpp
index 5397faef..77f87df2 100644
--- a/include/nana/paint/detail/image_bmp.hpp
+++ b/source/paint/detail/image_bmp.hpp
@@ -13,7 +13,7 @@
#ifndef NANA_PAINT_DETAIL_IMAGE_BMP_HPP
#define NANA_PAINT_DETAIL_IMAGE_BMP_HPP
-#include "image_impl_interface.hpp"
+#include
#include
namespace nana{ namespace paint
@@ -75,7 +75,7 @@ namespace nana{ namespace paint
this->close();
}
- bool open(const nana::char_t* filename)
+ bool open(const nana::char_t* filename) override
{
if(nullptr == filename) return false;
std::ifstream ifs;
@@ -330,33 +330,33 @@ namespace nana{ namespace paint
return (false == pixbuf_.empty());
}
- bool alpha_channel() const
+ bool alpha_channel() const override
{
return false;
}
- bool empty() const
+ bool empty() const override
{
return pixbuf_.empty();
}
- void close()
+ void close() override
{
pixbuf_.close();
}
- nana::size size() const
+ nana::size size() const override
{
return pixbuf_.size();
}
- void paste(const nana::rectangle& src_r, graph_reference graph, int x, int y) const
+ 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(), x, y);
+ pixbuf_.paste(src_r, graph.handle(), p_dst);
}
- void stretch(const nana::rectangle& src_r, graph_reference graph, const nana::rectangle& r) const
+ 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);
diff --git a/include/nana/paint/detail/image_ico.hpp b/source/paint/detail/image_ico.hpp
similarity index 69%
rename from include/nana/paint/detail/image_ico.hpp
rename to source/paint/detail/image_ico.hpp
index 8c66d19b..37226431 100644
--- a/include/nana/paint/detail/image_ico.hpp
+++ b/source/paint/detail/image_ico.hpp
@@ -1,7 +1,7 @@
#ifndef NANA_PAINT_DETAIL_IMAGE_ICO_HPP
#define NANA_PAINT_DETAIL_IMAGE_ICO_HPP
-#include "image_impl_interface.hpp"
+#include
namespace nana{ namespace paint
{
@@ -22,13 +22,13 @@ namespace nana{ namespace paint
public:
image_ico(bool is_ico);
- bool open(const nana::char_t* filename);
- bool alpha_channel() const;
- bool empty() const;
- void close();
- nana::size size() const;
- virtual void paste(const nana::rectangle& src_r, graph_reference graph, int x, int y) const;
- virtual void stretch(const nana::rectangle&, graph_reference graph, const nana::rectangle& r) const;
+ bool open(const nana::char_t* filename) override;
+ bool alpha_channel() const override;
+ bool empty() const override;
+ void close() override;
+ nana::size size() const override;
+ virtual void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override;
+ virtual void stretch(const nana::rectangle&, graph_reference graph, const nana::rectangle& r) const override;
const ptr_t & ptr() const;
private:
diff --git a/include/nana/paint/detail/image_png.hpp b/source/paint/detail/image_png.hpp
similarity index 91%
rename from include/nana/paint/detail/image_png.hpp
rename to source/paint/detail/image_png.hpp
index 9f54e8ef..cab432cd 100644
--- a/include/nana/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 "image_impl_interface.hpp"
+#include
//Separate the libpng from the package that system provides.
#if defined(NANA_LIBPNG)
@@ -11,7 +11,7 @@
#endif
#include
-#include "../pixel_buffer.hpp"
+#include
namespace nana
{
@@ -25,7 +25,7 @@ namespace nana
{
}
- bool open(const nana::char_t* png_file)
+ bool open(const nana::char_t* png_file) override
{
#ifdef NANA_UNICODE
FILE * fp = ::fopen(static_cast(nana::charset(png_file)).c_str(), "rb");
@@ -148,32 +148,32 @@ namespace nana
return is_opened;
}
- bool alpha_channel() const
+ bool alpha_channel() const override
{
return pixbuf_.alpha_channel();
}
- virtual bool empty() const
+ virtual bool empty() const override
{
return pixbuf_.empty();
}
- virtual void close()
+ virtual void close() override
{
pixbuf_.close();
}
- virtual nana::size size() const
+ virtual nana::size size() const override
{
return pixbuf_.size();
}
- void paste(const nana::rectangle& src_r, graph_reference graph, int x, int y) const
+ void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
{
- pixbuf_.paste(src_r, graph.handle(), x, y);
+ pixbuf_.paste(src_r, graph.handle(), p_dst);
}
- void stretch(const nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const
+ void stretch(const nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const override
{
pixbuf_.stretch(src_r, dst.handle(), r);
}
diff --git a/source/paint/detail/native_paint_interface.cpp b/source/paint/detail/native_paint_interface.cpp
index 05b66977..153ac5f0 100644
--- a/source/paint/detail/native_paint_interface.cpp
+++ b/source/paint/detail/native_paint_interface.cpp
@@ -100,8 +100,8 @@ namespace detail
void blend(drawable_type dw, const rectangle& area, pixel_color_t color, double fade_rate)
{
- if(fade_rate <= 0) return;
- if(fade_rate > 1) fade_rate = 1;
+ if (fade_rate <= 0) return;
+ if (fade_rate > 1) fade_rate = 1;
rectangle r;
if (false == ::nana::overlap(rectangle{ drawable_size(dw) }, area, r))
@@ -114,11 +114,11 @@ namespace detail
double lrate = 1 - fade_rate;
pixel_buffer pixbuf(dw, r.y, r.height);
- for(std::size_t row = 0; row < r.height; ++row)
+ for (std::size_t row = 0; row < r.height; ++row)
{
auto i = pixbuf.raw_ptr(row) + r.x;
const auto end = i + r.width;
- for(; i < end; ++i)
+ for (; i < end; ++i)
{
unsigned px_r = ((static_cast((i->value & 0xFF0000) * lrate) + red) & 0xFF0000);
unsigned px_g = ((static_cast((i->value & 0xFF00) * lrate) + green) & 0xFF00);
@@ -126,7 +126,7 @@ namespace detail
i->value = (px_r | px_g | px_b);
}
}
- pixbuf.paste(nana::rectangle(r.x, 0, r.width, r.height), dw, r.x, r.y);
+ pixbuf.paste(nana::rectangle(r.x, 0, r.width, r.height), dw, point{r.x, r.y});
}
nana::size raw_text_extent_size(drawable_type dw, const nana::char_t* text, std::size_t len)
diff --git a/source/paint/graphics.cpp b/source/paint/graphics.cpp
index 76e9aefc..343f4c6f 100644
--- a/source/paint/graphics.cpp
+++ b/source/paint/graphics.cpp
@@ -618,7 +618,7 @@ namespace paint
{
pixel_buffer pixbuf(handle_, 0, 0);
pixbuf.blur(r, radius);
- pixbuf.paste(handle_, 0, 0);
+ pixbuf.paste(handle_, point{});
}
}
@@ -677,7 +677,7 @@ namespace paint
}
delete [] tablebuf;
- pixbuf.paste(handle_, 0, 0);
+ pixbuf.paste(handle_, point{});
if(changed_ == false) changed_ = true;
}
}
@@ -1074,7 +1074,7 @@ namespace paint
if (pxbuf_.open(handle_))
{
pxbuf_.gradual_rectangle(rct, from, to, 0.0, vertical);
- pxbuf_.paste(handle_, 0, 0);
+ pxbuf_.paste(handle_, point{});
}
#elif defined(NANA_X11)
if (nullptr == handle_) return;
diff --git a/source/paint/image.cpp b/source/paint/image.cpp
index 39aac942..2312c9c6 100644
--- a/source/paint/image.cpp
+++ b/source/paint/image.cpp
@@ -16,14 +16,15 @@
#include
#include
#include
+#include
#include
#include
#if defined(NANA_ENABLE_PNG)
- #include
+ #include "detail/image_png.hpp"
#endif
-#include
-#include
+#include "detail/image_bmp.hpp"
+#include "detail/image_ico.hpp"
namespace nana
{
@@ -89,12 +90,12 @@ namespace paint
return size_;
}
- void image_ico::paste(const nana::rectangle& src_r, graph_reference graph, int x, int y) const
+ void image_ico::paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const
{
if(ptr_ && (graph.empty() == false))
{
#if defined(NANA_WINDOWS)
- ::DrawIconEx(graph.handle()->context, x, y, *ptr_, src_r.width, src_r.height, 0, 0, DI_NORMAL);
+ ::DrawIconEx(graph.handle()->context, p_dst.x, p_dst.y, *ptr_, src_r.width, src_r.height, 0, 0, DI_NORMAL);
#endif
}
}
@@ -260,22 +261,40 @@ namespace paint
return (image_ptr_ ? image_ptr_->size() : nana::size());
}
- void image::paste(graphics& dst, int x, int y) const
+ void image::paste(graphics& dst, const point& p_dst) const
{
- if(image_ptr_)
- image_ptr_->paste(::nana::rectangle{ image_ptr_->size() }, dst, x, y);
+ if(image_ptr_ && !dst.empty())
+ image_ptr_->paste(::nana::rectangle{ image_ptr_->size() }, dst, p_dst);
+
+ if (!image_ptr_)
+ throw std::runtime_error("image is empty");
+
+ if (dst.empty())
+ throw std::invalid_argument("graphics is empty");
}
void image::paste(const nana::rectangle& r_src, graphics & dst, const nana::point& p_dst) const
{
- if(image_ptr_)
- image_ptr_->paste(r_src, dst, p_dst.x, p_dst.y);
+ if(image_ptr_ && !dst.empty())
+ image_ptr_->paste(r_src, dst, p_dst);
+
+ if (!image_ptr_)
+ throw std::runtime_error("image is empty");
+
+ if (dst.empty())
+ throw std::invalid_argument("graphics is empty");
}
void image::stretch(const nana::rectangle& r_src, graphics& dst, const nana::rectangle & r_dst) const
{
- if(image_ptr_)
- image_ptr_->stretch(r_src, dst, r_dst);
+ if(image_ptr_ && !dst.empty())
+ image_ptr_->stretch(r_src, dst, r_dst);
+
+ if (!image_ptr_)
+ throw std::runtime_error("image is empty");
+
+ if (dst.empty())
+ throw std::invalid_argument("graphics is empty");
}
//end class image
diff --git a/source/paint/pixel_buffer.cpp b/source/paint/pixel_buffer.cpp
index 787d2532..e89c3a0e 100644
--- a/source/paint/pixel_buffer.cpp
+++ b/source/paint/pixel_buffer.cpp
@@ -633,13 +633,13 @@ namespace nana{ namespace paint
*reinterpret_cast(reinterpret_cast(sp->raw_pixel_buffer + x) + y * sp->bytes_per_line) = px;
}
- void pixel_buffer::paste(drawable_type drawable, int x, int y) const
+ void pixel_buffer::paste(drawable_type drawable, const point& p_dst) const
{
if(storage_)
- paste(nana::rectangle(storage_->pixel_size), drawable, x, y);
+ paste(nana::rectangle(storage_->pixel_size), drawable, p_dst);
}
- void pixel_buffer::paste(const nana::rectangle& src_r, drawable_type drawable, int x, int y) const
+ void pixel_buffer::paste(const nana::rectangle& src_r, drawable_type drawable, const point& p_dst) const
{
auto sp = storage_.get();
if(drawable && sp)
@@ -647,7 +647,7 @@ namespace nana{ namespace paint
if(sp->alpha_channel)
{
nana::rectangle s_good_r, d_good_r;
- if(overlap(src_r, sp->pixel_size, nana::rectangle(x, y, src_r.width, src_r.height), paint::detail::drawable_size(drawable), s_good_r, d_good_r))
+ if(overlap(src_r, sp->pixel_size, nana::rectangle(p_dst.x, p_dst.y, src_r.width, src_r.height), paint::detail::drawable_size(drawable), s_good_r, d_good_r))
{
pixel_buffer d_pixbuf;
d_pixbuf.attach(drawable, d_good_r);
@@ -660,16 +660,16 @@ namespace nana{ namespace paint
assign_windows_bitmapinfo(sp->pixel_size, bi);
::SetDIBitsToDevice(drawable->context,
- x, y, src_r.width, src_r.height,
+ p_dst.x, p_dst.y, src_r.width, src_r.height,
src_r.x, static_cast(sp->pixel_size.height) - src_r.y - src_r.height, 0, sp->pixel_size.height,
sp->raw_pixel_buffer, &bi, DIB_RGB_COLORS);
#elif defined(NANA_X11)
- sp->put(drawable->pixmap, drawable->context, src_r.x, src_r.y, x, y, src_r.width, src_r.height);
+ sp->put(drawable->pixmap, drawable->context, src_r.x, src_r.y, p_dst.x, p_dst.y, src_r.width, src_r.height);
#endif
}
}
- void pixel_buffer::paste(native_window_type wd, int x, int y) const
+ void pixel_buffer::paste(native_window_type wd, const point& p_dst) const
{
auto sp = storage_.get();
if(nullptr == wd || nullptr == sp) return;
@@ -681,7 +681,7 @@ namespace nana{ namespace paint
assign_windows_bitmapinfo(sp->pixel_size, bi);
::SetDIBitsToDevice(handle,
- x, y, sp->pixel_size.width, sp->pixel_size.height,
+ p_dst.x, p_dst.y, sp->pixel_size.width, sp->pixel_size.height,
0, 0, 0, sp->pixel_size.height,
sp->raw_pixel_buffer, &bi, DIB_RGB_COLORS);
@@ -690,7 +690,7 @@ namespace nana{ namespace paint
#elif defined(NANA_X11)
auto & spec = nana::detail::platform_spec::instance();
Display * disp = spec.open_display();
- sp->put(reinterpret_cast(wd), XDefaultGC(disp, XDefaultScreen(disp)), 0, 0, x, y, sp->pixel_size.width, sp->pixel_size.height);
+ sp->put(reinterpret_cast(wd), XDefaultGC(disp, XDefaultScreen(disp)), 0, 0, p_dst.x, p_dst.y, sp->pixel_size.width, sp->pixel_size.height);
#endif
}