OSDN Git Service

Add TortoiseIDiff to project.
authorFrank Li <lznuaa@gmail.com>
Mon, 15 Jun 2009 07:14:07 +0000 (15:14 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 15 Jun 2009 07:14:07 +0000 (15:14 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
40 files changed:
src/TortoiseGit.sln
src/TortoiseGitSetup/FeaturesFragment.wxi
src/TortoiseGitSetup/StructureFragment.wxi
src/TortoiseIDiff/AboutDlg.cpp [new file with mode: 0644]
src/TortoiseIDiff/AboutDlg.h [new file with mode: 0644]
src/TortoiseIDiff/MainWindow.cpp [new file with mode: 0644]
src/TortoiseIDiff/MainWindow.h [new file with mode: 0644]
src/TortoiseIDiff/NiceTrackbar.cpp [new file with mode: 0644]
src/TortoiseIDiff/NiceTrackbar.h [new file with mode: 0644]
src/TortoiseIDiff/PicWindow.cpp [new file with mode: 0644]
src/TortoiseIDiff/PicWindow.h [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.cpp [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.h [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.ico [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.rc [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.rc2 [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiff.vcproj [new file with mode: 0644]
src/TortoiseIDiff/TortoiseIDiffLang.vcproj [new file with mode: 0644]
src/TortoiseIDiff/alphatoggle.ico [new file with mode: 0644]
src/TortoiseIDiff/blend.ico [new file with mode: 0644]
src/TortoiseIDiff/fitinwindow.ico [new file with mode: 0644]
src/TortoiseIDiff/fittogether.ico [new file with mode: 0644]
src/TortoiseIDiff/imginfo.ico [new file with mode: 0644]
src/TortoiseIDiff/link.ico [new file with mode: 0644]
src/TortoiseIDiff/origsize.ico [new file with mode: 0644]
src/TortoiseIDiff/overlap.ico [new file with mode: 0644]
src/TortoiseIDiff/player_fwd.ico [new file with mode: 0644]
src/TortoiseIDiff/player_rew.ico [new file with mode: 0644]
src/TortoiseIDiff/player_start.ico [new file with mode: 0644]
src/TortoiseIDiff/player_stop.ico [new file with mode: 0644]
src/TortoiseIDiff/resource.h [new file with mode: 0644]
src/TortoiseIDiff/stdafx.cpp [new file with mode: 0644]
src/TortoiseIDiff/stdafx.h [new file with mode: 0644]
src/TortoiseIDiff/vertical.ico [new file with mode: 0644]
src/TortoiseIDiff/zoomin.ico [new file with mode: 0644]
src/TortoiseIDiff/zoomout.ico [new file with mode: 0644]
src/Utils/MiscUI/Picture.h
src/Utils/Utils.vcproj
src/Utils/registry.h
src/Utils/tstring.h [new file with mode: 0644]

index 910edda..0ad5d66 100644 (file)
@@ -103,283 +103,549 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "..\ext\build\
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE} = {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}\r
        EndProjectSection\r
 EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TortoiseIDiff", "TortoiseIDiff\TortoiseIDiff.vcproj", "{6D95829D-AE04-47A7-B66B-DC2F581DDF01}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               debug_static|Mixed Platforms = debug_static|Mixed Platforms\r
+               debug_static|Win32 = debug_static|Win32\r
+               debug_static|x64 = debug_static|x64\r
                Debug|Mixed Platforms = Debug|Mixed Platforms\r
                Debug|Win32 = Debug|Win32\r
                Debug|x64 = Debug|x64\r
+               release_static|Mixed Platforms = release_static|Mixed Platforms\r
+               release_static|Win32 = release_static|Win32\r
+               release_static|x64 = release_static|x64\r
                Release|Mixed Platforms = Release|Mixed Platforms\r
                Release|Win32 = Release|Win32\r
                Release|x64 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.debug_static|x64.Build.0 = Debug|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|Win32.Build.0 = Debug|Win32\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|x64.ActiveCfg = Debug|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Debug|x64.Build.0 = Debug|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.release_static|Win32.ActiveCfg = Release|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.release_static|x64.ActiveCfg = Release|x64\r
+               {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.release_static|x64.Build.0 = Release|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|Win32.ActiveCfg = Release|Win32\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|Win32.Build.0 = Release|Win32\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|x64.ActiveCfg = Release|x64\r
                {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}.Release|x64.Build.0 = Release|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.debug_static|x64.Build.0 = Debug|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|Win32.Build.0 = Debug|Win32\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|x64.ActiveCfg = Debug|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Debug|x64.Build.0 = Debug|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.release_static|Win32.ActiveCfg = Release|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.release_static|x64.ActiveCfg = Release|x64\r
+               {50797F06-39C5-4802-8E2B-7B7A4EF03214}.release_static|x64.Build.0 = Release|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|Win32.ActiveCfg = Release|Win32\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|Win32.Build.0 = Release|Win32\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|x64.ActiveCfg = Release|x64\r
                {50797F06-39C5-4802-8E2B-7B7A4EF03214}.Release|x64.Build.0 = Release|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.debug_static|x64.Build.0 = Debug|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|Win32.Build.0 = Debug|Win32\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|x64.ActiveCfg = Debug|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Debug|x64.Build.0 = Debug|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.release_static|Win32.ActiveCfg = Release|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.release_static|x64.ActiveCfg = Release|x64\r
+               {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.release_static|x64.Build.0 = Release|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|Win32.ActiveCfg = Release|Win32\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|Win32.Build.0 = Release|Win32\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|x64.ActiveCfg = Release|x64\r
                {BC5A5F3B-E41A-4C56-B16F-263D2C6D6475}.Release|x64.Build.0 = Release|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.debug_static|x64.Build.0 = Debug|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|Win32.Build.0 = Debug|Win32\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|x64.ActiveCfg = Debug|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Debug|x64.Build.0 = Debug|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.release_static|Win32.ActiveCfg = Release|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.release_static|x64.ActiveCfg = Release|x64\r
+               {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.release_static|x64.Build.0 = Release|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|Win32.ActiveCfg = Release|Win32\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|Win32.Build.0 = Release|Win32\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|x64.ActiveCfg = Release|x64\r
                {E873DD32-5A31-4DE1-8341-A56A2A5489EA}.Release|x64.Build.0 = Release|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.debug_static|x64.Build.0 = Debug|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|Win32.Build.0 = Debug|Win32\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|x64.ActiveCfg = Debug|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Debug|x64.Build.0 = Debug|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.release_static|Win32.ActiveCfg = Release|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.release_static|x64.ActiveCfg = Release|x64\r
+               {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.release_static|x64.Build.0 = Release|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|Win32.ActiveCfg = Release|Win32\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|Win32.Build.0 = Release|Win32\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|x64.ActiveCfg = Release|x64\r
                {A2C38606-3D96-4A2C-B5C5-22CEAC523B37}.Release|x64.Build.0 = Release|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.debug_static|x64.Build.0 = Debug|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|Win32.Build.0 = Debug|Win32\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|x64.ActiveCfg = Debug|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Debug|x64.Build.0 = Debug|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.release_static|Win32.ActiveCfg = Release|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.release_static|x64.ActiveCfg = Release|x64\r
+               {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.release_static|x64.Build.0 = Release|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|Win32.ActiveCfg = Release|Win32\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|Win32.Build.0 = Release|Win32\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|x64.ActiveCfg = Release|x64\r
                {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB}.Release|x64.Build.0 = Release|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.debug_static|x64.Build.0 = Debug|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|Win32.Build.0 = Debug|Win32\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|x64.ActiveCfg = Debug|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Debug|x64.Build.0 = Debug|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.release_static|Win32.ActiveCfg = Release|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.release_static|x64.ActiveCfg = Release|x64\r
+               {4BE529FB-C2F2-49F7-A897-054B955564CF}.release_static|x64.Build.0 = Release|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|Win32.ActiveCfg = Release|Win32\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|Win32.Build.0 = Release|Win32\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|x64.ActiveCfg = Release|x64\r
                {4BE529FB-C2F2-49F7-A897-054B955564CF}.Release|x64.Build.0 = Release|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.debug_static|x64.Build.0 = Debug|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|Win32.Build.0 = Debug|Win32\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|x64.ActiveCfg = Debug|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Debug|x64.Build.0 = Debug|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.release_static|Win32.ActiveCfg = Release|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.release_static|x64.ActiveCfg = Release|x64\r
+               {A5498556-CE09-4095-8335-08FC8370552D}.release_static|x64.Build.0 = Release|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|Win32.ActiveCfg = Release|Win32\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|Win32.Build.0 = Release|Win32\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|x64.ActiveCfg = Release|x64\r
                {A5498556-CE09-4095-8335-08FC8370552D}.Release|x64.Build.0 = Release|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.debug_static|x64.Build.0 = Debug|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Debug|Win32.ActiveCfg = Debug|x86\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Debug|x64.ActiveCfg = Debug|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Debug|x64.Build.0 = Debug|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.release_static|Win32.ActiveCfg = Release|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.release_static|x64.ActiveCfg = Release|x64\r
+               {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.release_static|x64.Build.0 = Release|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|Win32.ActiveCfg = Release|x86\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|Win32.Build.0 = Release|x86\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|x64.ActiveCfg = Release|x64\r
                {150172A5-8D02-4C00-ABB5-BD99D4B16B4C}.Release|x64.Build.0 = Release|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.debug_static|x64.Build.0 = Debug|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|Win32.Build.0 = Debug|Win32\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|x64.ActiveCfg = Debug|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Debug|x64.Build.0 = Debug|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.release_static|Win32.ActiveCfg = Release|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.release_static|x64.ActiveCfg = Release|x64\r
+               {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.release_static|x64.Build.0 = Release|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|Win32.ActiveCfg = Release|Win32\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|Win32.Build.0 = Release|Win32\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|x64.ActiveCfg = Release|x64\r
                {A00D2EDC-B4F5-4B41-94BA-13961DE5D296}.Release|x64.Build.0 = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.debug_static|x64.Build.0 = Debug|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|Win32.ActiveCfg = Release|Win32\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|Win32.Build.0 = Release|Win32\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|x64.ActiveCfg = Release|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Debug|x64.Build.0 = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.release_static|Win32.ActiveCfg = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.release_static|x64.ActiveCfg = Release|x64\r
+               {13BC1836-2726-45C4-9249-5BA2BBBF8328}.release_static|x64.Build.0 = Release|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|Win32.ActiveCfg = Release|Win32\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|Win32.Build.0 = Release|Win32\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|x64.ActiveCfg = Release|x64\r
                {13BC1836-2726-45C4-9249-5BA2BBBF8328}.Release|x64.Build.0 = Release|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.debug_static|x64.Build.0 = Debug|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|Win32.Build.0 = Debug|Win32\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|x64.ActiveCfg = Debug|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Debug|x64.Build.0 = Debug|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.release_static|Win32.ActiveCfg = Release|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.release_static|x64.ActiveCfg = Release|x64\r
+               {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.release_static|x64.Build.0 = Release|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|Win32.ActiveCfg = Release|Win32\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|Win32.Build.0 = Release|Win32\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|x64.ActiveCfg = Release|x64\r
                {D3AFBFBE-5501-4077-B3B4-3D28BBCA8F20}.Release|x64.Build.0 = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.debug_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.debug_static|Mixed Platforms.Build.0 = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.debug_static|Win32.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.debug_static|x64.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.debug_static|x64.Build.0 = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|Mixed Platforms.ActiveCfg = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|Mixed Platforms.Build.0 = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|Win32.ActiveCfg = Release|Win32\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|Win32.Build.0 = Release|Win32\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|x64.ActiveCfg = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Debug|x64.Build.0 = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.release_static|Win32.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.release_static|x64.ActiveCfg = Release|x64\r
+               {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.release_static|x64.Build.0 = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|Win32.ActiveCfg = Release|Win32\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|Win32.Build.0 = Release|Win32\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|x64.ActiveCfg = Release|x64\r
                {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181}.Release|x64.Build.0 = Release|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.debug_static|x64.Build.0 = Debug|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|Win32.Build.0 = Debug|Win32\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|x64.ActiveCfg = Debug|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Debug|x64.Build.0 = Debug|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.release_static|Win32.ActiveCfg = Release|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.release_static|x64.ActiveCfg = Release|x64\r
+               {62507C2F-9290-4342-910F-BFC44DF99B01}.release_static|x64.Build.0 = Release|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|Win32.ActiveCfg = Release|Win32\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|Win32.Build.0 = Release|Win32\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|x64.ActiveCfg = Release|x64\r
                {62507C2F-9290-4342-910F-BFC44DF99B01}.Release|x64.Build.0 = Release|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.debug_static|x64.Build.0 = Debug|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|Win32.Build.0 = Debug|Win32\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|x64.ActiveCfg = Debug|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Debug|x64.Build.0 = Debug|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.release_static|Win32.ActiveCfg = Release|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.release_static|x64.ActiveCfg = Release|x64\r
+               {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.release_static|x64.Build.0 = Release|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|Win32.ActiveCfg = Release|Win32\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|Win32.Build.0 = Release|Win32\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|x64.ActiveCfg = Release|x64\r
                {2C879469-DB8F-4BF0-B016-AE864D2A7BBC}.Release|x64.Build.0 = Release|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|Mixed Platforms.ActiveCfg = debug_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|Mixed Platforms.Build.0 = debug_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|Win32.ActiveCfg = debug_static|Win32\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|Win32.Build.0 = debug_static|Win32\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|x64.ActiveCfg = debug_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.debug_static|x64.Build.0 = debug_static|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|Win32.Build.0 = Debug|Win32\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|x64.ActiveCfg = Debug|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Debug|x64.Build.0 = Debug|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|Mixed Platforms.ActiveCfg = release_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|Mixed Platforms.Build.0 = release_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|Win32.ActiveCfg = release_static|Win32\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|Win32.Build.0 = release_static|Win32\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|x64.ActiveCfg = release_static|x64\r
+               {72EFB681-1397-4193-BBF9-CA05AC52B75D}.release_static|x64.Build.0 = release_static|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|Win32.ActiveCfg = Release|Win32\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|Win32.Build.0 = Release|Win32\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|x64.ActiveCfg = Release|x64\r
                {72EFB681-1397-4193-BBF9-CA05AC52B75D}.Release|x64.Build.0 = Release|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.debug_static|x64.Build.0 = Debug|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|Win32.Build.0 = Debug|Win32\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|x64.ActiveCfg = Debug|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Debug|x64.Build.0 = Debug|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.release_static|Win32.ActiveCfg = Release|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.release_static|x64.ActiveCfg = Release|x64\r
+               {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.release_static|x64.Build.0 = Release|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Release|Win32.ActiveCfg = Release|Win32\r
                {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99}.Release|x64.ActiveCfg = Release|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.debug_static|x64.Build.0 = Debug|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|Win32.Build.0 = Debug|Win32\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|x64.ActiveCfg = Debug|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Debug|x64.Build.0 = Debug|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.release_static|Win32.ActiveCfg = Release|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.release_static|x64.ActiveCfg = Release|x64\r
+               {EC88E7EC-3074-4841-BA45-B938D098EFF6}.release_static|x64.Build.0 = Release|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Release|Win32.ActiveCfg = Release|Win32\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Release|Win32.Build.0 = Release|Win32\r
                {EC88E7EC-3074-4841-BA45-B938D098EFF6}.Release|x64.ActiveCfg = Release|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.debug_static|x64.Build.0 = Debug|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Debug|Win32.Build.0 = Debug|Win32\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.release_static|Win32.ActiveCfg = Release|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.release_static|x64.ActiveCfg = Release|x64\r
+               {E8C01071-3B47-4A3F-9168-AA58A4635638}.release_static|x64.Build.0 = Release|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|Win32.ActiveCfg = Release|Win32\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|Win32.Build.0 = Release|Win32\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|x64.ActiveCfg = Release|x64\r
                {E8C01071-3B47-4A3F-9168-AA58A4635638}.Release|x64.Build.0 = Release|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|Mixed Platforms.ActiveCfg = debug_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|Mixed Platforms.Build.0 = debug_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|Win32.ActiveCfg = debug_static|Win32\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|Win32.Build.0 = debug_static|Win32\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|x64.ActiveCfg = debug_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.debug_static|x64.Build.0 = debug_static|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Debug|Win32.Build.0 = Debug|Win32\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|Mixed Platforms.ActiveCfg = release_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|Mixed Platforms.Build.0 = release_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|Win32.ActiveCfg = release_static|Win32\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|Win32.Build.0 = release_static|Win32\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|x64.ActiveCfg = release_static|x64\r
+               {8ABB4F84-891A-4748-8507-F5494842173E}.release_static|x64.Build.0 = release_static|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|Win32.ActiveCfg = Release|Win32\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|Win32.Build.0 = Release|Win32\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|x64.ActiveCfg = Release|x64\r
                {8ABB4F84-891A-4748-8507-F5494842173E}.Release|x64.Build.0 = Release|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.debug_static|x64.Build.0 = Debug|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Debug|Win32.Build.0 = Debug|Win32\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.release_static|Win32.ActiveCfg = Release|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.release_static|x64.ActiveCfg = Release|x64\r
+               {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.release_static|x64.Build.0 = Release|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|Win32.ActiveCfg = Release|Win32\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|Win32.Build.0 = Release|Win32\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|x64.ActiveCfg = Release|x64\r
                {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE}.Release|x64.Build.0 = Release|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.debug_static|x64.Build.0 = Debug|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Debug|Win32.Build.0 = Debug|Win32\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.release_static|Win32.ActiveCfg = Release|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.release_static|x64.ActiveCfg = Release|x64\r
+               {4472028D-4ACF-474E-AA95-9B7E12B50F60}.release_static|x64.Build.0 = Release|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|Win32.ActiveCfg = Release|Win32\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|Win32.Build.0 = Release|Win32\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|x64.ActiveCfg = Release|x64\r
                {4472028D-4ACF-474E-AA95-9B7E12B50F60}.Release|x64.Build.0 = Release|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.debug_static|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.debug_static|Mixed Platforms.Build.0 = Debug|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.debug_static|Win32.ActiveCfg = Debug|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.debug_static|x64.ActiveCfg = Debug|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.debug_static|x64.Build.0 = Debug|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Debug|Win32.Build.0 = Debug|Win32\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.release_static|Mixed Platforms.ActiveCfg = Release|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.release_static|Mixed Platforms.Build.0 = Release|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.release_static|Win32.ActiveCfg = Release|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.release_static|x64.ActiveCfg = Release|x64\r
+               {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.release_static|x64.Build.0 = Release|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|Mixed Platforms.Build.0 = Release|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|Win32.ActiveCfg = Release|Win32\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|Win32.Build.0 = Release|Win32\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|x64.ActiveCfg = Release|x64\r
                {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9}.Release|x64.Build.0 = Release|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|Mixed Platforms.ActiveCfg = debug_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|Mixed Platforms.Build.0 = debug_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|Win32.ActiveCfg = debug_static|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|Win32.Build.0 = debug_static|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|x64.ActiveCfg = debug_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.debug_static|x64.Build.0 = debug_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|Mixed Platforms.ActiveCfg = Debug|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|Mixed Platforms.Build.0 = Debug|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Debug|x64.Build.0 = Debug|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|Mixed Platforms.ActiveCfg = release_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|Mixed Platforms.Build.0 = release_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|Win32.ActiveCfg = release_static|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|Win32.Build.0 = release_static|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|x64.ActiveCfg = release_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.release_static|x64.Build.0 = release_static|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|Mixed Platforms.ActiveCfg = Release|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|Mixed Platforms.Build.0 = Release|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|Win32.Build.0 = Release|Win32\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|x64.ActiveCfg = Release|x64\r
+               {6D95829D-AE04-47A7-B66B-DC2F581DDF01}.Release|x64.Build.0 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
index f5bf71f..1087796 100644 (file)
                        <ComponentRef Id="C__TortoiseMergeShortcuts" />\r
                        \r
       <ComponentRef Id="C__TortoiseBlame" />\r
-<!--           \r
+               \r
       <ComponentRef Id="C__TortoiseIDiff" />\r
                        <ComponentRef Id="C__TortoiseIDiffShortcuts" />\r
--->\r
+\r
                        <ComponentRef Id="C__TortoiseUDiff" />\r
 \r
                        <ComponentRef Id="C__PlainSettingsShortcuts" />\r
index 4dd380a..ff78bde 100644 (file)
@@ -340,7 +340,7 @@ out everything for now, leaving these enabled as they are would make the install
               <File Id="F__SciLexer" ShortName="SCILEX.DLL" Name="SciLexer.dll" DiskId="1" Source="..\..\bin\$(var.ReleasePath)\bin\SciLexer.dll" />\r
            </Component>\r
             \r
-<!--\r
+\r
             <Component Id="C__TortoiseIDiff" Guid="$(var.GuidTortoiseIDiff)" Win64="$(var.Win64YesNo)">\r
 \r
               <File Id="F__TortoiseIDiff" ShortName="TIDIFF.EXE" Name="TortoiseIDiff.exe" DiskId="1" Source="..\..\bin\$(var.ReleasePath)\bin\TortoiseIDiff.exe" KeyPath="yes" />\r
@@ -353,7 +353,7 @@ out everything for now, leaving these enabled as they are would make the install
               <Shortcut Id="S__TortoiseIDiff" Directory="D_TortoisePrgMenu" ShortName="TIDIFF" Name="TortoiseIDiff" Advertise="no"\r
               Target="[INSTALLDIR]bin\TortoiseIDiff.exe" Description="View Diff's of image files" Show="normal" />\r
             </Component>\r
--->\r
+\r
             <Component Id="C__TortoiseUDiff" Guid="$(var.GuidTortoiseUDiff)" Win64="$(var.Win64YesNo)">\r
               <File Id="F__TortoiseUDiff" ShortName="TUDIFF.EXE" Name="TortoiseUDiff.exe" DiskId="1" Source="..\..\bin\$(var.ReleasePath)\bin\TortoiseUDiff.exe" KeyPath="yes" />\r
             </Component>\r
diff --git a/src/TortoiseIDiff/AboutDlg.cpp b/src/TortoiseIDiff/AboutDlg.cpp
new file mode 100644 (file)
index 0000000..507faf4
--- /dev/null
@@ -0,0 +1,59 @@
+#include "StdAfx.h"\r
+#include "Resource.h"\r
+#include "AboutDlg.h"\r
+#include "Registry.h"\r
+#include "..\version.h"\r
+#include <string>\r
+#include <Commdlg.h>\r
+\r
+using namespace std;\r
+\r
+CAboutDlg::CAboutDlg(HWND hParent)\r
+{\r
+       m_hParent = hParent;\r
+}\r
+\r
+CAboutDlg::~CAboutDlg(void)\r
+{\r
+}\r
+\r
+LRESULT CAboutDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       UNREFERENCED_PARAMETER(lParam);\r
+       switch (uMsg)\r
+       {\r
+       case WM_INITDIALOG:\r
+               {\r
+                       InitDialog(hwndDlg, IDI_TORTOISEIDIFF);\r
+                       // initialize the controls\r
+                       m_link.ConvertStaticToHyperlink(hwndDlg, IDC_WEBLINK, _T("http://tortoisesvn.net"));\r
+                       TCHAR verbuf[1024] = {0};\r
+                       TCHAR maskbuf[1024] = {0};\r
+                       if (!::LoadString (hResource, IDS_VERSION, maskbuf, 1024))\r
+                       {\r
+                               SecureZeroMemory(maskbuf, sizeof(maskbuf));\r
+                       }\r
+                       _stprintf_s(verbuf, 1024, maskbuf, TSVN_VERMAJOR, TSVN_VERMINOR, TSVN_VERMICRO, TSVN_VERBUILD);\r
+                       SetDlgItemText(hwndDlg, IDC_ABOUTVERSION, verbuf);\r
+               }\r
+               return TRUE;\r
+       case WM_COMMAND:\r
+               return DoCommand(LOWORD(wParam));\r
+       default:\r
+               return FALSE;\r
+       }\r
+}\r
+\r
+LRESULT CAboutDlg::DoCommand(int id)\r
+{\r
+       switch (id)\r
+       {\r
+       case IDOK:\r
+               // fall through\r
+       case IDCANCEL:\r
+               EndDialog(*this, id);\r
+               break;\r
+       }\r
+       return 1;\r
+}\r
+\r
diff --git a/src/TortoiseIDiff/AboutDlg.h b/src/TortoiseIDiff/AboutDlg.h
new file mode 100644 (file)
index 0000000..c0d16b7
--- /dev/null
@@ -0,0 +1,41 @@
+// TortoiseSVN - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2007 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+#pragma once\r
+#include "basedialog.h"\r
+#include "hyperlink_base.h"\r
+\r
+/**\r
+ * \ingroup TortoiseIDiff\r
+ * about dialog.\r
+ */\r
+class CAboutDlg : public CDialog\r
+{\r
+public:\r
+       CAboutDlg(HWND hParent);\r
+       ~CAboutDlg(void);\r
+\r
+       void                                    SetHiddenWnd(HWND hWnd) {m_hHiddenWnd = hWnd;}\r
+protected:\r
+       LRESULT CALLBACK                DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
+       LRESULT                                 DoCommand(int id);\r
+\r
+private:\r
+       HWND                                    m_hParent;\r
+       HWND                                    m_hHiddenWnd;\r
+       CHyperLink                              m_link;\r
+};\r
diff --git a/src/TortoiseIDiff/MainWindow.cpp b/src/TortoiseIDiff/MainWindow.cpp
new file mode 100644 (file)
index 0000000..e722a6a
--- /dev/null
@@ -0,0 +1,983 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006 - 2009 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "StdAfx.h"\r
+#include "commctrl.h"\r
+#include "Commdlg.h"\r
+#include "TortoiseIDiff.h"\r
+#include "MainWindow.h"\r
+#include "AboutDlg.h"\r
+\r
+#pragma comment(lib, "comctl32.lib")\r
+\r
+tstring        CMainWindow::leftpicpath;\r
+tstring        CMainWindow::leftpictitle;\r
+\r
+tstring        CMainWindow::rightpicpath;\r
+tstring        CMainWindow::rightpictitle;\r
+\r
+bool CMainWindow::RegisterAndCreateWindow()\r
+{\r
+       WNDCLASSEX wcx; \r
+\r
+       // Fill in the window class structure with default parameters \r
+       wcx.cbSize = sizeof(WNDCLASSEX);\r
+       wcx.style = CS_HREDRAW | CS_VREDRAW;\r
+       wcx.lpfnWndProc = CWindow::stWinMsgHandler;\r
+       wcx.cbClsExtra = 0;\r
+       wcx.cbWndExtra = 0;\r
+       wcx.hInstance = hResource;\r
+       wcx.hCursor = LoadCursor(NULL, IDC_SIZEWE);\r
+       wcx.lpszClassName = ResString(hResource, IDS_APP_TITLE);\r
+       wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_TORTOISEIDIFF));\r
+       wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);\r
+       wcx.lpszMenuName = MAKEINTRESOURCE(IDC_TORTOISEIDIFF);\r
+       wcx.hIconSm     = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_TORTOISEIDIFF));\r
+       if (RegisterWindow(&wcx))\r
+       {\r
+               if (Create(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE, NULL))\r
+               {\r
+                       ShowWindow(m_hwnd, SW_SHOW);\r
+                       UpdateWindow(m_hwnd);\r
+                       return true;\r
+               }\r
+       }\r
+       return false;\r
+}\r
+\r
+void CMainWindow::PositionChildren(RECT * clientrect /* = NULL */)\r
+{\r
+       RECT tbRect;\r
+       if (clientrect == NULL)\r
+               return;\r
+       SendMessage(hwndTB, TB_AUTOSIZE, 0, 0);\r
+       GetWindowRect(hwndTB, &tbRect);\r
+       LONG tbHeight = tbRect.bottom-tbRect.top-1;\r
+       HDWP hdwp = BeginDeferWindowPos(2);\r
+       if (bOverlap)\r
+       {\r
+               SetWindowPos(picWindow1, NULL, clientrect->left, clientrect->top+tbHeight, clientrect->right-clientrect->left, clientrect->bottom-clientrect->top-tbHeight, SWP_SHOWWINDOW);\r
+       }\r
+       else\r
+       {\r
+               if (bVertical)\r
+               {\r
+                       RECT child;\r
+                       child.left = clientrect->left;\r
+                       child.top = clientrect->top+tbHeight;\r
+                       child.right = clientrect->right;\r
+                       child.bottom = nSplitterPos-(SPLITTER_BORDER/2);\r
+                       if (hdwp) hdwp = DeferWindowPos(hdwp, picWindow1, NULL, child.left, child.top, child.right-child.left, child.bottom-child.top, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+                       child.top = nSplitterPos+(SPLITTER_BORDER/2);\r
+                       child.bottom = clientrect->bottom;\r
+                       if (hdwp) hdwp = DeferWindowPos(hdwp, picWindow2, NULL, child.left, child.top, child.right-child.left, child.bottom-child.top, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+               }\r
+               else\r
+               {\r
+                       RECT child;\r
+                       child.left = clientrect->left;\r
+                       child.top = clientrect->top+tbHeight;\r
+                       child.right = nSplitterPos-(SPLITTER_BORDER/2);\r
+                       child.bottom = clientrect->bottom;\r
+                       if (hdwp) hdwp = DeferWindowPos(hdwp, picWindow1, NULL, child.left, child.top, child.right-child.left, child.bottom-child.top, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+                       child.left = nSplitterPos+(SPLITTER_BORDER/2);\r
+                       child.right = clientrect->right;\r
+                       if (hdwp) hdwp = DeferWindowPos(hdwp, picWindow2, NULL, child.left, child.top, child.right-child.left, child.bottom-child.top, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+               }\r
+       }\r
+       if (hdwp) EndDeferWindowPos(hdwp);\r
+       picWindow1.SetTransparentColor(transparentColor);\r
+       picWindow2.SetTransparentColor(transparentColor);\r
+       InvalidateRect(*this, NULL, FALSE);\r
+}\r
+\r
+LRESULT CALLBACK CMainWindow::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (uMsg)\r
+       {\r
+       case WM_CREATE:\r
+               {\r
+                       m_hwnd = hwnd;\r
+                       picWindow1.RegisterAndCreateWindow(hwnd);\r
+                       picWindow1.SetPic(leftpicpath, leftpictitle, true);\r
+                       picWindow2.RegisterAndCreateWindow(hwnd);\r
+                       picWindow2.SetPic(rightpicpath, rightpictitle, false);\r
+\r
+                       picWindow1.SetOtherPicWindow(&picWindow2);\r
+                       picWindow2.SetOtherPicWindow(&picWindow1);\r
+                       // center the splitter\r
+                       RECT rect;\r
+                       GetClientRect(hwnd, &rect);\r
+                       nSplitterPos = (rect.right-rect.left-SPLITTER_BORDER)/2;\r
+                       CreateToolbar();\r
+                       PositionChildren(&rect);\r
+                       picWindow1.FitImageInWindow();\r
+                       picWindow2.FitImageInWindow();\r
+               }\r
+               break;\r
+       case WM_COMMAND:\r
+               {\r
+                       return DoCommand(LOWORD(wParam));\r
+               }\r
+               break;\r
+       case WM_PAINT:\r
+               {\r
+                       PAINTSTRUCT ps;\r
+                       HDC hdc;\r
+                       RECT rect;\r
+\r
+                       ::GetClientRect(*this, &rect);\r
+                       hdc = BeginPaint(hwnd, &ps);\r
+                       SetBkColor(hdc, GetSysColor(COLOR_3DFACE));\r
+                       ::ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);\r
+                       EndPaint(hwnd, &ps);\r
+               }\r
+               break;\r
+    case WM_GETMINMAXINFO:\r
+               {\r
+                       MINMAXINFO * mmi = (MINMAXINFO*)lParam;\r
+                       mmi->ptMinTrackSize.x = WINDOW_MINWIDTH;\r
+                       mmi->ptMinTrackSize.y = WINDOW_MINHEIGHT;\r
+                       return 0;\r
+               }\r
+               break;\r
+       case WM_SIZE:\r
+               {\r
+                       RECT rect;\r
+                       GetClientRect(hwnd, &rect);\r
+                       if (bVertical)\r
+                       {\r
+                               RECT tbRect;\r
+                               GetWindowRect(hwndTB, &tbRect);\r
+                               LONG tbHeight = tbRect.bottom-tbRect.top-1;\r
+                               nSplitterPos = (rect.bottom-rect.top-SPLITTER_BORDER+tbHeight)/2;\r
+                       }\r
+                       else\r
+                               nSplitterPos = (rect.right-rect.left-SPLITTER_BORDER)/2;\r
+                       PositionChildren(&rect);\r
+               }\r
+               break;\r
+       case WM_SETCURSOR:\r
+               {\r
+                       if ((HWND)wParam == *this)\r
+                       {\r
+                               RECT rect;\r
+                               POINT pt;\r
+                               GetClientRect(*this, &rect);\r
+                               GetCursorPos(&pt);\r
+                               ScreenToClient(*this, &pt);\r
+                               if (PtInRect(&rect, pt))\r
+                               {\r
+                                       if (bVertical)\r
+                                       {\r
+                                               HCURSOR hCur = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS));\r
+                                               SetCursor(hCur);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               HCURSOR hCur = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE));\r
+                                               SetCursor(hCur);\r
+                                       }\r
+                                       return TRUE;\r
+                               }\r
+                       }\r
+                       return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+               }\r
+               break;\r
+       case WM_LBUTTONDOWN:\r
+               Splitter_OnLButtonDown(hwnd, uMsg, wParam, lParam);\r
+               break;\r
+       case WM_LBUTTONUP:\r
+               Splitter_OnLButtonUp(hwnd, uMsg, wParam, lParam);\r
+               break;\r
+       case WM_MOUSEMOVE:\r
+               Splitter_OnMouseMove(hwnd, uMsg, wParam, lParam);\r
+               break;\r
+       case WM_MOUSEWHEEL:\r
+               {\r
+                       // find out if the mouse cursor is over one of the views, and if\r
+                       // it is, pass the mouse wheel message to that view\r
+                       POINT pt;\r
+                       DWORD ptW = GetMessagePos();\r
+                       pt.x = GET_X_LPARAM(ptW);\r
+                       pt.y = GET_Y_LPARAM(ptW);\r
+                       RECT rect;\r
+                       GetWindowRect(picWindow1, &rect);\r
+                       if (PtInRect(&rect, pt))\r
+                       {\r
+                               picWindow1.OnMouseWheel(GET_KEYSTATE_WPARAM(wParam), GET_WHEEL_DELTA_WPARAM(wParam));\r
+                       }\r
+                       else\r
+                       {\r
+                               GetWindowRect(picWindow2, &rect);\r
+                               if (PtInRect(&rect, pt))\r
+                               {\r
+                                       picWindow2.OnMouseWheel(GET_KEYSTATE_WPARAM(wParam), GET_WHEEL_DELTA_WPARAM(wParam));\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       case WM_MOUSEHWHEEL:\r
+               {\r
+                       // find out if the mouse cursor is over one of the views, and if\r
+                       // it is, pass the mouse wheel message to that view\r
+                       POINT pt;\r
+                       DWORD ptW = GetMessagePos();\r
+                       pt.x = GET_X_LPARAM(ptW);\r
+                       pt.y = GET_Y_LPARAM(ptW);\r
+                       RECT rect;\r
+                       GetWindowRect(picWindow1, &rect);\r
+                       if (PtInRect(&rect, pt))\r
+                       {\r
+                               picWindow1.OnMouseWheel(GET_KEYSTATE_WPARAM(wParam)|MK_SHIFT, GET_WHEEL_DELTA_WPARAM(wParam));\r
+                       }\r
+                       else\r
+                       {\r
+                               GetWindowRect(picWindow2, &rect);\r
+                               if (PtInRect(&rect, pt))\r
+                               {\r
+                                       picWindow2.OnMouseWheel(GET_KEYSTATE_WPARAM(wParam)|MK_SHIFT, GET_WHEEL_DELTA_WPARAM(wParam));\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       case WM_NOTIFY:\r
+               {\r
+                       LPNMHDR pNMHDR = (LPNMHDR)lParam;\r
+                       if (pNMHDR->code == TTN_GETDISPINFO)\r
+                       {\r
+                               LPTOOLTIPTEXT lpttt; \r
+\r
+                               lpttt = (LPTOOLTIPTEXT) lParam; \r
+                               lpttt->hinst = hResource; \r
+\r
+                               // Specify the resource identifier of the descriptive \r
+                               // text for the given button. \r
+                               TCHAR stringbuf[MAX_PATH] = {0};\r
+                               MENUITEMINFO mii;\r
+                               mii.cbSize = sizeof(MENUITEMINFO);\r
+                               mii.fMask = MIIM_TYPE;\r
+                               mii.dwTypeData = stringbuf;\r
+                               mii.cch = sizeof(stringbuf)/sizeof(TCHAR);\r
+                               GetMenuItemInfo(GetMenu(*this), (UINT)lpttt->hdr.idFrom, FALSE, &mii);\r
+                               lpttt->lpszText = stringbuf;\r
+                       }\r
+               }\r
+               break;\r
+       case WM_DESTROY:\r
+               bWindowClosed = TRUE;\r
+               PostQuitMessage(0);\r
+               break;\r
+       case WM_CLOSE:\r
+               ImageList_Destroy(hToolbarImgList);\r
+               ::DestroyWindow(m_hwnd);\r
+               break;\r
+       default:\r
+               return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+       }\r
+\r
+       return 0;\r
+};\r
+\r
+LRESULT CMainWindow::DoCommand(int id)\r
+{\r
+       switch (id) \r
+       {\r
+       case ID_FILE_OPEN:\r
+               {\r
+                       if (OpenDialog())\r
+                       {\r
+                               picWindow1.SetPic(leftpicpath, _T(""), true);\r
+                               picWindow2.SetPic(rightpicpath, _T(""), false);\r
+                               if (bOverlap)\r
+                               {\r
+                                       picWindow1.SetSecondPic(picWindow2.GetPic(), rightpictitle, rightpicpath);\r
+                               }\r
+                               else\r
+                               {\r
+                                       picWindow1.SetSecondPic();\r
+                               }\r
+                               RECT rect;\r
+                               GetClientRect(*this, &rect);\r
+                               PositionChildren(&rect);\r
+                               picWindow1.FitImageInWindow();\r
+                               picWindow2.FitImageInWindow();\r
+                       }\r
+               }\r
+               break;\r
+       case ID_VIEW_IMAGEINFO:\r
+               {\r
+                       bShowInfo = !bShowInfo;\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= bShowInfo ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_IMAGEINFO, uCheck);\r
+\r
+                       picWindow1.ShowInfo(bShowInfo);\r
+                       picWindow2.ShowInfo(bShowInfo);\r
+\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = bShowInfo ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_IMAGEINFO, (LPARAM)&tbi);\r
+               }\r
+               break;\r
+       case ID_VIEW_OVERLAPIMAGES:\r
+               {\r
+                       bOverlap = !bOverlap;\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= bOverlap ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_OVERLAPIMAGES, uCheck);\r
+                       uCheck |= (m_BlendType == CPicWindow::BLEND_ALPHA) ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_BLENDALPHA, uCheck);\r
+\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = bOverlap ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_OVERLAPIMAGES, (LPARAM)&tbi);\r
+\r
+                       tbi.fsState = (m_BlendType == CPicWindow::BLEND_ALPHA) ? TBSTATE_CHECKED : 0;\r
+                       if (bOverlap)\r
+                               tbi.fsState |= TBSTATE_ENABLED;\r
+                       else\r
+                               tbi.fsState = 0;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_BLENDALPHA, (LPARAM)&tbi);\r
+\r
+                       if (bOverlap)\r
+                               tbi.fsState = 0;\r
+                       else\r
+                               tbi.fsState = bVertical ? TBSTATE_ENABLED | TBSTATE_CHECKED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_ARRANGEVERTICAL, (LPARAM)&tbi);\r
+\r
+                       ShowWindow(picWindow2, bOverlap ? SW_HIDE : SW_SHOW);\r
+\r
+                       if (bOverlap)\r
+                       {\r
+                               picWindow1.StopTimer();\r
+                               picWindow2.StopTimer();\r
+                               picWindow1.SetSecondPic(picWindow2.GetPic(), rightpictitle, rightpicpath, \r
+                                       picWindow2.GetHPos(), picWindow2.GetVPos());\r
+                               picWindow1.SetBlendAlpha(m_BlendType, 0.5f);\r
+                       }\r
+                       else\r
+                       {\r
+                               picWindow1.SetSecondPic();\r
+                       }\r
+\r
+\r
+                       RECT rect;\r
+                       GetClientRect(*this, &rect);\r
+                       PositionChildren(&rect);\r
+\r
+                       if ((bFitSizes)&&(bOverlap))\r
+                       {\r
+                               picWindow1.FitSizes(bFitSizes);\r
+                       }\r
+            return 0;\r
+               }\r
+               break;\r
+       case ID_VIEW_BLENDALPHA:\r
+               {\r
+                       if (m_BlendType == CPicWindow::BLEND_ALPHA)\r
+                               m_BlendType = CPicWindow::BLEND_XOR;\r
+                       else\r
+                               m_BlendType = CPicWindow::BLEND_ALPHA;\r
+\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= (m_BlendType == CPicWindow::BLEND_ALPHA) ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_BLENDALPHA, uCheck);\r
+\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = (m_BlendType == CPicWindow::BLEND_ALPHA) ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_BLENDALPHA, (LPARAM)&tbi);\r
+                       picWindow1.SetBlendAlpha(m_BlendType, picWindow1.GetBlendAlpha());\r
+                       PositionChildren();\r
+               }\r
+               break;\r
+       case ID_VIEW_TRANSPARENTCOLOR:\r
+               {\r
+                       static COLORREF customColors[16] = {0};\r
+                       CHOOSECOLOR ccDlg;\r
+                       memset(&ccDlg, 0, sizeof(ccDlg));\r
+                       ccDlg.lStructSize = sizeof(ccDlg);\r
+                       ccDlg.hwndOwner = m_hwnd;\r
+                       ccDlg.rgbResult = transparentColor;\r
+                       ccDlg.lpCustColors = customColors;\r
+                       ccDlg.Flags = CC_RGBINIT | CC_FULLOPEN;\r
+                       if(ChooseColor(&ccDlg))\r
+                       {\r
+                               transparentColor = ccDlg.rgbResult;\r
+                               picWindow1.SetTransparentColor(transparentColor);\r
+                               picWindow2.SetTransparentColor(transparentColor);\r
+                               // The color picker takes the focus and we don't get it back.\r
+                               ::SetFocus(picWindow1);\r
+                       }\r
+               }\r
+               break;\r
+       case ID_VIEW_FITTOGETHER:\r
+               {\r
+                       bFitSizes = !bFitSizes;\r
+                       picWindow1.FitSizes(bFitSizes);\r
+                       picWindow2.FitSizes(bFitSizes);\r
+\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= bFitSizes ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_FITTOGETHER, uCheck);\r
+\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = bFitSizes ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_FITTOGETHER, (LPARAM)&tbi);\r
+               }\r
+               break;\r
+       case ID_VIEW_LINKIMAGESTOGETHER:\r
+               {\r
+                       bLinkedPositions = !bLinkedPositions;\r
+                       picWindow1.LinkPositions(bLinkedPositions);\r
+                       picWindow2.LinkPositions(bLinkedPositions);\r
+\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= bLinkedPositions ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_LINKIMAGESTOGETHER, uCheck);\r
+\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = bLinkedPositions ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_LINKIMAGESTOGETHER, (LPARAM)&tbi);\r
+               }\r
+               break;\r
+       case ID_VIEW_ALPHA0:\r
+               picWindow1.SetBlendAlpha(m_BlendType, 0.0f);\r
+               break;\r
+       case ID_VIEW_ALPHA255:\r
+               picWindow1.SetBlendAlpha(m_BlendType, 1.0f);\r
+               break;\r
+       case ID_VIEW_ALPHA127:\r
+               picWindow1.SetBlendAlpha(m_BlendType, 0.5f);\r
+               break;\r
+       case ID_VIEW_ALPHATOGGLE:\r
+               picWindow1.ToggleAlpha();\r
+               break;\r
+       case ID_VIEW_FITIMAGESINWINDOW:\r
+               {\r
+                       picWindow1.FitImageInWindow();\r
+                       picWindow2.FitImageInWindow();\r
+               }\r
+               break;\r
+       case ID_VIEW_ORININALSIZE:\r
+               {\r
+                       picWindow1.SetZoom(1.0, false);\r
+                       picWindow2.SetZoom(1.0, false);\r
+               }\r
+               break;\r
+       case ID_VIEW_ZOOMIN:\r
+               {\r
+                       picWindow1.Zoom(true, false);\r
+                       if (!bFitSizes)\r
+                               picWindow2.Zoom(true, false);\r
+               }\r
+               break;\r
+       case ID_VIEW_ZOOMOUT:\r
+               {\r
+                       picWindow1.Zoom(false, false);\r
+                       if (!bFitSizes)\r
+                               picWindow2.Zoom(false, false);\r
+               }\r
+               break;\r
+       case ID_VIEW_ARRANGEVERTICAL:\r
+               {\r
+                       bVertical = !bVertical;\r
+                       RECT rect;\r
+                       GetClientRect(*this, &rect);\r
+                       if (bVertical)\r
+                       {\r
+                               RECT tbRect;\r
+                               GetWindowRect(hwndTB, &tbRect);\r
+                               LONG tbHeight = tbRect.bottom-tbRect.top-1;\r
+                               nSplitterPos = (rect.bottom-rect.top-SPLITTER_BORDER+tbHeight)/2;\r
+                       }\r
+                       else\r
+                       {\r
+                               nSplitterPos = (rect.right-rect.left-SPLITTER_BORDER)/2;\r
+                       }\r
+                       HMENU hMenu = GetMenu(*this);\r
+                       UINT uCheck = MF_BYCOMMAND;\r
+                       uCheck |= bVertical ? MF_CHECKED : MF_UNCHECKED;\r
+                       CheckMenuItem(hMenu, ID_VIEW_ARRANGEVERTICAL, uCheck);\r
+                       // change the state of the toolbar button\r
+                       TBBUTTONINFO tbi;\r
+                       tbi.cbSize = sizeof(TBBUTTONINFO);\r
+                       tbi.dwMask = TBIF_STATE;\r
+                       tbi.fsState = bVertical ? TBSTATE_CHECKED | TBSTATE_ENABLED : TBSTATE_ENABLED;\r
+                       SendMessage(hwndTB, TB_SETBUTTONINFO, ID_VIEW_ARRANGEVERTICAL, (LPARAM)&tbi);\r
+\r
+                       PositionChildren(&rect);\r
+               }\r
+               break;\r
+       case ID_ABOUT:\r
+               {\r
+                       CAboutDlg dlg(*this);\r
+                       dlg.DoModal(hInst, IDD_ABOUT, *this);\r
+               }\r
+               break;\r
+       case IDM_EXIT:\r
+               ::PostQuitMessage(0);\r
+               return 0;\r
+               break;\r
+       default:\r
+               break;\r
+       };\r
+       return 1;\r
+}\r
+\r
+// splitter stuff\r
+void CMainWindow::DrawXorBar(HDC hdc, int x1, int y1, int width, int height)\r
+{\r
+       static WORD _dotPatternBmp[8] = \r
+       { \r
+               0x0055, 0x00aa, 0x0055, 0x00aa, \r
+               0x0055, 0x00aa, 0x0055, 0x00aa\r
+       };\r
+\r
+       HBITMAP hbm;\r
+       HBRUSH  hbr, hbrushOld;\r
+\r
+       hbm = CreateBitmap(8, 8, 1, 1, _dotPatternBmp);\r
+       hbr = CreatePatternBrush(hbm);\r
+\r
+       SetBrushOrgEx(hdc, x1, y1, 0);\r
+       hbrushOld = (HBRUSH)SelectObject(hdc, hbr);\r
+\r
+       PatBlt(hdc, x1, y1, width, height, PATINVERT);\r
+\r
+       SelectObject(hdc, hbrushOld);\r
+\r
+       DeleteObject(hbr);\r
+       DeleteObject(hbm);\r
+}\r
+\r
+LRESULT CMainWindow::Splitter_OnLButtonDown(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       POINT pt;\r
+       HDC hdc;\r
+       RECT rect;\r
+       RECT clientrect;\r
+\r
+       pt.x = (short)LOWORD(lParam);  // horizontal position of cursor \r
+       pt.y = (short)HIWORD(lParam);\r
+\r
+       GetClientRect(hwnd, &clientrect);\r
+       GetWindowRect(hwnd, &rect);\r
+       POINT zero = {0,0};\r
+       ClientToScreen(hwnd, &zero);\r
+       OffsetRect(&clientrect, zero.x-rect.left, zero.y-rect.top);\r
+\r
+       //convert the mouse coordinates relative to the top-left of\r
+       //the window\r
+       ClientToScreen(hwnd, &pt);\r
+       pt.x -= rect.left;\r
+       pt.y -= rect.top;\r
+\r
+       //same for the window coordinates - make them relative to 0,0\r
+       OffsetRect(&rect, -rect.left, -rect.top);\r
+\r
+       if (pt.x < 0)\r
+               pt.x = 0;\r
+       if (pt.x > rect.right-4) \r
+               pt.x = rect.right-4;\r
+       if (pt.y < 0)\r
+               pt.y = 0;\r
+       if (pt.y > rect.bottom-4)\r
+               pt.y = rect.bottom-4;\r
+\r
+       bDragMode = true;\r
+\r
+       SetCapture(hwnd);\r
+\r
+       hdc = GetWindowDC(hwnd);\r
+       if (bVertical)\r
+               DrawXorBar(hdc, clientrect.left, pt.y+2, clientrect.right-clientrect.left-2, 4);\r
+       else\r
+               DrawXorBar(hdc, pt.x+2, clientrect.top, 4, clientrect.bottom-clientrect.top-2);\r
+       ReleaseDC(hwnd, hdc);\r
+\r
+       oldx = pt.x;\r
+       oldy = pt.y;\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+LRESULT CMainWindow::Splitter_OnLButtonUp(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       HDC hdc;\r
+       RECT rect;\r
+       RECT clientrect;\r
+\r
+       POINT pt;\r
+       pt.x = (short)LOWORD(lParam);  // horizontal position of cursor \r
+       pt.y = (short)HIWORD(lParam);\r
+\r
+       if (bDragMode == FALSE)\r
+               return 0;\r
+\r
+       GetClientRect(hwnd, &clientrect);\r
+       GetWindowRect(hwnd, &rect);\r
+       POINT zero = {0,0};\r
+       ClientToScreen(hwnd, &zero);\r
+       OffsetRect(&clientrect, zero.x-rect.left, zero.y-rect.top);\r
+\r
+       ClientToScreen(hwnd, &pt);\r
+       pt.x -= rect.left;\r
+       pt.y -= rect.top;\r
+\r
+       OffsetRect(&rect, -rect.left, -rect.top);\r
+\r
+       if (pt.x < 0)\r
+               pt.x = 0;\r
+       if (pt.x > rect.right-4) \r
+               pt.x = rect.right-4;\r
+       if (pt.y < 0)\r
+               pt.y = 0;\r
+       if (pt.y > rect.bottom-4)\r
+               pt.y = rect.bottom-4;\r
+\r
+       hdc = GetWindowDC(hwnd);\r
+       if (bVertical)\r
+               DrawXorBar(hdc, clientrect.left, oldy+2, clientrect.right-clientrect.left-2, 4);                        \r
+       else\r
+               DrawXorBar(hdc, oldx+2, clientrect.top, 4, clientrect.bottom-clientrect.top-2);                 \r
+       ReleaseDC(hwnd, hdc);\r
+\r
+       oldx = pt.x;\r
+       oldy = pt.y;\r
+\r
+       bDragMode = false;\r
+\r
+       //convert the splitter position back to screen coords.\r
+       GetWindowRect(hwnd, &rect);\r
+       pt.x += rect.left;\r
+       pt.y += rect.top;\r
+\r
+       //now convert into CLIENT coordinates\r
+       ScreenToClient(hwnd, &pt);\r
+       GetClientRect(hwnd, &rect);\r
+       if (bVertical)\r
+               nSplitterPos = pt.y;\r
+       else\r
+               nSplitterPos = pt.x;\r
+\r
+       ReleaseCapture();\r
+\r
+       //position the child controls\r
+       PositionChildren(&rect);\r
+       return 0;\r
+}\r
+\r
+LRESULT CMainWindow::Splitter_OnMouseMove(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       HDC hdc;\r
+       RECT rect;\r
+       RECT clientrect;\r
+\r
+       POINT pt;\r
+\r
+       if (bDragMode == FALSE)\r
+               return 0;\r
+\r
+       pt.x = (short)LOWORD(lParam);  // horizontal position of cursor \r
+       pt.y = (short)HIWORD(lParam);\r
+\r
+       GetClientRect(hwnd, &clientrect);\r
+       GetWindowRect(hwnd, &rect);\r
+       POINT zero = {0,0};\r
+       ClientToScreen(hwnd, &zero);\r
+       OffsetRect(&clientrect, zero.x-rect.left, zero.y-rect.top);\r
+\r
+       //convert the mouse coordinates relative to the top-left of\r
+       //the window\r
+       ClientToScreen(hwnd, &pt);\r
+       pt.x -= rect.left;\r
+       pt.y -= rect.top;\r
+\r
+       //same for the window coordinates - make them relative to 0,0\r
+       OffsetRect(&rect, -rect.left, -rect.top);\r
+\r
+       if (pt.x < 0)\r
+               pt.x = 0;\r
+       if (pt.x > rect.right-4) \r
+               pt.x = rect.right-4;\r
+       if (pt.y < 0)\r
+               pt.y = 0;\r
+       if (pt.y > rect.bottom-4)\r
+               pt.y = rect.bottom-4;\r
+\r
+       if ((wParam & MK_LBUTTON) && ((bVertical && (pt.y != oldy)) || (!bVertical && (pt.x != oldx))))\r
+       {\r
+               hdc = GetWindowDC(hwnd);\r
+\r
+               if (bVertical)\r
+               {\r
+                       DrawXorBar(hdc, clientrect.left, oldy+2, clientrect.right-clientrect.left-2, 4);\r
+                       DrawXorBar(hdc, clientrect.left, pt.y+2, clientrect.right-clientrect.left-2, 4);\r
+               }\r
+               else\r
+               {\r
+                       DrawXorBar(hdc, oldx+2, clientrect.top, 4, clientrect.bottom-clientrect.top-2);\r
+                       DrawXorBar(hdc, pt.x+2, clientrect.top, 4, clientrect.bottom-clientrect.top-2);\r
+               }\r
+\r
+               ReleaseDC(hwnd, hdc);\r
+\r
+               oldx = pt.x;\r
+               oldy = pt.y;\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+bool CMainWindow::OpenDialog()\r
+{\r
+       return (DialogBox(hResource, MAKEINTRESOURCE(IDD_OPEN), *this, (DLGPROC)OpenDlgProc)==IDOK);\r
+}\r
+\r
+BOOL CALLBACK CMainWindow::OpenDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (message) \r
+       {\r
+       case WM_INITDIALOG:\r
+               {\r
+                       // center on the parent window\r
+                       HWND hParentWnd = ::GetParent(hwndDlg);\r
+                       RECT parentrect, childrect, centeredrect;\r
+                       GetWindowRect(hParentWnd, &parentrect);\r
+                       GetWindowRect(hwndDlg, &childrect);\r
+                       centeredrect.left = parentrect.left + ((parentrect.right-parentrect.left-childrect.right+childrect.left)/2);\r
+                       centeredrect.right = centeredrect.left + (childrect.right-childrect.left);\r
+                       centeredrect.top = parentrect.top + ((parentrect.bottom-parentrect.top-childrect.bottom+childrect.top)/2);\r
+                       centeredrect.bottom = centeredrect.top + (childrect.bottom-childrect.top);\r
+                       SetWindowPos(hwndDlg, NULL, centeredrect.left, centeredrect.top, centeredrect.right-centeredrect.left, centeredrect.bottom-centeredrect.top, SWP_SHOWWINDOW);\r
+                       SetFocus(hwndDlg);\r
+               }\r
+               break;\r
+       case WM_COMMAND: \r
+               switch (LOWORD(wParam)) \r
+               {\r
+               case IDC_LEFTBROWSE:\r
+                       {\r
+                               TCHAR path[MAX_PATH] = {0};\r
+                               if (AskForFile(hwndDlg, path))\r
+                               {\r
+                                       SetDlgItemText(hwndDlg, IDC_LEFTIMAGE, path);\r
+                               }\r
+                       }\r
+                       break;\r
+               case IDC_RIGHTBROWSE:\r
+                       {\r
+                               TCHAR path[MAX_PATH] = {0};\r
+                               if (AskForFile(hwndDlg, path))\r
+                               {\r
+                                       SetDlgItemText(hwndDlg, IDC_RIGHTIMAGE, path);\r
+                               }\r
+                       }\r
+                       break;\r
+               case IDOK: \r
+                       {\r
+                               TCHAR path[MAX_PATH];\r
+                               if (!GetDlgItemText(hwndDlg, IDC_LEFTIMAGE, path, MAX_PATH)) \r
+                                       *path = 0;\r
+                               leftpicpath = path;\r
+                               if (!GetDlgItemText(hwndDlg, IDC_RIGHTIMAGE, path, MAX_PATH))\r
+                                       *path = 0;\r
+                               rightpicpath = path;\r
+                       }\r
+                       // Fall through. \r
+               case IDCANCEL: \r
+                       EndDialog(hwndDlg, wParam); \r
+                       return TRUE; \r
+               } \r
+       } \r
+       return FALSE; \r
+}\r
+\r
+bool CMainWindow::AskForFile(HWND owner, TCHAR * path)\r
+{\r
+       OPENFILENAME ofn = {0};                 // common dialog box structure\r
+       // Initialize OPENFILENAME\r
+       ofn.lStructSize = sizeof(OPENFILENAME);\r
+       ofn.hwndOwner = owner;\r
+       ofn.lpstrFile = path;\r
+       ofn.nMaxFile = MAX_PATH;\r
+       ofn.lpstrTitle = ResString(::hResource, IDS_OPENIMAGEFILE);\r
+       ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_EXPLORER;\r
+       ofn.hInstance = ::hResource;\r
+       TCHAR filters[] = _T("Images\0*.wmf;*.jpg;*jpeg;*.bmp;*.gif;*.png;*.ico;*.dib;*.emf\0All (*.*)\0*.*\0\0");\r
+       ofn.lpstrFilter = filters;\r
+       ofn.nFilterIndex = 1;\r
+       // Display the Open dialog box. \r
+       if (GetOpenFileName(&ofn)==FALSE)\r
+       {\r
+               return false;\r
+       }\r
+       return true;\r
+}\r
+\r
+bool CMainWindow::CreateToolbar()\r
+{\r
+       // Ensure that the common control DLL is loaded. \r
+       INITCOMMONCONTROLSEX icex;\r
+       icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\r
+       icex.dwICC  = ICC_BAR_CLASSES | ICC_WIN95_CLASSES;\r
+       InitCommonControlsEx(&icex);\r
+\r
+       hwndTB = CreateWindowEx(0, \r
+                                                       TOOLBARCLASSNAME, \r
+                                                       (LPCTSTR)NULL,\r
+                                                       WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS, \r
+                                                       0, 0, 0, 0, \r
+                                                       *this,\r
+                                                       (HMENU)IDC_TORTOISEIDIFF, \r
+                                                       hResource, \r
+                                                       NULL);\r
+       if (hwndTB == INVALID_HANDLE_VALUE)\r
+               return false;\r
+\r
+       SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);\r
+\r
+       TBBUTTON tbb[12];\r
+       // create an imagelist containing the icons for the toolbar\r
+       hToolbarImgList = ImageList_Create(24, 24, ILC_COLOR32 | ILC_MASK, 12, 4);\r
+       if (hToolbarImgList == NULL)\r
+               return false;\r
+       int index = 0;\r
+       HICON hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_OVERLAP));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_OVERLAPIMAGES; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_BLEND));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_BLENDALPHA; \r
+       tbb[index].fsState = 0; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_LINK));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_LINKIMAGESTOGETHER; \r
+       tbb[index].fsState = TBSTATE_ENABLED | TBSTATE_CHECKED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_FITTOGETHER));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_FITTOGETHER; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       tbb[index].iBitmap = 0; \r
+       tbb[index].idCommand = 0; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_SEP; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_VERTICAL));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_ARRANGEVERTICAL; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_FITINWINDOW));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_FITIMAGESINWINDOW; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_ORIGSIZE));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_ORININALSIZE; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_ZOOMIN));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_ZOOMIN; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_ZOOMOUT));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_ZOOMOUT; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       tbb[index].iBitmap = 0; \r
+       tbb[index].idCommand = 0; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_SEP; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_IMGINFO));\r
+       tbb[index].iBitmap = ImageList_AddIcon(hToolbarImgList, hIcon); \r
+       tbb[index].idCommand = ID_VIEW_IMAGEINFO; \r
+       tbb[index].fsState = TBSTATE_ENABLED; \r
+       tbb[index].fsStyle = BTNS_BUTTON; \r
+       tbb[index].dwData = 0; \r
+       tbb[index++].iString = 0; \r
+\r
+       SendMessage(hwndTB, TB_SETIMAGELIST, 0, (LPARAM)hToolbarImgList);\r
+       SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM)index, (LPARAM) (LPTBBUTTON) &tbb); \r
+       SendMessage(hwndTB, TB_AUTOSIZE, 0, 0); \r
+       ShowWindow(hwndTB, SW_SHOW); \r
+       return true; \r
+\r
+}\r
diff --git a/src/TortoiseIDiff/MainWindow.h b/src/TortoiseIDiff/MainWindow.h
new file mode 100644 (file)
index 0000000..202a852
--- /dev/null
@@ -0,0 +1,123 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006-2007,2009 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+#include "BaseWindow.h"\r
+#include "PicWindow.h"\r
+#include "commctrl.h"\r
+#include "TortoiseIDiff.h"\r
+\r
+#define SPLITTER_BORDER 2\r
+\r
+#define WINDOW_MINHEIGHT 200\r
+#define WINDOW_MINWIDTH 200\r
+\r
+/**\r
+ * \ingroup TortoiseIDiff\r
+ * The main window of TortoiseIDiff.\r
+ * Hosts the two image views, the menu, toolbar, slider, ...\r
+ */\r
+class CMainWindow : public CWindow\r
+{\r
+public:\r
+       CMainWindow(HINSTANCE hInst, const WNDCLASSEX* wcx = NULL) : CWindow(hInst, wcx)\r
+               , picWindow1(hInst)\r
+               , picWindow2(hInst)\r
+               , oldx(-4)\r
+               , oldy(-4)\r
+               , bMoved(false)\r
+               , bDragMode(false)\r
+               , nSplitterPos(100)\r
+               , bOverlap(false)\r
+               , bShowInfo(false)\r
+               , bVertical(false)\r
+               , bLinkedPositions(true)\r
+               , bFitSizes(false)\r
+               , transparentColor(::GetSysColor(COLOR_WINDOW))\r
+               , m_BlendType(CPicWindow::BLEND_ALPHA)\r
+       { \r
+               SetWindowTitle((LPCTSTR)ResString(hResource, IDS_APP_TITLE));\r
+       };\r
+\r
+       /**\r
+        * Registers the window class and creates the window.\r
+        */\r
+       bool RegisterAndCreateWindow();\r
+\r
+       /**\r
+        * Sets the image path and title for the left image view.\r
+        */\r
+       void SetLeft(tstring leftpath, tstring lefttitle) {leftpicpath=leftpath; leftpictitle=lefttitle;}\r
+       /**\r
+        * Sets the image path and the title for the right image view.\r
+        */\r
+       void SetRight(tstring rightpath, tstring righttitle) {rightpicpath=rightpath; rightpictitle=righttitle;}\r
+\r
+protected:\r
+       /// the message handler for this window\r
+       LRESULT CALLBACK        WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
+       /// Handles all the WM_COMMAND window messages (e.g. menu commands)\r
+       LRESULT                         DoCommand(int id);\r
+\r
+       /// Positions the child windows. Call this after the window sizes/positions have changed.\r
+       void                            PositionChildren(RECT * clientrect = NULL);\r
+       /// Shows the "Open images" dialog where the user can select the images to diff\r
+       bool                            OpenDialog();\r
+       static BOOL CALLBACK OpenDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+       static bool                     AskForFile(HWND owner, TCHAR * path);\r
+\r
+       // splitter methods\r
+       void                            DrawXorBar(HDC hdc, int x1, int y1, int width, int height);\r
+       LRESULT                         Splitter_OnLButtonDown(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);\r
+       LRESULT                         Splitter_OnLButtonUp(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);\r
+       LRESULT                         Splitter_OnMouseMove(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);\r
+\r
+       // toolbar\r
+       bool                            CreateToolbar();\r
+       HWND                            hwndTB;\r
+       HIMAGELIST                      hToolbarImgList;\r
+\r
+       // command line params\r
+       static tstring  leftpicpath;\r
+       static tstring  leftpictitle;\r
+\r
+       static tstring  rightpicpath;\r
+       static tstring  rightpictitle;\r
+\r
+       // image data\r
+       CPicWindow              picWindow1;\r
+       CPicWindow              picWindow2;\r
+       bool                    bShowInfo;\r
+       COLORREF                transparentColor;\r
+\r
+       // splitter data\r
+       int                             oldx;\r
+       int                             oldy;\r
+       bool                    bMoved;\r
+       bool                    bDragMode;\r
+       int                             nSplitterPos;\r
+\r
+       // one/two pane view\r
+       bool                    bOverlap;\r
+       bool                    bVertical;\r
+       bool                    bLinkedPositions;\r
+       bool                    bFitSizes;\r
+       CPicWindow::BlendType   m_BlendType;\r
+\r
+};\r
+\r
diff --git a/src/TortoiseIDiff/NiceTrackbar.cpp b/src/TortoiseIDiff/NiceTrackbar.cpp
new file mode 100644 (file)
index 0000000..63a42b8
--- /dev/null
@@ -0,0 +1,127 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006 - 2008 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "StdAfx.h"\r
+#include "NiceTrackbar.h"\r
+#include <tchar.h>\r
+#include <CommCtrl.h>\r
+#include <WindowsX.h>\r
+\r
+\r
+LRESULT CALLBACK CNiceTrackbar::NiceTrackbarProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       CNiceTrackbar* self = (CNiceTrackbar*)GetWindowLongPtr(hwnd, GWLP_USERDATA);\r
+\r
+       switch (message) {\r
+       case WM_LBUTTONDOWN:\r
+               self->m_Dragging = true;\r
+               self->m_DragChanged = false;\r
+               SetCapture(hwnd);\r
+               //SetFocus(hwnd);\r
+               if (self->SetThumb(lParam)) {\r
+                       self->m_DragChanged = true;\r
+                       self->PostMessageToParent(TB_THUMBTRACK);\r
+               }\r
+               return 0;\r
+       case WM_MOUSEMOVE:\r
+               if (self->m_Dragging)\r
+               {\r
+                       if (self->SetThumb(lParam))\r
+                       {\r
+                               self->m_DragChanged = true;\r
+                               self->PostMessageToParent(TB_THUMBTRACK);\r
+                       }\r
+                       return 0;\r
+               }\r
+               break;\r
+       case WM_LBUTTONUP:\r
+               if (self->m_Dragging)\r
+               {\r
+                       self->m_Dragging = false;\r
+                       ReleaseCapture();\r
+                       if (self->SetThumb(lParam))\r
+                       {\r
+                               self->PostMessageToParent(TB_ENDTRACK);\r
+                               self->m_DragChanged = true;\r
+                       }\r
+                       if (self->m_DragChanged)\r
+                       {\r
+                               self->PostMessageToParent(TB_THUMBPOSITION);\r
+                               self->m_DragChanged = false;\r
+                       }\r
+                       return 0;\r
+               }\r
+               break;\r
+       case WM_DESTROY:\r
+               SetWindowLongPtr (hwnd, GWLP_WNDPROC, (LONG_PTR)self->m_OrigProc);\r
+               break;\r
+       }\r
+       return CallWindowProc (self->m_OrigProc, hwnd, message, wParam, lParam);\r
+}\r
+\r
+\r
+void CNiceTrackbar::ConvertTrackbarToNice( HWND window )\r
+{\r
+       m_Window = window;\r
+\r
+       // setup this pointer\r
+       SetWindowLongPtr( window, GWLP_USERDATA, (LONG_PTR)this );\r
+\r
+       // subclass it\r
+       m_OrigProc = (WNDPROC)SetWindowLongPtr( window, GWLP_WNDPROC, (LONG_PTR)NiceTrackbarProc );\r
+}\r
+\r
+\r
+bool CNiceTrackbar::SetThumb (LPARAM lparamPoint)\r
+{\r
+       POINT point = { GET_X_LPARAM(lparamPoint), GET_Y_LPARAM(lparamPoint) };\r
+       const int nMin = (int)SendMessage(m_Window, TBM_GETRANGEMIN, 0, 0l);\r
+       const int nMax = (int)SendMessage(m_Window, TBM_GETRANGEMAX, 0, 0l);\r
+       RECT rc;\r
+       SendMessage(m_Window, TBM_GETCHANNELRECT, 0, (LPARAM)&rc);\r
+       double ratio;\r
+       if (GetWindowLong(m_Window, GWL_STYLE) & TBS_VERT)\r
+       {\r
+               // note: for vertical trackbar, it still returns the rectangle as if it was horizontal\r
+               ratio = (double)(point.y - rc.left)/(rc.right - rc.left);\r
+       }\r
+       else\r
+       {\r
+               ratio = (double)(point.x - rc.left)/(rc.right - rc.left);\r
+       }\r
+\r
+       int nNewPos = (int)(nMin + (nMax-nMin)*ratio + 0.5); // round the result to go to the nearest tick mark\r
+\r
+       const bool changed = (nNewPos != (int)SendMessage(m_Window, TBM_GETPOS, 0, 0));\r
+       if (changed)\r
+       {\r
+               SendMessage(m_Window, TBM_SETPOS, TRUE, nNewPos);\r
+       }\r
+       return changed;\r
+}\r
+\r
+\r
+void CNiceTrackbar::PostMessageToParent (int tbCode) const\r
+{\r
+       HWND parent = GetParent(m_Window);\r
+       if (parent) {\r
+               int pos = (int)SendMessage(m_Window, TBM_GETPOS, 0, 0);\r
+               bool vert = (GetWindowLong(m_Window, GWL_STYLE) & TBS_VERT) != 0;\r
+               PostMessage( parent, vert ? WM_VSCROLL : WM_HSCROLL, (WPARAM)((pos << 16) | tbCode), (LPARAM)m_Window );\r
+       }\r
+}\r
diff --git a/src/TortoiseIDiff/NiceTrackbar.h b/src/TortoiseIDiff/NiceTrackbar.h
new file mode 100644 (file)
index 0000000..920de54
--- /dev/null
@@ -0,0 +1,45 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006 - 2008 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+\r
+/**\r
+ * \ingroup TortoiseIDiff\r
+ * Subclassed trackbar control that jumps to the mouse click positions immediately, instead of\r
+ * changing the value "towards it".\r
+ */\r
+class CNiceTrackbar {\r
+public:\r
+       CNiceTrackbar() : m_Window(NULL), m_OrigProc(NULL), m_Dragging(false), m_DragChanged(false) { }\r
+\r
+       HWND GetWindow() const { return m_Window; }\r
+       bool IsValid() const { return m_Window != NULL; }\r
+\r
+       void ConvertTrackbarToNice( HWND window );\r
+\r
+private:\r
+       static LRESULT CALLBACK NiceTrackbarProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);\r
+       void PostMessageToParent (int tbCode) const;\r
+       bool SetThumb (LPARAM lparamPoint);\r
+\r
+private:\r
+       HWND m_Window;\r
+       WNDPROC m_OrigProc;\r
+       bool m_Dragging;\r
+       bool m_DragChanged;\r
+};\r
diff --git a/src/TortoiseIDiff/PicWindow.cpp b/src/TortoiseIDiff/PicWindow.cpp
new file mode 100644 (file)
index 0000000..4a550b6
--- /dev/null
@@ -0,0 +1,1432 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006-2009 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "StdAfx.h"\r
+#include "shellapi.h"\r
+#include "commctrl.h"\r
+#include "PicWindow.h"\r
+#include "math.h"\r
+\r
+#pragma comment(lib, "Msimg32.lib")\r
+#pragma comment(lib, "shell32.lib")\r
+\r
+bool CPicWindow::RegisterAndCreateWindow(HWND hParent)\r
+{\r
+       WNDCLASSEX wcx; \r
+\r
+       // Fill in the window class structure with default parameters \r
+       wcx.cbSize = sizeof(WNDCLASSEX);\r
+       wcx.style = CS_HREDRAW | CS_VREDRAW;\r
+       wcx.lpfnWndProc = CWindow::stWinMsgHandler;\r
+       wcx.cbClsExtra = 0;\r
+       wcx.cbWndExtra = 0;\r
+       wcx.hInstance = hResource;\r
+       wcx.hCursor = LoadCursor(NULL, IDC_ARROW);\r
+       wcx.lpszClassName = _T("TortoiseIDiffPicWindow");\r
+       wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_TORTOISEIDIFF));\r
+       wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);\r
+       wcx.lpszMenuName = MAKEINTRESOURCE(IDC_TORTOISEIDIFF);\r
+       wcx.hIconSm     = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_TORTOISEIDIFF));\r
+       RegisterWindow(&wcx);\r
+       if (CreateEx(WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE, WS_CHILD | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE, hParent))\r
+       {\r
+               ShowWindow(m_hwnd, SW_SHOW);\r
+               UpdateWindow(m_hwnd);\r
+               CreateButtons();\r
+               return true;\r
+       }\r
+       return false;\r
+}\r
+\r
+void CPicWindow::PositionTrackBar()\r
+{\r
+       RECT rc;\r
+       GetClientRect(&rc);\r
+       HWND slider = m_AlphaSlider.GetWindow();\r
+       if ((pSecondPic)&&(m_blend == BLEND_ALPHA))\r
+       {\r
+               MoveWindow(slider, 0, rc.top-4+SLIDER_WIDTH, SLIDER_WIDTH, rc.bottom-rc.top-SLIDER_WIDTH+8, true);\r
+               ShowWindow(slider, SW_SHOW);\r
+               MoveWindow(hwndAlphaToggleBtn, 0, rc.top-4, SLIDER_WIDTH, SLIDER_WIDTH, true);\r
+               ShowWindow(hwndAlphaToggleBtn, SW_SHOW);\r
+       }\r
+       else\r
+       {\r
+               ShowWindow(slider, SW_HIDE);\r
+               ShowWindow(hwndAlphaToggleBtn, SW_HIDE);\r
+       }\r
+}\r
+\r
+LRESULT CALLBACK CPicWindow::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+{\r
+       TRACKMOUSEEVENT mevt;\r
+       switch (uMsg)\r
+       {\r
+       case WM_CREATE:\r
+               {\r
+                       // create a slider control\r
+                        CreateTrackbar(hwnd);\r
+                       ShowWindow(m_AlphaSlider.GetWindow(), SW_HIDE);\r
+                       //Create the tooltips\r
+                       TOOLINFO ti;\r
+                       RECT rect;                  // for client area coordinates\r
+\r
+                       hwndTT = CreateWindowEx(WS_EX_TOPMOST,\r
+                               TOOLTIPS_CLASS,\r
+                               NULL,\r
+                               WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,                \r
+                               CW_USEDEFAULT,\r
+                               CW_USEDEFAULT,\r
+                               CW_USEDEFAULT,\r
+                               CW_USEDEFAULT,\r
+                               hwnd,\r
+                               NULL,\r
+                               hResource,\r
+                               NULL\r
+                               );\r
+\r
+                       SetWindowPos(hwndTT,\r
+                               HWND_TOPMOST,\r
+                               0,\r
+                               0,\r
+                               0,\r
+                               0,\r
+                               SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);\r
+\r
+                       ::GetClientRect(hwnd, &rect);\r
+\r
+                       ti.cbSize = sizeof(TOOLINFO);\r
+                       ti.uFlags = TTF_TRACK | TTF_ABSOLUTE;\r
+                       ti.hwnd = hwnd;\r
+                       ti.hinst = hResource;\r
+                       ti.uId = 0;\r
+                       ti.lpszText = LPSTR_TEXTCALLBACK;\r
+                       // ToolTip control will cover the whole window\r
+                       ti.rect.left = rect.left;    \r
+                       ti.rect.top = rect.top;\r
+                       ti.rect.right = rect.right;\r
+                       ti.rect.bottom = rect.bottom;\r
+\r
+                       SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); \r
+                       SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 600);\r
+                       nHSecondScrollPos = 0;\r
+                       nVSecondScrollPos = 0;\r
+               }\r
+               break;\r
+       case WM_SETFOCUS:\r
+       case WM_KILLFOCUS:\r
+               InvalidateRect(*this, NULL, FALSE);\r
+               break;\r
+       case WM_ERASEBKGND:\r
+               return 1;\r
+               break;\r
+       case WM_PAINT:\r
+               Paint(hwnd);\r
+               break;\r
+       case WM_SIZE:\r
+               PositionTrackBar();\r
+               SetupScrollBars();\r
+               break;\r
+       case WM_VSCROLL:\r
+               if ((pSecondPic)&&((HWND)lParam == m_AlphaSlider.GetWindow()))\r
+               {\r
+                       if (LOWORD(wParam) == TB_THUMBTRACK)\r
+                       {\r
+                               // while tracking, only redraw after 50 milliseconds\r
+                               ::SetTimer(*this, TIMER_ALPHASLIDER, 50, NULL);\r
+                       }\r
+                       else\r
+                               SetBlendAlpha(m_blend, SendMessage(m_AlphaSlider.GetWindow(), TBM_GETPOS, 0, 0) / 16.0f);\r
+               }\r
+               else\r
+               {\r
+                       UINT nPos = HIWORD(wParam);\r
+                       bool bForceUpdate = false;\r
+                       if (LOWORD(wParam) == SB_THUMBTRACK || LOWORD(wParam) == SB_THUMBPOSITION)\r
+                       {\r
+                               // Get true 32-bit scroll position\r
+                               SCROLLINFO si;\r
+                               si.cbSize = sizeof(SCROLLINFO);\r
+                               si.fMask = SIF_TRACKPOS;\r
+                               GetScrollInfo(*this, SB_VERT, &si);\r
+                               nPos = si.nTrackPos;\r
+                               bForceUpdate = true;\r
+                       }\r
+\r
+                       OnVScroll(LOWORD(wParam), nPos);\r
+                       if (bLinkedPositions)\r
+                       {\r
+                               pTheOtherPic->OnVScroll(LOWORD(wParam), nPos);\r
+                               if (bForceUpdate)\r
+                                       ::UpdateWindow(*pTheOtherPic);\r
+                       }\r
+               }\r
+               break;\r
+       case WM_HSCROLL:\r
+               {\r
+                       UINT nPos = HIWORD(wParam);\r
+                       bool bForceUpdate = false;\r
+                       if (LOWORD(wParam) == SB_THUMBTRACK || LOWORD(wParam) == SB_THUMBPOSITION)\r
+                       {\r
+                               // Get true 32-bit scroll position\r
+                               SCROLLINFO si;\r
+                               si.cbSize = sizeof(SCROLLINFO);\r
+                               si.fMask = SIF_TRACKPOS;\r
+                               GetScrollInfo(*this, SB_VERT, &si);\r
+                               nPos = si.nTrackPos;\r
+                               bForceUpdate = true;\r
+                       }\r
+\r
+                       OnHScroll(LOWORD(wParam), nPos);\r
+                       if (bLinkedPositions)\r
+                       {\r
+                               pTheOtherPic->OnHScroll(LOWORD(wParam), nPos);\r
+                               if (bForceUpdate)\r
+                                       ::UpdateWindow(*pTheOtherPic);\r
+                       }\r
+               }\r
+               break;\r
+       case WM_MOUSEWHEEL:\r
+               {\r
+                       OnMouseWheel(GET_KEYSTATE_WPARAM(wParam), GET_WHEEL_DELTA_WPARAM(wParam));\r
+                       if (bFitSizes)\r
+                               pTheOtherPic->OnMouseWheel(GET_KEYSTATE_WPARAM(wParam), GET_WHEEL_DELTA_WPARAM(wParam));\r
+               }\r
+               break;\r
+       case WM_MOUSEHWHEEL:\r
+               {\r
+                       OnMouseWheel(GET_KEYSTATE_WPARAM(wParam)|MK_SHIFT, GET_WHEEL_DELTA_WPARAM(wParam));\r
+                       if (bFitSizes)\r
+                               pTheOtherPic->OnMouseWheel(GET_KEYSTATE_WPARAM(wParam)|MK_SHIFT, GET_WHEEL_DELTA_WPARAM(wParam));\r
+               }\r
+               break;\r
+       case WM_LBUTTONDOWN:\r
+               SetFocus(*this);\r
+               ptPanStart.x = GET_X_LPARAM(lParam);\r
+               ptPanStart.y = GET_Y_LPARAM(lParam);\r
+               startVScrollPos = nVScrollPos;\r
+               startHScrollPos = nHScrollPos;\r
+               startVSecondScrollPos = nVSecondScrollPos;\r
+               startHSecondScrollPos = nHSecondScrollPos;\r
+               SetCapture(*this);\r
+               break;\r
+       case WM_LBUTTONUP:\r
+               ReleaseCapture();\r
+               break;\r
+       case WM_MOUSELEAVE:\r
+               m_lastTTPos.x = 0;\r
+               m_lastTTPos.y = 0;\r
+               SendMessage(hwndTT, TTM_TRACKACTIVATE, FALSE, 0);\r
+               break;\r
+       case WM_MOUSEMOVE:\r
+               {\r
+                       mevt.cbSize = sizeof(TRACKMOUSEEVENT);\r
+                       mevt.dwFlags = TME_LEAVE;\r
+                       mevt.dwHoverTime = HOVER_DEFAULT;\r
+                       mevt.hwndTrack = *this;\r
+                       ::TrackMouseEvent(&mevt);\r
+                       POINT pt = {((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam))};\r
+                       if (pt.y < HEADER_HEIGHT)\r
+                       {\r
+                               ClientToScreen(*this, &pt);\r
+                               if ((abs(m_lastTTPos.x - pt.x) > 20)||(abs(m_lastTTPos.y - pt.y) > 10))\r
+                               {\r
+                                       m_lastTTPos = pt;\r
+                                       pt.x += 15;\r
+                                       pt.y += 15;\r
+                                       SendMessage(hwndTT, TTM_TRACKPOSITION, 0, MAKELONG(pt.x, pt.y));\r
+                                       TOOLINFO ti = {0};\r
+                                       ti.cbSize = sizeof(TOOLINFO);\r
+                                       ti.hwnd = *this;\r
+                                       ti.uId = 0;\r
+                                       SendMessage(hwndTT, TTM_TRACKACTIVATE, TRUE, (LPARAM)&ti);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               SendMessage(hwndTT, TTM_TRACKACTIVATE, FALSE, 0);\r
+                               m_lastTTPos.x = 0;\r
+                               m_lastTTPos.y = 0;\r
+                       }\r
+                       if (wParam & MK_LBUTTON)\r
+                       {\r
+                               // pan the image\r
+                               int xPos = GET_X_LPARAM(lParam); \r
+                               int yPos = GET_Y_LPARAM(lParam);\r
+                               if (wParam & MK_CONTROL)\r
+                               {\r
+                                       nHSecondScrollPos = startHSecondScrollPos + (ptPanStart.x - xPos);\r
+                                       nVSecondScrollPos = startVSecondScrollPos + (ptPanStart.y - yPos);\r
+                               }\r
+                               else\r
+                               {\r
+                                       nHScrollPos = startHScrollPos + (ptPanStart.x - xPos);\r
+                                       nVScrollPos = startVScrollPos + (ptPanStart.y - yPos);\r
+                               }\r
+                               SetupScrollBars();\r
+                               InvalidateRect(*this, NULL, TRUE);\r
+                               UpdateWindow(*this);\r
+                               if (bLinkedPositions)\r
+                               {\r
+                                       pTheOtherPic->nHScrollPos = nHScrollPos;\r
+                                       pTheOtherPic->nVScrollPos = nVScrollPos;\r
+                                       pTheOtherPic->SetupScrollBars();\r
+                                       InvalidateRect(*pTheOtherPic, NULL, TRUE);\r
+                                       UpdateWindow(*pTheOtherPic);\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       case WM_SETCURSOR:\r
+               {\r
+                       // we show a hand cursor if the image can be dragged,\r
+                       // and a hand-down cursor if the image is currently dragged\r
+                       if ((*this == (HWND)wParam)&&(LOWORD(lParam)==HTCLIENT))\r
+                       {\r
+                               RECT rect;\r
+                               GetClientRect(&rect);\r
+                               LONG width = picture.m_Width;\r
+                               LONG height = picture.m_Height;\r
+                               if (pSecondPic)\r
+                               {\r
+                                       width = max(width, pSecondPic->m_Width);\r
+                                       height = max(height, pSecondPic->m_Height);\r
+                               }\r
+\r
+                               if ((GetKeyState(VK_LBUTTON)&0x8000)||(HIWORD(lParam) == WM_LBUTTONDOWN))\r
+                               {\r
+                                       SetCursor(curHandDown);\r
+                               }\r
+                               else\r
+                               {\r
+                                       SetCursor(curHand);\r
+                               }\r
+                               return TRUE;\r
+                       }\r
+                       return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+               }\r
+               break;\r
+       case WM_DROPFILES:\r
+               {\r
+                       HDROP hDrop = (HDROP)wParam;            \r
+                       TCHAR szFileName[MAX_PATH];\r
+                       // we only use the first file dropped (if multiple files are dropped)\r
+                       DragQueryFile(hDrop, 0, szFileName, sizeof(szFileName)/sizeof(TCHAR));\r
+                       SetPic(szFileName, _T(""), bMainPic);\r
+                       FitImageInWindow();\r
+                       InvalidateRect(*this, NULL, TRUE);\r
+               }\r
+               break;\r
+       case WM_COMMAND:\r
+               {\r
+                       switch (LOWORD(wParam))\r
+                       {\r
+                       case LEFTBUTTON_ID:\r
+                               {\r
+                                       PrevImage();\r
+                                       if (bLinkedPositions)\r
+                                               pTheOtherPic->PrevImage();\r
+                                       return 0;\r
+                               }\r
+                               break;\r
+                       case RIGHTBUTTON_ID:\r
+                               {\r
+                                       NextImage();\r
+                                       if (bLinkedPositions)\r
+                                               pTheOtherPic->NextImage();\r
+                                       return 0;\r
+                               }\r
+                               break;\r
+                       case PLAYBUTTON_ID:\r
+                               {\r
+                                       bPlaying = !bPlaying;\r
+                                       Animate(bPlaying);\r
+                                       if (bLinkedPositions)\r
+                                               pTheOtherPic->Animate(bPlaying);\r
+                                       return 0;\r
+                               }\r
+                               break;\r
+                       case ALPHATOGGLEBUTTON_ID:\r
+                               {\r
+                                       WORD msg = HIWORD(wParam);\r
+                                       switch (msg)\r
+                                       {\r
+                                       case BN_DOUBLECLICKED:\r
+                                               {\r
+                                                       SendMessage(hwndAlphaToggleBtn, BM_SETSTATE, 1, 0);\r
+                                                       SetTimer(*this, ID_ALPHATOGGLETIMER, 1000, NULL);\r
+                                               }\r
+                                               break;\r
+                                       case BN_CLICKED:\r
+                                               KillTimer(*this, ID_ALPHATOGGLETIMER);\r
+                                               ToggleAlpha();\r
+                                               break;\r
+                                       }\r
+                                       return 0;\r
+                               }\r
+                               break;\r
+                       case BLENDALPHA_ID:\r
+                               {\r
+                                       m_blend = BLEND_ALPHA;\r
+                                       PositionTrackBar();\r
+                                       InvalidateRect(*this, NULL, TRUE);\r
+                               }\r
+                               break;\r
+                       case BLENDXOR_ID:\r
+                               {\r
+                                       m_blend = BLEND_XOR;\r
+                                       PositionTrackBar();\r
+                                       InvalidateRect(*this, NULL, TRUE);\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               break;\r
+       case WM_TIMER:\r
+               {\r
+                       switch (wParam)\r
+                       {\r
+                       case ID_ANIMATIONTIMER:\r
+                               {\r
+                                       nCurrentFrame++;\r
+                                       if (nCurrentFrame > picture.GetNumberOfFrames(0))\r
+                                               nCurrentFrame = 1;\r
+                                       long delay = picture.SetActiveFrame(nCurrentFrame);\r
+                                       delay = max(100, delay);\r
+                                       SetTimer(*this, ID_ANIMATIONTIMER, delay, NULL);\r
+                                       InvalidateRect(*this, NULL, FALSE);\r
+                               }\r
+                               break;\r
+                       case TIMER_ALPHASLIDER:\r
+                               {\r
+                                       SetBlendAlpha(m_blend, SendMessage(m_AlphaSlider.GetWindow(), TBM_GETPOS, 0, 0)/16.0f);\r
+                                       KillTimer(*this, TIMER_ALPHASLIDER);\r
+                               }\r
+                               break;\r
+                       case ID_ALPHATOGGLETIMER:\r
+                               {\r
+                                       ToggleAlpha();\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               break;\r
+       case WM_NOTIFY:\r
+               {\r
+                       LPNMHDR pNMHDR = (LPNMHDR)lParam;\r
+                       if (pNMHDR->code == TTN_GETDISPINFO)\r
+                       {\r
+                               if ((HWND)wParam == m_AlphaSlider.GetWindow())\r
+                               {\r
+                                       LPTOOLTIPTEXT lpttt; \r
+\r
+                                       lpttt = (LPTOOLTIPTEXT) lParam; \r
+                                       lpttt->hinst = hResource; \r
+                                       TCHAR stringbuf[MAX_PATH] = {0};\r
+                                       _stprintf_s(stringbuf, MAX_PATH, _T("%i%% alpha"), (int)(SendMessage(m_AlphaSlider.GetWindow(),TBM_GETPOS,0,0)/16.0f*100.0f));\r
+                                       lpttt->lpszText = stringbuf;\r
+                               }\r
+                               else\r
+                               {\r
+                                       NMTTDISPINFOA* pTTTA = (NMTTDISPINFOA*)pNMHDR;\r
+                                       NMTTDISPINFOW* pTTTW = (NMTTDISPINFOW*)pNMHDR;\r
+                                       BuildInfoString(m_wszTip, sizeof(m_wszTip)/sizeof(TCHAR), true);\r
+                                       if (pNMHDR->code == TTN_NEEDTEXTW)\r
+                                       {\r
+                                               pTTTW->lpszText = m_wszTip;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               pTTTA->lpszText = m_szTip;\r
+                                               ::WideCharToMultiByte(CP_ACP, 0, m_wszTip, -1, m_szTip, 8192, NULL, NULL);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+       case WM_DESTROY:\r
+               DestroyIcon(hLeft);\r
+               DestroyIcon(hRight);\r
+               DestroyIcon(hPlay);\r
+               DestroyIcon(hStop);\r
+               bWindowClosed = TRUE;\r
+               break;\r
+       default:\r
+               return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
+       }\r
+\r
+       return 0;\r
+};\r
+\r
+void CPicWindow::NextImage()\r
+{\r
+       nCurrentDimension++;\r
+       if (nCurrentDimension > picture.GetNumberOfDimensions())\r
+               nCurrentDimension = picture.GetNumberOfDimensions();\r
+       nCurrentFrame++;\r
+       if (nCurrentFrame > picture.GetNumberOfFrames(0))\r
+               nCurrentFrame = picture.GetNumberOfFrames(0);\r
+       picture.SetActiveFrame(nCurrentFrame >= nCurrentDimension ? nCurrentFrame : nCurrentDimension);\r
+       InvalidateRect(*this, NULL, FALSE);\r
+       PositionChildren();\r
+}\r
+\r
+void CPicWindow::PrevImage()\r
+{\r
+       nCurrentDimension--;\r
+       if (nCurrentDimension < 1)\r
+               nCurrentDimension = 1;\r
+       nCurrentFrame--;\r
+       if (nCurrentFrame < 1)\r
+               nCurrentFrame = 1;\r
+       picture.SetActiveFrame(nCurrentFrame >= nCurrentDimension ? nCurrentFrame : nCurrentDimension);\r
+       InvalidateRect(*this, NULL, FALSE);\r
+       PositionChildren();\r
+}\r
+\r
+void CPicWindow::Animate(bool bStart)\r
+{\r
+       if (bStart)\r
+       {\r
+               SendMessage(hwndPlayBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hStop);\r
+               SetTimer(*this, ID_ANIMATIONTIMER, 0, NULL);\r
+       }\r
+       else\r
+       {\r
+               SendMessage(hwndPlayBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hPlay);\r
+               KillTimer(*this, ID_ANIMATIONTIMER);\r
+       }\r
+}\r
+\r
+void CPicWindow::SetPic(tstring path, tstring title, bool bFirst)\r
+{\r
+       bMainPic = bFirst;\r
+       picpath=path;pictitle=title;\r
+       picture.SetInterpolationMode(InterpolationModeHighQualityBicubic);\r
+       bValid = picture.Load(picpath);\r
+       nDimensions = picture.GetNumberOfDimensions();\r
+       if (nDimensions)\r
+               nFrames = picture.GetNumberOfFrames(0);\r
+       if (bValid)\r
+       {\r
+               picscale = 1.0;\r
+               PositionChildren();\r
+               InvalidateRect(*this, NULL, FALSE);\r
+       }\r
+}\r
+\r
+void CPicWindow::DrawViewTitle(HDC hDC, RECT * rect)\r
+{\r
+       HFONT hFont = NULL;\r
+       hFont = CreateFont(-MulDiv(pSecondPic ? 8 : 10, GetDeviceCaps(hDC, LOGPIXELSY), 72), 0, 0, 0, FW_DONTCARE, false, false, false, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, _T("MS Shell Dlg"));\r
+       HFONT hFontOld = (HFONT)SelectObject(hDC, (HGDIOBJ)hFont);\r
+\r
+       RECT textrect;\r
+       textrect.left = rect->left;\r
+       textrect.top = rect->top;\r
+       textrect.right = rect->right;\r
+       textrect.bottom = rect->top + HEADER_HEIGHT;\r
+       if (HasMultipleImages())\r
+               textrect.bottom += HEADER_HEIGHT;\r
+\r
+       COLORREF crBk, crFg;\r
+       crBk = ::GetSysColor(COLOR_SCROLLBAR);\r
+       crFg = ::GetSysColor(COLOR_WINDOWTEXT);\r
+       SetBkColor(hDC, crBk);\r
+       ::ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &textrect, NULL, 0, NULL);\r
+\r
+       if (GetFocus() == *this)\r
+               DrawEdge(hDC, &textrect, EDGE_BUMP, BF_RECT);\r
+       else\r
+               DrawEdge(hDC, &textrect, EDGE_ETCHED, BF_RECT);\r
+\r
+       SetTextColor(hDC, crFg);\r
+\r
+       // use the path if no title is set.\r
+       tstring * title = pictitle.empty() ? &picpath : &pictitle;\r
+\r
+       tstring realtitle = *title;\r
+       tstring imgnumstring;\r
+\r
+       if (HasMultipleImages())\r
+       {\r
+               TCHAR buf[MAX_PATH];\r
+               if (nFrames > 1)\r
+                       _stprintf_s(buf, sizeof(buf)/sizeof(TCHAR), (const TCHAR *)ResString(hResource, IDS_DIMENSIONSANDFRAMES), nCurrentFrame, nFrames);\r
+               else\r
+                       _stprintf_s(buf, sizeof(buf)/sizeof(TCHAR), (const TCHAR *)ResString(hResource, IDS_DIMENSIONSANDFRAMES), nCurrentDimension, nDimensions);\r
+               imgnumstring = buf;\r
+       }\r
+\r
+       SIZE stringsize;\r
+       if (GetTextExtentPoint32(hDC, realtitle.c_str(), (int)realtitle.size(), &stringsize))\r
+       {\r
+               int nStringLength = stringsize.cx;\r
+               int texttop = pSecondPic ? textrect.top + (HEADER_HEIGHT/2) - stringsize.cy : textrect.top + (HEADER_HEIGHT/2) - stringsize.cy/2;\r
+               ExtTextOut(hDC, \r
+                       max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),\r
+                       texttop,\r
+                       ETO_CLIPPED,\r
+                       &textrect,\r
+                       realtitle.c_str(),\r
+                       (UINT)realtitle.size(),\r
+                       NULL);\r
+               if (pSecondPic)\r
+               {\r
+                       realtitle = (pictitle2.empty() ? picpath2 : pictitle2);\r
+                       ExtTextOut(hDC, \r
+                               max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),\r
+                               texttop + stringsize.cy,\r
+                               ETO_CLIPPED,\r
+                               &textrect,\r
+                               realtitle.c_str(),\r
+                               (UINT)realtitle.size(),\r
+                               NULL);\r
+               }\r
+       }\r
+       if (HasMultipleImages())\r
+       {\r
+               if (GetTextExtentPoint32(hDC, imgnumstring.c_str(), (int)imgnumstring.size(), &stringsize))\r
+               {\r
+                       int nStringLength = stringsize.cx;\r
+\r
+                       ExtTextOut(hDC, \r
+                               max(textrect.left + ((textrect.right-textrect.left)-nStringLength)/2, 1),\r
+                               textrect.top + HEADER_HEIGHT + (HEADER_HEIGHT/2) - stringsize.cy/2,\r
+                               ETO_CLIPPED,\r
+                               &textrect,\r
+                               imgnumstring.c_str(),\r
+                               (UINT)imgnumstring.size(),\r
+                               NULL);\r
+               }\r
+       }\r
+       SelectObject(hDC, (HGDIOBJ)hFontOld);\r
+       DeleteObject(hFont);\r
+}\r
+\r
+void CPicWindow::SetupScrollBars()\r
+{\r
+       RECT rect;\r
+       GetClientRect(&rect);\r
+\r
+       SCROLLINFO si = {sizeof(si)};\r
+\r
+       si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;\r
+\r
+       double width = double(picture.m_Width)*picscale;\r
+       double height = double(picture.m_Height)*picscale;\r
+       if (pSecondPic)\r
+       {\r
+               width = max(width, double(pSecondPic->m_Width)*pTheOtherPic->GetZoom());\r
+               height = max(height, double(pSecondPic->m_Height)*pTheOtherPic->GetZoom());\r
+       }\r
+\r
+       bool bShowHScrollBar = (nHScrollPos > 0); // left of pic is left of window\r
+       bShowHScrollBar      = bShowHScrollBar || (width-nHScrollPos > rect.right); // right of pic is outside right of window\r
+       bShowHScrollBar      = bShowHScrollBar || (width+nHScrollPos > rect.right); // right of pic is outside right of window\r
+       bool bShowVScrollBar = (nVScrollPos > 0); // top of pic is above window\r
+       bShowVScrollBar      = bShowVScrollBar || (height-nVScrollPos+rect.top > rect.bottom); // bottom of pic is below window\r
+       bShowVScrollBar      = bShowVScrollBar || (height+nVScrollPos+rect.top > rect.bottom); // bottom of pic is below window\r
+\r
+       // if the image is smaller than the window, we don't need the scrollbars\r
+       ShowScrollBar(*this, SB_HORZ, bShowHScrollBar);\r
+       ShowScrollBar(*this, SB_VERT, bShowVScrollBar);\r
+\r
+       if (bShowVScrollBar)\r
+       {\r
+               si.nPos  = nVScrollPos;\r
+               si.nPage = rect.bottom-rect.top;\r
+               if (height < rect.bottom-rect.top)\r
+               {\r
+                       if (nVScrollPos > 0)\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = rect.bottom+nVScrollPos-rect.top;\r
+                       }\r
+                       else\r
+                       {\r
+                               si.nMin  = nVScrollPos;\r
+                               si.nMax  = int(height);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (nVScrollPos > 0)\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = int(max(height, rect.bottom+nVScrollPos-rect.top));\r
+                       }\r
+                       else\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = int(height-nVScrollPos);\r
+                       }\r
+               }\r
+               SetScrollInfo(*this, SB_VERT, &si, TRUE);\r
+       }\r
+\r
+       if (bShowHScrollBar)\r
+       {\r
+               si.nPos  = nHScrollPos;\r
+               si.nPage = rect.right-rect.left;\r
+               if (width < rect.right-rect.left)\r
+               {\r
+                       if (nHScrollPos > 0)\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = rect.right+nHScrollPos-rect.left;\r
+                       }\r
+                       else\r
+                       {\r
+                               si.nMin  = nHScrollPos;\r
+                               si.nMax  = int(width);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (nHScrollPos > 0)\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = int(max(width, rect.right+nHScrollPos-rect.left));\r
+                       }\r
+                       else\r
+                       {\r
+                               si.nMin  = 0;\r
+                               si.nMax  = int(width-nHScrollPos);\r
+                       }\r
+               }\r
+               SetScrollInfo(*this, SB_HORZ, &si, TRUE);\r
+       }\r
+\r
+       PositionChildren();\r
+}\r
+\r
+void CPicWindow::OnVScroll(UINT nSBCode, UINT nPos)\r
+{\r
+       RECT rect;\r
+       GetClientRect(&rect);\r
+\r
+       switch (nSBCode)\r
+       {\r
+       case SB_BOTTOM:\r
+               nVScrollPos = LONG(double(picture.GetHeight())*picscale);;\r
+               break;\r
+       case SB_TOP:\r
+               nVScrollPos = 0;\r
+               break;\r
+       case SB_LINEDOWN:\r
+               nVScrollPos++;\r
+               break;\r
+       case SB_LINEUP:\r
+               nVScrollPos--;\r
+               break;\r
+       case SB_PAGEDOWN:\r
+               nVScrollPos += (rect.bottom-rect.top);\r
+               break;\r
+       case SB_PAGEUP:\r
+               nVScrollPos -= (rect.bottom-rect.top);\r
+               break;\r
+       case SB_THUMBPOSITION:\r
+               nVScrollPos = nPos;\r
+               break;\r
+       case SB_THUMBTRACK:\r
+               nVScrollPos = nPos;\r
+               break;\r
+       default:\r
+               return;\r
+       }\r
+       LONG height = LONG(double(picture.GetHeight())*picscale);\r
+       if (pSecondPic)\r
+       {\r
+               height = max(height, LONG(double(pSecondPic->GetHeight())*picscale));\r
+       }\r
+       SetupScrollBars();\r
+       PositionChildren();\r
+       InvalidateRect(*this, NULL, TRUE);\r
+}\r
+\r
+void CPicWindow::OnHScroll(UINT nSBCode, UINT nPos)\r
+{\r
+       RECT rect;\r
+       GetClientRect(&rect);\r
+\r
+       switch (nSBCode)\r
+       {\r
+       case SB_RIGHT:\r
+               nHScrollPos = LONG(double(picture.GetWidth())*picscale);\r
+               break;\r
+       case SB_LEFT:\r
+               nHScrollPos = 0;\r
+               break;\r
+       case SB_LINERIGHT:\r
+               nHScrollPos++;\r
+               break;\r
+       case SB_LINELEFT:\r
+               nHScrollPos--;\r
+               break;\r
+       case SB_PAGERIGHT:\r
+               nHScrollPos += (rect.right-rect.left);\r
+               break;\r
+       case SB_PAGELEFT:\r
+               nHScrollPos -= (rect.right-rect.left);\r
+               break;\r
+       case SB_THUMBPOSITION:\r
+               nHScrollPos = nPos;\r
+               break;\r
+       case SB_THUMBTRACK:\r
+               nHScrollPos = nPos;\r
+               break;\r
+       default:\r
+               return;\r
+       }\r
+       LONG width = LONG(double(picture.GetWidth())*picscale);\r
+       if (pSecondPic)\r
+       {\r
+               width = max(width, LONG(double(pSecondPic->GetWidth())*picscale));\r
+       }\r
+       SetupScrollBars();\r
+       PositionChildren();\r
+       InvalidateRect(*this, NULL, TRUE);\r
+}\r
+\r
+void CPicWindow::OnMouseWheel(short fwKeys, short zDelta)\r
+{\r
+       RECT rect;\r
+       GetClientRect(&rect);\r
+       LONG width = long(double(picture.m_Width)*picscale);\r
+       LONG height = long(double(picture.m_Height)*picscale);\r
+       if (pSecondPic)\r
+       {\r
+               width = max(width, long(double(pSecondPic->m_Width)*picscale));\r
+               height = max(height, long(double(pSecondPic->m_Height)*picscale));\r
+       }\r
+       if ((fwKeys & MK_SHIFT)&&(fwKeys & MK_CONTROL)&&(pSecondPic))\r
+       {\r
+               // ctrl+shift+wheel: change the alpha channel\r
+               float a = blendAlpha;\r
+               a -= float(zDelta)/120.0f/4.0f;\r
+               if (a < 0.0f)\r
+                       a = 0.0f;\r
+               else if (a > 1.0f)\r
+                       a = 1.0f;\r
+               SetBlendAlpha(m_blend, a);\r
+       }\r
+       else if (fwKeys & MK_SHIFT)\r
+       {\r
+               // shift means scrolling sideways\r
+               OnHScroll(SB_THUMBPOSITION, GetHPos()-zDelta);\r
+               if ((bLinkedPositions)&&(pTheOtherPic))\r
+               {\r
+                       pTheOtherPic->OnHScroll(SB_THUMBPOSITION, pTheOtherPic->GetHPos()-zDelta);\r
+               }\r
+       }\r
+       else if (fwKeys & MK_CONTROL)\r
+       {\r
+               // control means adjusting the scale factor\r
+               Zoom(zDelta>0, true);\r
+               if ((!bFitSizes)&&(pTheOtherPic))\r
+                       pTheOtherPic->Zoom(zDelta>0, true);\r
+               PositionChildren();\r
+               InvalidateRect(*this, NULL, FALSE);\r
+               SetWindowPos(*this, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOREPOSITION|SWP_NOMOVE);\r
+       }\r
+       else\r
+       {\r
+               OnVScroll(SB_THUMBPOSITION, GetVPos()-zDelta);\r
+               if ((bLinkedPositions)&&(pTheOtherPic))\r
+               {\r
+                       pTheOtherPic->OnVScroll(SB_THUMBPOSITION, pTheOtherPic->GetVPos()-zDelta);\r
+               }\r
+       }\r
+}\r
+\r
+void CPicWindow::GetClientRect(RECT * pRect)\r
+{\r
+       ::GetClientRect(*this, pRect);\r
+       pRect->top += HEADER_HEIGHT;\r
+       if (HasMultipleImages())\r
+       {\r
+               pRect->top += HEADER_HEIGHT;\r
+       }\r
+       if (pSecondPic)\r
+               pRect->left += SLIDER_WIDTH;\r
+}\r
+\r
+void CPicWindow::GetClientRectWithScrollbars(RECT * pRect)\r
+{\r
+       GetClientRect(pRect);\r
+       ::GetWindowRect(*this, pRect);\r
+       pRect->right = pRect->right-pRect->left;\r
+       pRect->bottom = pRect->bottom-pRect->top;\r
+       pRect->top = 0;\r
+       pRect->left = 0;\r
+       pRect->top += HEADER_HEIGHT;\r
+       if (HasMultipleImages())\r
+       {\r
+               pRect->top += HEADER_HEIGHT;\r
+       }\r
+       if (pSecondPic)\r
+               pRect->left += SLIDER_WIDTH;\r
+};\r
+\r
+\r
+void CPicWindow::SetZoom(double dZoom, bool centermouse)\r
+{\r
+       // Set the interpolation mode depending on zoom\r
+       double oldPicscale = picscale;\r
+       if (dZoom < 1.0)\r
+       {       // Zoomed out, use high quality bicubic\r
+               picture.SetInterpolationMode(InterpolationModeHighQualityBicubic);\r
+               if (pSecondPic)\r
+                       pSecondPic->SetInterpolationMode(InterpolationModeHighQualityBicubic);\r
+       }\r
+       else if (!((int)(dZoom*100.0)%100))\r
+       {       // "Even" zoom sizes should be shown w-o any interpolation\r
+               picture.SetInterpolationMode(InterpolationModeNearestNeighbor);\r
+               if (pSecondPic)\r
+                       pSecondPic->SetInterpolationMode(InterpolationModeNearestNeighbor);\r
+       }\r
+       else\r
+       {       // Arbitrary zoomed in, use bilinear that is semi-smoothed\r
+               picture.SetInterpolationMode(InterpolationModeBilinear);\r
+               if (pSecondPic)\r
+                       pSecondPic->SetInterpolationMode(InterpolationModeBilinear);\r
+       }\r
+       picscale = dZoom;\r
+\r
+       if ((bFitSizes)&&(bMainPic))\r
+       {\r
+               double width, height;\r
+               double zoomWidth, zoomHeight;\r
+               width = double(picture.m_Width)*dZoom;\r
+               height = double(picture.m_Height)*dZoom;\r
+               zoomWidth = width/double(pTheOtherPic->GetPic()->m_Width);\r
+               zoomHeight = height/double(pTheOtherPic->GetPic()->m_Height);\r
+               pTheOtherPic->SetZoom(min(zoomWidth, zoomHeight), centermouse);\r
+       }\r
+\r
+       // adjust the scrollbar positions according to the new zoom and the\r
+       // mouse position: if possible, keep the pixel where the mouse pointer\r
+       // is at the same position after the zoom\r
+       POINT cpos;\r
+       DWORD ptW = GetMessagePos();\r
+       cpos.x = GET_X_LPARAM(ptW);\r
+       cpos.y = GET_Y_LPARAM(ptW);\r
+       ScreenToClient(*this, &cpos);\r
+       RECT clientrect;\r
+       GetClientRect(&clientrect);\r
+       if ((PtInRect(&clientrect, cpos))&&(centermouse))\r
+       {\r
+               // the mouse pointer is over our window\r
+               nHScrollPos = int(double(nHScrollPos + cpos.x)*(dZoom/oldPicscale))-cpos.x;\r
+               nVScrollPos = int(double(nVScrollPos + cpos.y)*(dZoom/oldPicscale))-cpos.y;\r
+       }\r
+       else\r
+       {\r
+               nHScrollPos = int(double(nHScrollPos + ((clientrect.right-clientrect.left)/2))*(dZoom/oldPicscale))-((clientrect.right-clientrect.left)/2);\r
+               nVScrollPos = int(double(nVScrollPos + ((clientrect.bottom-clientrect.top)/2))*(dZoom/oldPicscale))-((clientrect.bottom-clientrect.top)/2);\r
+       }\r
+\r
+       SetupScrollBars();\r
+       PositionChildren();\r
+       InvalidateRect(*this, NULL, TRUE);\r
+}\r
+\r
+void CPicWindow::Zoom(bool in, bool centermouse)\r
+{\r
+       double zoomFactor;\r
+\r
+       // Find correct zoom factor and quantize picscale\r
+       if (!in && picscale <= 0.2)\r
+       {\r
+               picscale = 0.1;\r
+               zoomFactor = 0;\r
+       }\r
+       else if ((in && picscale < 1.0) || (!in && picscale <= 1.0))\r
+       {\r
+               picscale = 0.1 * RoundDouble(picscale/0.1, 0);  // Quantize to 0.1\r
+               zoomFactor = 0.1;\r
+       }\r
+       else if ((in && picscale < 2.0) || (!in && picscale <= 2.0))\r
+       {\r
+               picscale = 0.25 * RoundDouble(picscale/0.25, 0);        // Quantize to 0.25\r
+               zoomFactor = 0.25;\r
+       }\r
+       else\r
+       {\r
+               picscale = RoundDouble(picscale,0);\r
+               zoomFactor = 1;\r
+       }\r
+\r
+       // Set zoom\r
+       if (in)\r
+       {\r
+               if ((pSecondPic)&&(!bFitSizes))\r
+                       pTheOtherPic->SetZoom(pTheOtherPic->GetZoom()+zoomFactor, false);\r
+               SetZoom(picscale+zoomFactor, centermouse);\r
+       }\r
+       else\r
+       {\r
+               if ((pSecondPic)&&(!bFitSizes))\r
+                       pTheOtherPic->SetZoom(pTheOtherPic->GetZoom()-zoomFactor, false);\r
+               SetZoom(picscale-zoomFactor, centermouse);\r
+       }\r
+}\r
+\r
+double CPicWindow::RoundDouble(double doValue, int nPrecision)\r
+{\r
+       static const double doBase = 10.0;\r
+       double doComplete5, doComplete5i;\r
+\r
+       doComplete5 = doValue * pow(doBase, (double) (nPrecision + 1));\r
+\r
+       if (doValue < 0.0)\r
+       {\r
+               doComplete5 -= 5.0;\r
+       }\r
+       else\r
+       {\r
+               doComplete5 += 5.0;\r
+       }\r
+\r
+       doComplete5 /= doBase;\r
+       modf(doComplete5, &doComplete5i);\r
+\r
+       return doComplete5i / pow(doBase, (double) nPrecision);\r
+}\r
+void CPicWindow::FitImageInWindow()\r
+{\r
+       RECT rect;\r
+       double dZoom = 1.0;\r
+\r
+       GetClientRectWithScrollbars(&rect);\r
+\r
+       if (rect.right-rect.left)\r
+       {\r
+               if (((rect.right - rect.left) > picture.m_Width+2)&&((rect.bottom - rect.top)> picture.m_Height+2))\r
+               {\r
+                       // image is smaller than the window\r
+                       dZoom = 1.0;\r
+               }\r
+               else\r
+               {\r
+                       // image is bigger than the window\r
+                       double xscale = double(rect.right-rect.left-2)/double(picture.m_Width);\r
+                       double yscale = double(rect.bottom-rect.top-2)/double(picture.m_Height);\r
+                       dZoom = min(yscale, xscale);\r
+               }\r
+               if (pSecondPic)\r
+               {\r
+                       if (((rect.right - rect.left) > pSecondPic->m_Width+2)&&((rect.bottom - rect.top)> pSecondPic->m_Height+2))\r
+                       {\r
+                               // image is smaller than the window\r
+                               pTheOtherPic->SetZoom(min(1.0, dZoom), false);\r
+                       }\r
+                       else\r
+                       {\r
+                               // image is bigger than the window\r
+                               double xscale = double(rect.right-rect.left-2)/double(pSecondPic->m_Width);\r
+                               double yscale = double(rect.bottom-rect.top-2)/double(pSecondPic->m_Height);\r
+                               pTheOtherPic->SetZoom(min(yscale, xscale), false);\r
+                       }\r
+                       nHSecondScrollPos = 0;\r
+                       nVSecondScrollPos = 0;\r
+               }\r
+               SetZoom(dZoom, false);\r
+       }\r
+       CenterImage();\r
+       PositionChildren();\r
+       InvalidateRect(*this, NULL, TRUE);\r
+}\r
+\r
+void CPicWindow::CenterImage()\r
+{\r
+       RECT rect;\r
+       GetClientRectWithScrollbars(&rect);\r
+       double width = (double(picture.m_Width)*picscale) + 2.0;\r
+       double height = (double(picture.m_Height)*picscale) + 2.0;\r
+       if (pSecondPic)\r
+       {\r
+               width = max(width, (double(pSecondPic->m_Width)*pTheOtherPic->GetZoom()) + 2.0);\r
+               height = max(height, (double(pSecondPic->m_Height)*pTheOtherPic->GetZoom()) + 2.0);\r
+       }\r
+\r
+       bool bPicWidthBigger = (int(width) > (rect.right-rect.left));\r
+       bool bPicHeightBigger = (int(height) > (rect.bottom-rect.top));\r
+       // set the scroll position so that the image is drawn centered in the window\r
+       // if the window is bigger than the image\r
+       if (!bPicWidthBigger)\r
+       {\r
+               nHScrollPos = -((rect.right-rect.left+4)-int(width))/2;\r
+       }\r
+       if (!bPicHeightBigger)\r
+       {\r
+               nVScrollPos = -((rect.bottom-rect.top+4)-int(height))/2;\r
+       }\r
+       SetupScrollBars();\r
+}\r
+\r
+void CPicWindow::FitSizes(bool bFit)\r
+{\r
+       bFitSizes = bFit;\r
+\r
+       if (bFitSizes)\r
+       {\r
+               nHSecondScrollPos = 0;\r
+               nVSecondScrollPos = 0;\r
+       }\r
+       SetZoom(GetZoom(), false);\r
+}\r
+\r
+void CPicWindow::ShowPicWithBorder(HDC hdc, const RECT &bounds, CPicture &pic, double scale)\r
+{\r
+       ::SetBkColor(hdc, transparentColor);\r
+       ::ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &bounds, NULL, 0, NULL);\r
+\r
+       RECT picrect;\r
+       picrect.left =  bounds.left - nHScrollPos;\r
+       picrect.top = bounds.top - nVScrollPos;\r
+       if (!bLinkedPositions && (pTheOtherPic) && (&pic != &picture))\r
+       {\r
+               picrect.left = bounds.left - nHSecondScrollPos;\r
+               picrect.top  = bounds.top - nVSecondScrollPos;\r
+       }\r
+       picrect.right = (picrect.left + LONG(double(pic.m_Width) * scale));\r
+       picrect.bottom = (picrect.top + LONG(double(pic.m_Height) * scale));\r
+\r
+       pic.Show(hdc, picrect);\r
+\r
+       RECT border;\r
+       border.left = picrect.left-1;\r
+       border.top = picrect.top-1;\r
+       border.right = picrect.right+1;\r
+       border.bottom = picrect.bottom+1;\r
+\r
+       HPEN hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DDKSHADOW));\r
+       HPEN hOldPen = (HPEN)SelectObject(hdc, hPen);\r
+       MoveToEx(hdc, border.left, border.top, NULL);\r
+       LineTo(hdc, border.left, border.bottom);\r
+       LineTo(hdc, border.right, border.bottom);\r
+       LineTo(hdc, border.right, border.top);\r
+       LineTo(hdc, border.left, border.top);\r
+       SelectObject(hdc, hOldPen);\r
+       DeleteObject(hPen);\r
+}\r
+\r
+void CPicWindow::Paint(HWND hwnd)\r
+{\r
+       PAINTSTRUCT ps;\r
+       HDC hdc;\r
+       RECT rect, fullrect;\r
+\r
+       GetUpdateRect(hwnd, &rect, FALSE);\r
+       if (IsRectEmpty(&rect))\r
+               return;\r
+\r
+       ::GetClientRect(*this, &fullrect);\r
+       hdc = BeginPaint(hwnd, &ps);\r
+       {\r
+               // Exclude the alpha control and button\r
+               if ((pSecondPic)&&(m_blend == BLEND_ALPHA))\r
+                       ExcludeClipRect(hdc, 0, m_inforect.top-4, SLIDER_WIDTH, m_inforect.bottom+4);\r
+\r
+               CMyMemDC memDC(hdc);\r
+               if ((pSecondPic)&&(m_blend != BLEND_ALPHA))\r
+               {\r
+                       // erase the place where the alpha slider would be\r
+                       ::SetBkColor(memDC, transparentColor);\r
+                       RECT bounds = {0, m_inforect.top-4, SLIDER_WIDTH, m_inforect.bottom+4};\r
+                       ::ExtTextOut(memDC, 0, 0, ETO_OPAQUE, &bounds, NULL, 0, NULL);\r
+               }\r
+\r
+               GetClientRect(&rect);\r
+               if (bValid)\r
+               {\r
+                       ShowPicWithBorder(memDC, rect, picture, picscale);\r
+                       if (pSecondPic)\r
+                       {\r
+                               HDC secondhdc = CreateCompatibleDC(hdc);\r
+                               HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);\r
+                               HBITMAP hOldBitmap = (HBITMAP)SelectObject(secondhdc, hBitmap);\r
+                               SetWindowOrgEx(secondhdc, rect.left, rect.top, NULL);\r
+\r
+                               if ((pSecondPic)&&(m_blend != BLEND_ALPHA))\r
+                               {\r
+                                       // erase the place where the alpha slider would be\r
+                                       ::SetBkColor(secondhdc, transparentColor);\r
+                                       RECT bounds = {0, m_inforect.top-4, SLIDER_WIDTH, m_inforect.bottom+4};\r
+                                       ::ExtTextOut(secondhdc, 0, 0, ETO_OPAQUE, &bounds, NULL, 0, NULL);\r
+                               }\r
+                               ShowPicWithBorder(secondhdc, rect, *pSecondPic, pTheOtherPic->GetZoom());\r
+\r
+                               if (m_blend == BLEND_ALPHA)\r
+                               {\r
+                                       BLENDFUNCTION blender;\r
+                                       blender.AlphaFormat = 0;\r
+                                       blender.BlendFlags = 0;\r
+                                       blender.BlendOp = AC_SRC_OVER;\r
+                                       blender.SourceConstantAlpha = (BYTE)(blendAlpha*255);\r
+                                       AlphaBlend(memDC, \r
+                                               rect.left,\r
+                                               rect.top,\r
+                                               rect.right-rect.left,\r
+                                               rect.bottom-rect.top,\r
+                                               secondhdc,\r
+                                               rect.left,\r
+                                               rect.top,\r
+                                               rect.right-rect.left,\r
+                                               rect.bottom-rect.top,\r
+                                               blender);\r
+                               }\r
+                               else if (m_blend == BLEND_XOR)\r
+                               {\r
+                                       BitBlt(memDC, \r
+                                               rect.left,\r
+                                               rect.top,\r
+                                               rect.right-rect.left,\r
+                                               rect.bottom-rect.top,\r
+                                               secondhdc,\r
+                                               rect.left,\r
+                                               rect.top,\r
+                                               //rect.right-rect.left,\r
+                                               //rect.bottom-rect.top,\r
+                                               SRCINVERT);\r
+                                       InvertRect(memDC, &rect);\r
+                               }\r
+                               SelectObject(secondhdc, hOldBitmap);\r
+                               DeleteObject(hBitmap);\r
+                               DeleteDC(secondhdc);\r
+                       }\r
+                       int sliderwidth = 0;\r
+                       if ((pSecondPic)&&(m_blend == BLEND_ALPHA))\r
+                               sliderwidth = SLIDER_WIDTH;\r
+                       m_inforect.left = rect.left+4+sliderwidth;\r
+                       m_inforect.top = rect.top;\r
+                       m_inforect.right = rect.right+sliderwidth;\r
+                       m_inforect.bottom = rect.bottom;\r
+\r
+                       SetBkColor(memDC, transparentColor);\r
+                       if (bShowInfo)\r
+                       {\r
+                               TCHAR infostring[8192];\r
+                               BuildInfoString(infostring, sizeof(infostring)/sizeof(TCHAR), false);\r
+                               // set the font\r
+                               NONCLIENTMETRICS metrics = {0};\r
+                               metrics.cbSize = sizeof(NONCLIENTMETRICS);\r
+                               SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &metrics, FALSE);\r
+                               HFONT hFont = CreateFontIndirect(&metrics.lfStatusFont);\r
+                               HFONT hFontOld = (HFONT)SelectObject(memDC, (HGDIOBJ)hFont);\r
+                               // find out how big the rectangle for the text has to be\r
+                               DrawText(memDC, infostring, -1, &m_inforect, DT_EDITCONTROL | DT_EXPANDTABS | DT_LEFT | DT_VCENTER | DT_CALCRECT);\r
+\r
+                               // the text should be drawn with a four pixel offset to the window borders\r
+                               m_inforect.top = rect.bottom - (m_inforect.bottom-m_inforect.top) - 4;\r
+                               m_inforect.bottom = rect.bottom-4;\r
+\r
+                               // first draw an edge rectangle\r
+                               RECT edgerect;\r
+                               edgerect.left = m_inforect.left-4;\r
+                               edgerect.top = m_inforect.top-4;\r
+                               edgerect.right = m_inforect.right+4;\r
+                               edgerect.bottom = m_inforect.bottom+4;\r
+                               ::ExtTextOut(memDC, 0, 0, ETO_OPAQUE, &edgerect, NULL, 0, NULL);\r
+                               DrawEdge(memDC, &edgerect, EDGE_BUMP, BF_RECT | BF_SOFT);\r
+\r
+                               SetTextColor(memDC, GetSysColor(COLOR_WINDOWTEXT));\r
+                               DrawText(memDC, infostring, -1, &m_inforect, DT_EDITCONTROL | DT_EXPANDTABS | DT_LEFT | DT_VCENTER);\r
+                               SelectObject(memDC, (HGDIOBJ)hFontOld);\r
+                               DeleteObject(hFont);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       SetBkColor(memDC, ::GetSysColor(COLOR_WINDOW));\r
+                       ::ExtTextOut(memDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);\r
+                       SIZE stringsize;\r
+                       ResString str = ResString(hResource, IDS_INVALIDIMAGEINFO);\r
+                       if (GetTextExtentPoint32(memDC, str, (int)_tcslen(str), &stringsize))\r
+                       {\r
+                               int nStringLength = stringsize.cx;\r
+\r
+                               ExtTextOut(memDC, \r
+                                       max(rect.left + ((rect.right-rect.left)-nStringLength)/2, 1),\r
+                                       rect.top + ((rect.bottom-rect.top) - stringsize.cy)/2,\r
+                                       ETO_CLIPPED,\r
+                                       &rect,\r
+                                       str,\r
+                                       (UINT)_tcslen(str),\r
+                                       NULL);\r
+                       }\r
+               }\r
+               DrawViewTitle(memDC, &fullrect);\r
+       }\r
+       EndPaint(hwnd, &ps);\r
+}\r
+\r
+bool CPicWindow::CreateButtons()\r
+{\r
+       // Ensure that the common control DLL is loaded. \r
+       INITCOMMONCONTROLSEX icex;\r
+       icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\r
+       icex.dwICC  = ICC_BAR_CLASSES | ICC_WIN95_CLASSES;\r
+       InitCommonControlsEx(&icex);\r
+\r
+       hwndLeftBtn = CreateWindowEx(0, \r
+                                                               _T("BUTTON"), \r
+                                                               (LPCTSTR)NULL,\r
+                                                               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON | BS_FLAT, \r
+                                                               0, 0, 0, 0, \r
+                                                               (HWND)*this,\r
+                                                               (HMENU)LEFTBUTTON_ID,\r
+                                                               hResource, \r
+                                                               NULL);\r
+       if (hwndLeftBtn == INVALID_HANDLE_VALUE)\r
+               return false;\r
+       hLeft = (HICON)LoadImage(hResource, MAKEINTRESOURCE(IDI_BACKWARD), IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT);\r
+       SendMessage(hwndLeftBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hLeft);\r
+       hwndRightBtn = CreateWindowEx(0, \r
+                                                               _T("BUTTON"), \r
+                                                               (LPCTSTR)NULL,\r
+                                                               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON | BS_FLAT, \r
+                                                               0, 0, 0, 0, \r
+                                                               *this,\r
+                                                               (HMENU)RIGHTBUTTON_ID,\r
+                                                               hResource, \r
+                                                               NULL);\r
+       if (hwndRightBtn == INVALID_HANDLE_VALUE)\r
+               return false;\r
+       hRight = (HICON)LoadImage(hResource, MAKEINTRESOURCE(IDI_FORWARD), IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT);\r
+       SendMessage(hwndRightBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hRight);\r
+       hwndPlayBtn = CreateWindowEx(0, \r
+                                                               _T("BUTTON"), \r
+                                                               (LPCTSTR)NULL,\r
+                                                               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON | BS_FLAT, \r
+                                                               0, 0, 0, 0, \r
+                                                               *this,\r
+                                                               (HMENU)PLAYBUTTON_ID,\r
+                                                               hResource, \r
+                                                               NULL);\r
+       if (hwndPlayBtn == INVALID_HANDLE_VALUE)\r
+               return false;\r
+       hPlay = (HICON)LoadImage(hResource, MAKEINTRESOURCE(IDI_START), IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT);\r
+       hStop = (HICON)LoadImage(hResource, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT);\r
+       SendMessage(hwndPlayBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hPlay);\r
+       hwndAlphaToggleBtn = CreateWindowEx(0, \r
+                                                               _T("BUTTON"), \r
+                                                               (LPCTSTR)NULL,\r
+                                                               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_ICON | BS_FLAT | BS_NOTIFY | BS_PUSHLIKE, \r
+                                                               0, 0, 0, 0, \r
+                                                               (HWND)*this,\r
+                                                               (HMENU)ALPHATOGGLEBUTTON_ID,\r
+                                                               hResource, \r
+                                                               NULL);\r
+       if (hwndAlphaToggleBtn == INVALID_HANDLE_VALUE)\r
+               return false;\r
+       hAlphaToggle = (HICON)LoadImage(hResource, MAKEINTRESOURCE(IDI_ALPHATOGGLE), IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT);\r
+       SendMessage(hwndAlphaToggleBtn, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hAlphaToggle);\r
+\r
+       return true;\r
+}\r
+\r
+void CPicWindow::PositionChildren()\r
+{\r
+       RECT rect;\r
+       ::GetClientRect(*this, &rect);\r
+       if (HasMultipleImages())\r
+       {\r
+               SetWindowPos(hwndLeftBtn, HWND_TOP, rect.left+3, rect.top + HEADER_HEIGHT + (HEADER_HEIGHT-16)/2, 16, 16, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+               SetWindowPos(hwndRightBtn, HWND_TOP, rect.left+23, rect.top + HEADER_HEIGHT + (HEADER_HEIGHT-16)/2, 16, 16, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+               if (nFrames > 1)\r
+                       SetWindowPos(hwndPlayBtn, HWND_TOP, rect.left+43, rect.top + HEADER_HEIGHT + (HEADER_HEIGHT-16)/2, 16, 16, SWP_FRAMECHANGED|SWP_SHOWWINDOW);\r
+               else\r
+                       ShowWindow(hwndPlayBtn, SW_HIDE);\r
+       }\r
+       else\r
+       {\r
+               ShowWindow(hwndLeftBtn, SW_HIDE);\r
+               ShowWindow(hwndRightBtn, SW_HIDE);\r
+               ShowWindow(hwndPlayBtn, SW_HIDE);\r
+       }\r
+       PositionTrackBar();\r
+}\r
+\r
+bool CPicWindow::HasMultipleImages()\r
+{\r
+       return (((nDimensions > 1)||(nFrames > 1))&&(pSecondPic == NULL));\r
+}\r
+\r
+void CPicWindow::CreateTrackbar(HWND hwndParent)\r
+{ \r
+       HWND hwndTrack = CreateWindowEx( \r
+               0,                                                                      // no extended styles \r
+               TRACKBAR_CLASS,                                         // class name \r
+               _T("Trackbar Control"),                         // title (caption) \r
+               WS_CHILD | WS_VISIBLE | TBS_VERT | TBS_TOOLTIPS | TBS_AUTOTICKS,                                // style \r
+               10, 10,                                                         // position \r
+               200, 30,                                                        // size \r
+               hwndParent,                                                     // parent window \r
+               (HMENU)TRACKBAR_ID,                                     // control identifier \r
+               hInst,                                                          // instance \r
+               NULL                                                            // no WM_CREATE parameter \r
+               );\r
+\r
+       SendMessage(hwndTrack, TBM_SETRANGE, \r
+               (WPARAM) TRUE,                                  // redraw flag \r
+               (LPARAM) MAKELONG(0, 16));              // min. & max. positions \r
+       SendMessage(hwndTrack, TBM_SETTIPSIDE, \r
+               (WPARAM) TBTS_TOP,\r
+               (LPARAM) 0);\r
+\r
+       m_AlphaSlider.ConvertTrackbarToNice(hwndTrack);\r
+}\r
+\r
+void CPicWindow::BuildInfoString(TCHAR * buf, int size, bool bTooltip)\r
+{\r
+       // Unfortunately, we need two different strings for the tooltip\r
+       // and the info box. Because the tooltips use a different tab size\r
+       // than ExtTextOut(), and to keep the output aligned we therefore\r
+       // need two different strings.\r
+       // Note: some translations could end up with two identical strings, but\r
+       // in English we need two - even if we wouldn't need two in English, some\r
+       // translation might then need two again.\r
+       if (pSecondPic)\r
+       {\r
+               _stprintf_s(buf, size, \r
+                       (TCHAR const *)ResString(hResource, bTooltip ? IDS_DUALIMAGEINFOTT : IDS_DUALIMAGEINFO),\r
+                       picture.GetFileSizeAsText().c_str(), picture.GetFileSizeAsText(false).c_str(),\r
+                       picture.m_Width, picture.m_Height,\r
+                       picture.GetHorizontalResolution(), picture.GetVerticalResolution(),\r
+                       picture.m_ColorDepth,\r
+                       (UINT)(GetZoom()*100.0),\r
+                       pSecondPic->GetFileSizeAsText().c_str(), pSecondPic->GetFileSizeAsText(false).c_str(),\r
+                       pSecondPic->m_Width, pSecondPic->m_Height,\r
+                       pSecondPic->GetHorizontalResolution(), pSecondPic->GetVerticalResolution(),\r
+                       pSecondPic->m_ColorDepth,\r
+                       (UINT)(pTheOtherPic->GetZoom()*100.0));\r
+       }\r
+       else\r
+       {\r
+               _stprintf_s(buf, size, \r
+                       (TCHAR const *)ResString(hResource, bTooltip ? IDS_IMAGEINFOTT : IDS_IMAGEINFO),\r
+                       picture.GetFileSizeAsText().c_str(), picture.GetFileSizeAsText(false).c_str(),\r
+                       picture.m_Width, picture.m_Height,\r
+                       picture.GetHorizontalResolution(), picture.GetVerticalResolution(),\r
+                       picture.m_ColorDepth,\r
+                       (UINT)(GetZoom()*100.0));\r
+       }\r
+}\r
diff --git a/src/TortoiseIDiff/PicWindow.h b/src/TortoiseIDiff/PicWindow.h
new file mode 100644 (file)
index 0000000..cbb0880
--- /dev/null
@@ -0,0 +1,254 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006-2009 - TortoiseSVN\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+#include "commctrl.h"\r
+#include "BaseWindow.h"\r
+#include "TortoiseIDiff.h"\r
+#include "Picture.h"\r
+#include "NiceTrackbar.h"\r
+\r
+#define HEADER_HEIGHT 30\r
+\r
+#define ID_ANIMATIONTIMER 100\r
+#define TIMER_ALPHASLIDER 101\r
+#define ID_ALPHATOGGLETIMER 102\r
+\r
+#define LEFTBUTTON_ID                  101\r
+#define RIGHTBUTTON_ID                 102\r
+#define PLAYBUTTON_ID                  103\r
+#define ALPHATOGGLEBUTTON_ID   104\r
+#define BLENDALPHA_ID                  105\r
+#define BLENDXOR_ID                            106\r
+\r
+#define TRACKBAR_ID 101\r
+#define SLIDER_HEIGHT 30\r
+#define SLIDER_WIDTH 30\r
+\r
+\r
+#ifndef GET_X_LPARAM\r
+#define GET_X_LPARAM(lp)                        ((int)(short)LOWORD(lp))\r
+#endif\r
+#ifndef GET_Y_LPARAM\r
+#define GET_Y_LPARAM(lp)                        ((int)(short)HIWORD(lp))\r
+#endif\r
+\r
+/**\r
+ * \ingroup TortoiseIDiff\r
+ * The image view window.\r
+ * Shows an image and provides methods to scale the image or alpha blend it\r
+ * over another image.\r
+ */\r
+class CPicWindow : public CWindow\r
+{\r
+public:\r
+       CPicWindow(HINSTANCE hInst, const WNDCLASSEX* wcx = NULL) : CWindow(hInst, wcx)\r
+               , bValid(false)\r
+               , nHScrollPos(0)\r
+               , nVScrollPos(0)\r
+               , picscale(1.0)\r
+               , transparentColor(::GetSysColor(COLOR_WINDOW))\r
+               , pSecondPic(NULL)\r
+               , blendAlpha(0.5f)\r
+               , bShowInfo(false)\r
+               , nDimensions(0)\r
+               , nCurrentDimension(1)\r
+               , nFrames(0)\r
+               , nCurrentFrame(1)\r
+               , bPlaying(false)\r
+               , pTheOtherPic(NULL)\r
+               , bLinkedPositions(true)\r
+               , bFitSizes(false)\r
+               , m_blend(BLEND_ALPHA)\r
+               , bMainPic(false)\r
+       { \r
+               SetWindowTitle(_T("Picture Window"));\r
+               m_lastTTPos.x = 0;\r
+               m_lastTTPos.y = 0;\r
+       };\r
+\r
+       enum BlendType\r
+       {\r
+               BLEND_ALPHA,\r
+               BLEND_XOR,\r
+       };\r
+       /// Registers the window class and creates the window\r
+       bool RegisterAndCreateWindow(HWND hParent);\r
+\r
+       /// Sets the image path and title to show\r
+       void SetPic(tstring path, tstring title, bool bFirst);\r
+       /// Returns the CPicture image object. Used to get an already loaded image\r
+       /// object without having to load it again.\r
+       CPicture * GetPic() {return &picture;}\r
+       /// Sets the path and title of the second image which is alpha blended over the original\r
+       void SetSecondPic(CPicture * pPicture = NULL, const tstring& sectit = _T(""), const tstring& secpath = _T(""), int hpos = 0, int vpos = 0)\r
+       {\r
+               pSecondPic = pPicture;\r
+               pictitle2 = sectit;\r
+               picpath2 = secpath;\r
+               nVSecondScrollPos = vpos;\r
+               nHSecondScrollPos = hpos;\r
+       }\r
+\r
+       void StopTimer() {KillTimer(*this, ID_ANIMATIONTIMER);}\r
+       \r
+       /// Returns the currently used alpha blending value (0.0-1.0)\r
+       float GetBlendAlpha() const { return blendAlpha; }\r
+       /// Sets the alpha blending value\r
+       void SetBlendAlpha(BlendType type, float a) \r
+       {\r
+               m_blend = type;\r
+               blendAlpha = a;\r
+               if (m_AlphaSlider.IsValid())\r
+                       SendMessage(m_AlphaSlider.GetWindow(), TBM_SETPOS, (WPARAM)1, (LPARAM)(a*16.0f));\r
+               PositionTrackBar();\r
+               InvalidateRect(*this, NULL, FALSE);\r
+       }\r
+       /// Toggle the alpha blending value\r
+       void ToggleAlpha()\r
+       {\r
+               if( 0.0f != GetBlendAlpha() )\r
+                       SetBlendAlpha(m_blend, 0.0f);\r
+               else\r
+                       SetBlendAlpha(m_blend, 1.0f);\r
+       }\r
+\r
+       /// Set the color that this PicWindow will display behind transparent images.\r
+       void SetTransparentColor(COLORREF back) { transparentColor = back; InvalidateRect(*this, NULL, false); }\r
+\r
+       /// Resizes the image to fit into the window. Small images are not enlarged.\r
+       void FitImageInWindow();\r
+       /// center the image in the view\r
+       void CenterImage();\r
+       /// Makes both images the same size, fitting into the window\r
+       void FitSizes(bool bFit);\r
+       /// Sets the zoom factor of the image\r
+       void SetZoom(double dZoom, bool centermouse);\r
+       /// Returns the currently used zoom factor in which the image is shown.\r
+       double GetZoom() {return picscale;}\r
+       /// Zooms in (true) or out (false) in nice steps\r
+       void Zoom(bool in, bool centermouse);\r
+       /// Sets the 'Other' pic window\r
+       void SetOtherPicWindow(CPicWindow * pWnd) {pTheOtherPic = pWnd;}\r
+       /// Links/Unlinks the two pic windows\r
+       void LinkPositions(bool bLink) {bLinkedPositions = bLink;}\r
+\r
+       void ShowInfo(bool bShow = true) {bShowInfo = bShow; InvalidateRect(*this, NULL, false);}\r
+       /// Sets up the scrollbars as needed\r
+       void SetupScrollBars();\r
+\r
+       bool HasMultipleImages();\r
+\r
+       int GetHPos() {return nHScrollPos;}\r
+       int GetVPos() {return nVScrollPos;}\r
+       void SetZoomValue(double z) {picscale = z; InvalidateRect(*this, NULL, FALSE);}\r
+\r
+       /// Handles the mouse wheel\r
+       void                            OnMouseWheel(short fwKeys, short zDelta);\r
+protected:\r
+       /// the message handler for this window\r
+       LRESULT CALLBACK        WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r
+       /// Draws the view title bar\r
+       void                            DrawViewTitle(HDC hDC, RECT * rect);\r
+       /// Creates the image buttons\r
+       bool                            CreateButtons();\r
+       /// Handles vertical scrolling\r
+       void                            OnVScroll(UINT nSBCode, UINT nPos);\r
+       /// Handles horizontal scrolling\r
+       void                            OnHScroll(UINT nSBCode, UINT nPos);\r
+       /// Returns the client rectangle, without the scrollbars and the view title.\r
+       /// Basically the rectangle the image can use.\r
+       void                            GetClientRect(RECT * pRect);\r
+       /// Returns the client rectangle, without the view title but with the scrollbars\r
+       void                            GetClientRectWithScrollbars(RECT * pRect);\r
+       /// the WM_PAINT function\r
+       void                            Paint(HWND hwnd);\r
+       /// Draw pic to hdc, with a border, scaled by scale.\r
+       void                            ShowPicWithBorder(HDC hdc, const RECT &bounds, CPicture &pic, double scale);\r
+       /// Positions the buttons\r
+       void                            PositionChildren();\r
+       /// Rounds a double to a given precision\r
+       double                          RoundDouble(double doValue, int nPrecision);\r
+       /// advance to the next image in the file\r
+       void                            NextImage();\r
+       /// go back to the previous image in the file\r
+       void                            PrevImage();\r
+       /// starts/stops the animation\r
+       void                            Animate(bool bStart);\r
+       /// Creates the trackbar (the alpha blending slider control)\r
+       void                            CreateTrackbar(HWND hwndParent);\r
+       /// Moves the alpha slider trackbar to the correct position\r
+       void                            PositionTrackBar();\r
+       /// creates the info string used in the info box and the tooltips\r
+       void                            BuildInfoString(TCHAR * buf, int size, bool bTooltip);\r
+\r
+       tstring                 picpath;                        ///< the path to the image we show\r
+       tstring                 pictitle;                       ///< the string to show in the image view as a title\r
+       CPicture                        picture;                        ///< the picture object of the image\r
+       bool                            bValid;                         ///< true if the picture object is valid, i.e. if the image could be loaded and can be shown\r
+       double                          picscale;                       ///< the scale factor of the image\r
+       COLORREF                        transparentColor;       ///< the color to draw under the images\r
+       bool                            bFirstpaint;            ///< true if the image is painted the first time. Used to initialize some stuff when the window is valid for sure.\r
+       CPicture *                      pSecondPic;                     ///< if set, this is the picture to draw transparently above the original\r
+       CPicWindow *            pTheOtherPic;           ///< pointer to the other picture window. Used for "linking" the two windows when scrolling/zooming/...\r
+       bool                            bMainPic;                       ///< if true, this is the first image\r
+       bool                            bLinkedPositions;       ///< if true, the two image windows are linked together for scrolling/zooming/...\r
+       bool                            bFitSizes;              ///< if true, the two image windows are always zoomed so they match their size\r
+       BlendType                       m_blend;                        ///< type of blending to use\r
+       tstring                         pictitle2;                      ///< the title of the second picture\r
+       tstring                         picpath2;                       ///< the path of the second picture\r
+       float                           blendAlpha;                     ///<the alpha value for transparency blending\r
+       bool                            bShowInfo;                      ///< true if the info rectangle of the image should be shown\r
+       TCHAR                           m_wszTip[8192];\r
+       char                            m_szTip[8192];\r
+       POINT                           m_lastTTPos;\r
+       HWND                            hwndTT;\r
+       // scrollbar info\r
+       int                                     nVScrollPos;            ///< vertical scroll position\r
+       int                                     nHScrollPos;            ///< horizontal scroll position\r
+       int                                     nVSecondScrollPos;      ///< vertical scroll position of second pic at the moment of enabling overlap mode\r
+       int                                     nHSecondScrollPos;      ///< horizontal scroll position of second pic at the moment of enabling overlap mode\r
+       POINT                           ptPanStart;                     ///< the point of the last mouse click\r
+       int                                     startVScrollPos;        ///< the vertical scroll position when panning starts\r
+       int                                     startHScrollPos;        ///< the horizontal scroll position when panning starts\r
+       int                                     startVSecondScrollPos;  ///< the vertical scroll position of the second pic when panning starts\r
+       int                                     startHSecondScrollPos;  ///< the horizontal scroll position of the second pic when panning starts\r
+       // image frames/dimensions\r
+       UINT                            nDimensions;\r
+       UINT                            nCurrentDimension;\r
+       UINT                            nFrames;\r
+       UINT                            nCurrentFrame;\r
+\r
+       // controls\r
+       HWND                            hwndLeftBtn;\r
+       HWND                            hwndRightBtn;\r
+       HWND                            hwndPlayBtn;\r
+       CNiceTrackbar           m_AlphaSlider;\r
+       HWND                            hwndAlphaToggleBtn;\r
+       HICON                           hLeft;\r
+       HICON                           hRight;\r
+       HICON                           hPlay;\r
+       HICON                           hStop;\r
+       HICON                           hAlphaToggle;\r
+       bool                            bPlaying;\r
+       RECT                            m_inforect;\r
+};\r
+\r
+\r
+\r
+\r
diff --git a/src/TortoiseIDiff/TortoiseIDiff.cpp b/src/TortoiseIDiff/TortoiseIDiff.cpp
new file mode 100644 (file)
index 0000000..34d2013
--- /dev/null
@@ -0,0 +1,122 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006 - 2007 - Stefan Kueng\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "stdafx.h"\r
+#include "MainWindow.h"\r
+#include "CmdLineParser.h"\r
+#include "registry.h"\r
+#include "LangDll.h"\r
+#include "TortoiseIDiff.h"\r
+\r
+#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")\r
+\r
+// Global Variables:\r
+HINSTANCE hInst;                                                               // current instance\r
+HINSTANCE hResource;                                                   // the resource dll\r
+HCURSOR   curHand;\r
+HCURSOR   curHandDown;\r
+\r
+int APIENTRY _tWinMain(HINSTANCE hInstance,\r
+                     HINSTANCE hPrevInstance,\r
+                     LPTSTR    lpCmdLine,\r
+                     int       nCmdShow)\r
+{\r
+       UNREFERENCED_PARAMETER(hPrevInstance);\r
+\r
+       CRegStdDWORD loc = CRegStdDWORD(_T("Software\\TortoiseSVN\\LanguageID"), 1033);\r
+       long langId = loc;\r
+\r
+       CLangDll langDLL;\r
+       hResource = langDLL.Init(_T("TortoiseIDiff"), langId);\r
+       if (hResource == NULL)\r
+               hResource = hInstance;\r
+\r
+       CCmdLineParser parser(lpCmdLine);\r
+\r
+       if (parser.HasKey(_T("?")) || parser.HasKey(_T("help")))\r
+       {\r
+               TCHAR buf[1024];\r
+               LoadString(hResource, IDS_COMMANDLINEHELP, buf, sizeof(buf)/sizeof(TCHAR));\r
+               MessageBox(NULL, buf, _T("TortoiseIDiff"), MB_ICONINFORMATION);\r
+               langDLL.Close();\r
+               return 0;\r
+       }\r
+\r
+\r
+       MSG msg;\r
+       HACCEL hAccelTable;\r
+\r
+       hInst = hInstance;\r
+\r
+       INITCOMMONCONTROLSEX used = {\r
+               sizeof(INITCOMMONCONTROLSEX),\r
+               ICC_STANDARD_CLASSES | ICC_BAR_CLASSES | ICC_WIN95_CLASSES\r
+       };\r
+       InitCommonControlsEx(&used);\r
+\r
+       // load the cursors we need\r
+       curHand = (HCURSOR)LoadImage(hInst, MAKEINTRESOURCE(IDC_PANCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);\r
+       curHandDown = (HCURSOR)LoadImage(hInst, MAKEINTRESOURCE(IDC_PANDOWNCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);\r
+\r
+       CMainWindow mainWindow(hResource);\r
+\r
+\r
+       mainWindow.SetLeft(parser.HasVal(_T("left")) ? parser.GetVal(_T("left")) : _T(""), parser.HasVal(_T("lefttitle")) ? parser.GetVal(_T("lefttitle")) : _T(""));\r
+       mainWindow.SetRight(parser.HasVal(_T("right")) ? parser.GetVal(_T("right")) : _T(""), parser.HasVal(_T("righttitle")) ? parser.GetVal(_T("righttitle")) : _T(""));\r
+       if (mainWindow.RegisterAndCreateWindow())\r
+       {\r
+               hAccelTable = LoadAccelerators(hResource, MAKEINTRESOURCE(IDR_TORTOISEIDIFF));\r
+               if (!parser.HasVal(_T("left")))\r
+               {\r
+                       PostMessage(mainWindow, WM_COMMAND, ID_FILE_OPEN, 0);\r
+               }\r
+               if (parser.HasKey(_T("overlay")))\r
+               {\r
+                       PostMessage(mainWindow, WM_COMMAND, ID_VIEW_OVERLAPIMAGES, 0);\r
+               }\r
+               if (parser.HasKey(_T("fit")))\r
+               {\r
+                       PostMessage(mainWindow, WM_COMMAND, ID_VIEW_FITTOGETHER, 0);\r
+               }\r
+               if (parser.HasKey(_T("showinfo")))\r
+               {\r
+                       PostMessage(mainWindow, WM_COMMAND, ID_VIEW_IMAGEINFO, 0);\r
+               }\r
+               // Main message loop:\r
+               while (GetMessage(&msg, NULL, 0, 0))\r
+               {\r
+                       if (!TranslateAccelerator(mainWindow, hAccelTable, &msg))\r
+                       {\r
+                               TranslateMessage(&msg);\r
+                               DispatchMessage(&msg);\r
+                       }\r
+               }\r
+               return (int) msg.wParam;\r
+       }\r
+       langDLL.Close();\r
+       DestroyCursor(curHand);\r
+       DestroyCursor(curHandDown);\r
+       return 1;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
diff --git a/src/TortoiseIDiff/TortoiseIDiff.h b/src/TortoiseIDiff/TortoiseIDiff.h
new file mode 100644 (file)
index 0000000..582bfa5
--- /dev/null
@@ -0,0 +1,26 @@
+// TortoiseIDiff - an image diff viewer in TortoiseSVN\r
+\r
+// Copyright (C) 2006 - Stefan Kueng\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#pragma once\r
+\r
+#include "resource.h"\r
+\r
+extern HINSTANCE hInst;\r
+extern HINSTANCE hResource;\r
+extern HCURSOR   curHand;\r
+extern HCURSOR   curHandDown;\r
diff --git a/src/TortoiseIDiff/TortoiseIDiff.ico b/src/TortoiseIDiff/TortoiseIDiff.ico
new file mode 100644 (file)
index 0000000..737b6ab
Binary files /dev/null and b/src/TortoiseIDiff/TortoiseIDiff.ico differ
diff --git a/src/TortoiseIDiff/TortoiseIDiff.rc b/src/TortoiseIDiff/TortoiseIDiff.rc
new file mode 100644 (file)
index 0000000..b6e919e
--- /dev/null
@@ -0,0 +1,264 @@
+// Microsoft Visual C++ generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#define APSTUDIO_HIDDEN_SYMBOLS\r
+#include "windows.h"\r
+#undef APSTUDIO_HIDDEN_SYMBOLS\r
+#ifndef APSTUDIO_INVOKED\r
+#include "TortoiseIDiff.rc2"\r
+#endif\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Neutral resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDI_TORTOISEIDIFF       ICON                    "TortoiseIDiff.ico"\r
+IDI_OVERLAP             ICON                    "overlap.ico"\r
+IDI_FITINWINDOW         ICON                    "fitinwindow.ico"\r
+IDI_ORIGSIZE            ICON                    "origsize.ico"\r
+IDI_ZOOMIN              ICON                    "zoomin.ico"\r
+IDI_ZOOMOUT             ICON                    "zoomout.ico"\r
+IDI_IMGINFO             ICON                    "imginfo.ico"\r
+IDI_FORWARD             ICON                    "player_fwd.ico"\r
+IDI_BACKWARD            ICON                    "player_rew.ico"\r
+IDI_START               ICON                    "player_start.ico"\r
+IDI_STOP                ICON                    "player_stop.ico"\r
+IDI_VERTICAL            ICON                    "vertical.ico"\r
+IDI_LINK                ICON                    "link.ico"\r
+IDI_ALPHATOGGLE         ICON                    "alphatoggle.ico"\r
+IDI_FITTOGETHER         ICON                    "fittogether.ico"\r
+IDI_BLEND               ICON                    "blend.ico"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Cursor\r
+//\r
+\r
+IDC_PANCUR              CURSOR                  "..\\Resources\\pan.cur"\r
+IDC_PANDOWNCUR          CURSOR                  "..\\Resources\\pandown.cur"\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE \r
+BEGIN\r
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "#include ""windows.h""\r\n"\r
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "#ifndef APSTUDIO_INVOKED\r\n"\r
+    "#include ""TortoiseIDiff.rc2""\r\n"\r
+    "#endif\0"\r
+END\r
+\r
+3 TEXTINCLUDE \r
+BEGIN\r
+    "\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+#endif    // Neutral resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// English (U.S.) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDC_TORTOISEIDIFF MENU \r
+BEGIN\r
+    POPUP "&File"\r
+    BEGIN\r
+        MENUITEM "&Open",                       ID_FILE_OPEN\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "E&xit",                       IDM_EXIT\r
+    END\r
+    POPUP "&View"\r
+    BEGIN\r
+        MENUITEM "&Overlay images",             ID_VIEW_OVERLAPIMAGES\r
+        MENUITEM "Blend Alpha",                 ID_VIEW_BLENDALPHA\r
+        MENUITEM "&Link image positions",       ID_VIEW_LINKIMAGESTOGETHER, CHECKED\r
+        MENUITEM "Fit image &sizes",            ID_VIEW_FITTOGETHER\r
+        MENUITEM "&Fit Images in window",       ID_VIEW_FITIMAGESINWINDOW\r
+        MENUITEM "Ori&ginal size",              ID_VIEW_ORININALSIZE\r
+        MENUITEM "Transparent &color...",       ID_VIEW_TRANSPARENTCOLOR\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "Zoo&m out",                   ID_VIEW_ZOOMOUT\r
+        MENUITEM "Zoom i&n",                    ID_VIEW_ZOOMIN\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&Image Info",                 ID_VIEW_IMAGEINFO\r
+        MENUITEM "Arrange &Vertical",           ID_VIEW_ARRANGEVERTICAL\r
+    END\r
+    MENUITEM "?",                           ID_ABOUT\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_OPEN DIALOGEX 0, 0, 286, 78\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Load Images"\r
+FONT 8, "MS Shell Dlg", 400, 0, 0x1\r
+BEGIN\r
+    LTEXT           "Left image",IDC_STATIC,7,9,59,8\r
+    EDITTEXT        IDC_LEFTIMAGE,66,7,187,14,ES_AUTOHSCROLL\r
+    PUSHBUTTON      "...",IDC_LEFTBROWSE,258,7,21,14\r
+    LTEXT           "Right image",IDC_STATIC,7,33,59,8\r
+    EDITTEXT        IDC_RIGHTIMAGE,66,31,187,14,ES_AUTOHSCROLL\r
+    PUSHBUTTON      "...",IDC_RIGHTBROWSE,258,31,21,14\r
+    DEFPUSHBUTTON   "OK",IDOK,169,57,50,14\r
+    PUSHBUTTON      "Cancel",IDCANCEL,229,57,50,14\r
+END\r
+\r
+IDD_ABOUT DIALOGEX 0, 0, 258, 86\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "TortoiseIDiff"\r
+FONT 8, "MS Shell Dlg", 400, 0, 0x1\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,201,65,50,14\r
+    ICON            IDI_TORTOISEIDIFF,IDC_STATIC,15,15,21,20\r
+    LTEXT           "TortoiseIDiff - An image diff tool, part of TortoiseSVN",IDC_STATIC,53,15,198,21\r
+    LTEXT           "Version",IDC_ABOUTVERSION,53,42,198,8\r
+    LTEXT           "http://tortoisesvn.net",IDC_WEBLINK,53,71,140,8\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// DESIGNINFO\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+GUIDELINES DESIGNINFO \r
+BEGIN\r
+    IDD_OPEN, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 279\r
+        VERTGUIDE, 66\r
+        VERTGUIDE, 253\r
+        VERTGUIDE, 258\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 71\r
+    END\r
+\r
+    IDD_ABOUT, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 251\r
+        VERTGUIDE, 53\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 79\r
+    END\r
+END\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Accelerator\r
+//\r
+\r
+IDR_TORTOISEIDIFF ACCELERATORS \r
+BEGIN\r
+    "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL, NOINVERT\r
+    VK_UP,          ID_VIEW_ALPHA0,         VIRTKEY, NOINVERT\r
+    VK_LEFT,        ID_VIEW_ALPHA127,       VIRTKEY, NOINVERT\r
+    VK_RIGHT,       ID_VIEW_ALPHA127,       VIRTKEY, NOINVERT\r
+    VK_DOWN,        ID_VIEW_ALPHA255,       VIRTKEY, NOINVERT\r
+    VK_SPACE,       ID_VIEW_ALPHATOGGLE,    VIRTKEY, NOINVERT\r
+    "V",            ID_VIEW_ARRANGEVERTICAL, VIRTKEY, CONTROL, NOINVERT\r
+    "F",            ID_VIEW_FITIMAGESINWINDOW, VIRTKEY, NOINVERT\r
+    "b",            ID_VIEW_BACKGROUNDCOLOR, ASCII, NOINVERT\r
+    "i",            ID_VIEW_IMAGEINFO,      ASCII,  NOINVERT\r
+    "S",            ID_VIEW_ORININALSIZE,   VIRTKEY, NOINVERT\r
+    "O",            ID_VIEW_OVERLAPIMAGES,  VIRTKEY, NOINVERT\r
+    "+",            ID_VIEW_ZOOMIN,         ASCII,  NOINVERT\r
+    VK_OEM_MINUS,   ID_VIEW_ZOOMOUT,        VIRTKEY, NOINVERT\r
+    VK_SUBTRACT,    ID_VIEW_ZOOMOUT,        VIRTKEY, NOINVERT\r
+    VK_ESCAPE,      IDM_EXIT,               VIRTKEY, NOINVERT\r
+    "T",            ID_VIEW_FITTOGETHER,    VIRTKEY, NOINVERT\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE \r
+BEGIN\r
+    IDS_VERSION             "Version %d.%d.%d.%d"\r
+    IDS_APP_TITLE           "TortoiseIDiff"\r
+    IDS_COMMANDLINEHELP     "TortoiseIDiff: the image diff viewer for TortoiseSVN\n\nAvailable command line parameters are:\n/left:""path to left picture""\n/lefttitle:""title to show for the left picture""\n/right:""path to right picture""\n/righttitle:""title to show for the right picture""\n/overlay\t\tto enable overlay mode\n/fit\t\tto fit the images sizes\n/showinfo\t\tto show the image info boxes"\r
+    IDS_OPENIMAGEFILE       "Open image file..."\r
+    IDS_INVALIDIMAGEINFO    "The image can not be shown."\r
+    IDS_IMAGEINFO           "File size:\t\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%"\r
+    IDS_DUALIMAGEINFO       "File size:\t\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%\n\nFile size:\t\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%"\r
+    IDC_TORTOISEIDIFF       "TORTOISEIDIFF"\r
+    IDS_DIMENSIONSANDFRAMES "%ld of %ld"\r
+    IDS_IMAGEINFOTT         "File size:\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%"\r
+END\r
+\r
+STRINGTABLE \r
+BEGIN\r
+    IDS_DUALIMAGEINFOTT     "File size:\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%\n\nFile size:\t\t%s (%s)\nWidth:\t\t\t%ld pixel\nHeight:\t\t\t%ld pixel\nHorizontal Resolution:\t%.1f dpi\nVertical Resolution:\t%.1f dpi\nDepth:\t\t\t%d bit\nZoom:\t\t\t%d%%"\r
+END\r
+\r
+#endif    // English (U.S.) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/src/TortoiseIDiff/TortoiseIDiff.rc2 b/src/TortoiseIDiff/TortoiseIDiff.rc2
new file mode 100644 (file)
index 0000000..42a9c98
--- /dev/null
@@ -0,0 +1,50 @@
+//\r
+// TortoiseIDiff.RC2 - resources Microsoft Visual C++ does not edit directly\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+#error this file is not editable by Microsoft Visual C++\r
+#endif //APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Add manually edited resources here...\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+#include "..\version.h"\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION FILEVER\r
+ PRODUCTVERSION PRODUCTVER\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x4L\r
+ FILETYPE VFT_APP\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+    BLOCK "StringFileInfo"\r
+    BEGIN\r
+        BLOCK "040004e4"\r
+        BEGIN\r
+            VALUE "CompanyName", "http://tortoisesvn.net\0"\r
+            VALUE "FileDescription", "TortoiseIDiff\0"\r
+            VALUE "FileVersion", STRFILEVER\r
+            VALUE "InternalName", "TortoiseIDiff.exe\0"\r
+            VALUE "LegalCopyright", "Copyright (C) 2006-2008 - TortoiseSVN\0"\r
+            VALUE "OriginalFilename", "TortoiseIDiff.exe\0"\r
+            VALUE "ProductName", "TortoiseIDiff\0"\r
+            VALUE "ProductVersion", STRPRODUCTVER\r
+        END\r
+    END\r
+    BLOCK "VarFileInfo"\r
+    BEGIN\r
+        VALUE "Translation", 0x400, 1252\r
+    END\r
+END\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
diff --git a/src/TortoiseIDiff/TortoiseIDiff.vcproj b/src/TortoiseIDiff/TortoiseIDiff.vcproj
new file mode 100644 (file)
index 0000000..c8d0855
--- /dev/null
@@ -0,0 +1,949 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9.00"\r
+       Name="TortoiseIDiff"\r
+       ProjectGUID="{6D95829D-AE04-47A7-B66B-DC2F581DDF01}"\r
+       RootNamespace="TortoiseIDiff"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="..\..\bin\Debug\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\Debug"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               AdditionalIncludeDirectories=""\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="2"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="..\..\bin\Debug64\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\Debug64"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="2"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="..\..\bin\Release\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\Release"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               BufferSecurityCheck="true"\r
+                               EnableEnhancedInstructionSet="0"\r
+                               RuntimeTypeInfo="true"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="..\..\bin\Release64\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\Release64"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="release_static|Win32"\r
+                       OutputDirectory="..\..\bin\ReleaseStatic\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\ReleaseStatic"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               BufferSecurityCheck="true"\r
+                               EnableEnhancedInstructionSet="0"\r
+                               RuntimeTypeInfo="true"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="release_static|x64"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="debug_static|Win32"\r
+                       OutputDirectory="..\..\bin\DebugStatic\bin"\r
+                       IntermediateDirectory="..\..\obj\TortoiseIDiff\DebugStatic"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="1"\r
+                               BufferSecurityCheck="true"\r
+                               EnableEnhancedInstructionSet="0"\r
+                               RuntimeTypeInfo="true"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="debug_static|x64"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="1"\r
+                               FavorSizeOrSpeed="2"\r
+                               AdditionalIncludeDirectories="..\Utils;..\Utils\MiscUI"\r
+                               PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="2"\r
+                               WarningLevel="3"\r
+                               Detect64BitPortabilityProblems="false"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="gdiplus.lib"\r
+                               LinkIncremental="1"\r
+                               DelayLoadDLLs="gdiplus.dll"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               OptimizeForWindows98="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath=".\AboutDlg.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseDialog.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseWindow.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\CmdLineParser.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\hyperlink_base.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\LangDll.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\MainWindow.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\NiceTrackbar.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\Picture.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\PicWindow.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\Registry.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\stdafx.cpp"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="release_static|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="release_static|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="debug_static|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="debug_static|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="1"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseIDiff.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <File\r
+                               RelativePath=".\AboutDlg.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseDialog.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\BaseWindow.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\CmdLineParser.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\hyperlink_base.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\LangDll.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\MainWindow.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\MemDC.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\NiceTrackbar.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\MiscUI\Picture.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\PicWindow.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\Utils\registry.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\Resource.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\stdafx.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\TortoiseIDiff.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+                       <File\r
+                               RelativePath=".\alphatoggle.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\blend.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\fitinwindow.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\fittogether.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\imginfo.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\link.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\origsize.ico"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\overlap.ico"\r
+                               >\r
+                 &nbs