linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #04050
[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2517: better way of merging icons
------------------------------------------------------------
revno: 2517
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Tue 2011-04-26 19:54:15 +0200
message:
better way of merging icons
modified:
dwt/include/dwt/util/GDI.h
dwt/src/util/GDI.cpp
win32/WinUtil.cpp
--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk
Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dwt/include/dwt/util/GDI.h'
--- dwt/include/dwt/util/GDI.h 2011-04-07 14:57:29 +0000
+++ dwt/include/dwt/util/GDI.h 2011-04-26 17:54:15 +0000
@@ -36,7 +36,7 @@
namespace dwt { namespace util {
-BitmapPtr merge(const std::vector<IconPtr>& icons);
+IconPtr merge(const ImageList& icons);
/// Conversion factor for DPI awareness, see <http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx>.
const float& dpiFactor();
=== modified file 'dwt/src/util/GDI.cpp'
--- dwt/src/util/GDI.cpp 2011-04-08 16:37:08 +0000
+++ dwt/src/util/GDI.cpp 2011-04-26 17:54:15 +0000
@@ -32,31 +32,33 @@
#include <dwt/util/GDI.h>
#include <dwt/CanvasClasses.h>
-#include <dwt/resources/Bitmap.h>
#include <dwt/resources/Icon.h>
+#include <dwt/resources/ImageList.h>
#include <dwt/util/check.h>
namespace dwt { namespace util {
-BitmapPtr merge(const std::vector<IconPtr>& icons) {
- dwtassert(!icons.empty(), _T("No icons to merge"));
- const Point size = icons[0]->getSize();
-
- UpdateCanvas screen_canvas(reinterpret_cast<HWND>(0));
- BitmapPtr ret(new Bitmap(::CreateCompatibleBitmap(screen_canvas.handle(), size.x, size.y)));
-
- CompatibleCanvas canvas(screen_canvas.handle());
- auto select(canvas.select(*ret));
-
- Rectangle rect(size);
- for(auto i = icons.cbegin(), iend = icons.cend(); i != iend; ++i)
- canvas.drawIcon(*i, rect);
-
- return ret;
+IconPtr merge(const ImageList& icons) {
+ const size_t n = icons.size();
+ dwtassert(n > 0, _T("No icons to merge"));
+
+ // only 1 icon, just return it back.
+ if(n == 1)
+ return icons.getIcon(0);
+
+ // merge the 2 first icons.
+ ImageListPtr temp(new ImageList(ImageList_Merge(icons.handle(), 0, icons.handle(), 1, 0, 0)));
+
+ // merge the rest.
+ for(size_t i = 2; i < n; ++i) {
+ temp.reset(new ImageList(ImageList_Merge(temp->handle(), 0, icons.handle(), i, 0, 0)));
+ }
+
+ return temp->getIcon(0);
}
const float& dpiFactor() {
- static float factor = static_cast<float>(UpdateCanvas(reinterpret_cast<HWND>(0)).getDeviceCaps(LOGPIXELSX)) / 96.0;
+ static const float factor = static_cast<float>(UpdateCanvas(reinterpret_cast<HWND>(0)).getDeviceCaps(LOGPIXELSX)) / 96.0;
return factor;
}
=== modified file 'win32/WinUtil.cpp'
--- win32/WinUtil.cpp 2011-04-25 21:52:03 +0000
+++ win32/WinUtil.cpp 2011-04-26 17:54:15 +0000
@@ -151,9 +151,9 @@
// create the incomplete directory icon (DIR_ICON_INCOMPLETE).
{
- vector<dwt::IconPtr> icons;
- icons.push_back(fileImages->getIcon(DIR_ICON));
- icons.push_back(createIcon(IDI_EXEC, 16));
+ dwt::ImageList icons(dwt::Point(16, 16));
+ icons.add(*fileImages->getIcon(DIR_ICON));
+ icons.add(*createIcon(IDI_EXEC, 16));
fileImages->add(*dwt::util::merge(icons));
}
@@ -161,7 +161,8 @@
fileImages->add(*createIcon(IDI_FILE, 16));
{
- userImages = dwt::ImageListPtr(new dwt::ImageList(dwt::Point(16, 16)));
+ const dwt::Point size(16, 16);
+ userImages = dwt::ImageListPtr(new dwt::ImageList(size));
const unsigned baseCount = USER_ICON_MOD_START;
const unsigned modifierCount = USER_ICON_LAST - USER_ICON_MOD_START;
@@ -172,13 +173,13 @@
for(size_t iBase = 0; iBase < baseCount; ++iBase) {
for(size_t i = 0, n = modifierCount * modifierCount; i < n; ++i) {
- vector<dwt::IconPtr> icons;
+ dwt::ImageList icons(size);
- icons.push_back(bases[iBase]);
+ icons.add(*bases[iBase]);
for(size_t iMod = 0; iMod < modifierCount; ++iMod)
if(i & (1 << iMod))
- icons.push_back(modifiers[iMod]);
+ icons.add(*modifiers[iMod]);
userImages->add(*dwt::util::merge(icons));
}