← Back to team overview

linuxdcpp-team team mailing list archive

[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));
 			}