Browse Source

improved High DPI awarness

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@677 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 12 years ago
parent
commit
fdc774d58a

+ 3 - 0
CP_Main.h

@@ -24,6 +24,9 @@
 
 extern class CCP_MainApp theApp;
 
+#define BORDER 2 
+#define CAPTION_BORDER theApp.m_metrics.ScaleX(16)
+
 class CCP_MainApp : public CWinApp
 {
 public:

+ 13 - 3
CP_Main.rc

@@ -953,9 +953,19 @@ IDR_FILE_COPY           AVI                     "res\\FILECOPY.AVI"
 //
 
 IDB_OPEN_FOLDER_PNG     PNG                     "res\\folder_open.png"
-IDB_LEFT_ARROW_PNG      PNG                     "res\\left-blue.png"
-IDB_COG_22_22           PNG                     "res\\cog_22_22.png"
-IDB_COG_16_16           PNG                     "res\\cog_16_16.png"
+IDB_COG_16_16           PNG                     "C:\\Users\\sbrogden\\Desktop\\Ditto\\root\\res\\cog_16_16.png"
+IDB_SHORTCUT_PNG        PNG                     "res\\shortcut.png"
+IDB_OPEN_FOLDER_16_16   PNG                     "res\\opened_folder_16_16.png"
+IDB_OPEN_FOLDER_20_20   PNG                     "res\\opened_folder_20_20.png"
+IDB_OPEN_FOLDER_24_24   PNG                     "res\\opened_folder_24_24.png"
+IDB_OPEN_FOLDER_32_32   PNG                     "res\\opened_folder_32_32.png"
+IDB_COG_20_20           PNG                     "res\\cog_20_20.png"
+IDB_COG_24_24           PNG                     "res\\cog_24_24.png"
+IDB_COG_32_32           PNG                     "res\\cog_32_32.png"
+IDB_LEFT_ARROW_16_16    PNG                     "res\\left_arrow_16_16.png"
+IDB_LEFT_ARROW_20_20    PNG                     "res\\left_arrow_20_20.png"
+IDB_LEFT_ARROW_24_24    PNG                     "res\\left_arrow_24_24.png"
+IDB_LEFT_ARROW_32_32    PNG                     "res\\left_arrow_32_32.png"
 
 /////////////////////////////////////////////////////////////////////////////
 //

+ 14 - 0
CP_Main.vcxproj

@@ -563,6 +563,7 @@
     <ClCompile Include="DPI.cpp" />
     <ClCompile Include="EditWithButton.cpp" />
     <ClCompile Include="EventThread.cpp" />
+    <ClCompile Include="GdiImageDrawer.cpp" />
     <ClCompile Include="GdipButton.cpp" />
     <ClCompile Include="GlobalClips.cpp" />
     <ClCompile Include="HotKeys.cpp" />
@@ -1764,6 +1765,7 @@
     <ClInclude Include="EditWithButton.h" />
     <ClInclude Include="EventThread.h" />
     <ClInclude Include="FormattedTextDraw.h" />
+    <ClInclude Include="GdiImageDrawer.h" />
     <ClInclude Include="GdipButton.h" />
     <ClInclude Include="GlobalClips.h" />
     <ClInclude Include="GroupStatic.h" />
@@ -1891,7 +1893,10 @@
     <None Include="res\bmp00003.bmp" />
     <None Include="res\closed_f.bmp" />
     <None Include="res\cog_16_16.png" />
+    <None Include="res\cog_20_20.png" />
     <None Include="res\cog_22_22.png" />
+    <None Include="res\cog_24_24.png" />
+    <None Include="res\cog_32_32.png" />
     <None Include="res\CP_Main.ico" />
     <None Include="res\CP_Main.rc2" />
     <None Include="res\CP_MainDoc.ico" />
@@ -1901,7 +1906,15 @@
     <None Include="res\Ditto_NoCopyCb.ico" />
     <None Include="res\folder_open.png" />
     <None Include="res\left-blue.png" />
+    <None Include="res\left_arrow_16_16.png" />
+    <None Include="res\left_arrow_20_20.png" />
+    <None Include="res\left_arrow_24_24.png" />
+    <None Include="res\left_arrow_32_32.png" />
     <None Include="res\mainfram.bmp" />
+    <None Include="res\opened_folder_16_16.png" />
+    <None Include="res\opened_folder_20_20.png" />
+    <None Include="res\opened_folder_24_24.png" />
+    <None Include="res\opened_folder_32_32.png" />
     <None Include="res\open_fol.bmp" />
     <None Include="res\Ditto2.ico" />
     <None Include="res\search_close.bmp" />
@@ -1912,6 +1925,7 @@
     <None Include="res\search_normal_125.bmp" />
     <None Include="res\search_normal_150.bmp" />
     <None Include="res\search_normal_200.bmp" />
+    <None Include="res\shortcut.png" />
     <None Include="res\Toolbar.bmp" />
     <None Include="res\toolbar1.bmp" />
     <CustomBuild Include="RulerRichEditCtrl\toolbar.bmp">

+ 16 - 0
CP_Main.vcxproj.filters

@@ -332,6 +332,7 @@
       <Filter>source</Filter>
     </ClCompile>
     <ClCompile Include="MyDropTarget.cpp" />
+    <ClCompile Include="GdiImageDrawer.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sqlite\CppSQLite3.h">
@@ -710,6 +711,7 @@
       <Filter>header</Filter>
     </ClInclude>
     <ClInclude Include="MyDropTarget.h" />
+    <ClInclude Include="GdiImageDrawer.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CP_Main.rc">
@@ -820,6 +822,20 @@
     </None>
     <None Include="res\cog_16_16.png" />
     <None Include="res\cog_22_22.png" />
+    <None Include="res\shortcut.png">
+      <Filter>res</Filter>
+    </None>
+    <None Include="res\opened_folder_16_16.png" />
+    <None Include="res\opened_folder_20_20.png" />
+    <None Include="res\opened_folder_24_24.png" />
+    <None Include="res\opened_folder_32_32.png" />
+    <None Include="res\cog_20_20.png" />
+    <None Include="res\cog_24_24.png" />
+    <None Include="res\cog_32_32.png" />
+    <None Include="res\left_arrow_16_16.png" />
+    <None Include="res\left_arrow_20_20.png" />
+    <None Include="res\left_arrow_24_24.png" />
+    <None Include="res\left_arrow_32_32.png" />
   </ItemGroup>
   <ItemGroup>
     <Filter Include="sqlite">

+ 12 - 12
DittoWindow.cpp

@@ -39,11 +39,11 @@ CDittoWindow::~CDittoWindow(void)
 
 void CDittoWindow::DoCreate(CWnd *pWnd)
 {
-	m_VertFont.CreateFont(14,0,-900,0,400,FALSE,FALSE,0,ANSI_CHARSET,
+	m_VertFont.CreateFont(theApp.m_metrics.PointsToPixels(10), 0, -900, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET,
 							OUT_DEFAULT_PRECIS,	CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
 							DEFAULT_PITCH|FF_SWISS, _T("Arial"));
 
-	m_HorFont.CreateFont(14,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,
+	m_HorFont.CreateFont(theApp.m_metrics.PointsToPixels(10), 0, 0, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET,
 						OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
 						DEFAULT_PITCH|FF_SWISS, _T("Arial"));
 }
@@ -296,35 +296,35 @@ void CDittoWindow::DoNcPaint(CWnd *pWnd)
 	{
 		int nTop = 0;
 		if(m_bDrawClose)
-			nTop += 20;
+			nTop += theApp.m_metrics.ScaleY(20);
 		if(m_bDrawMaximize)
-			nTop += 20;
+			nTop += theApp.m_metrics.ScaleY(20);
 		if(m_bDrawMaximize)
-			nTop += 20;
-		cr.SetRect(rcBorder.right-1, nTop, rcBorder.right - 13, rcBorder.bottom - 20);
+			nTop += theApp.m_metrics.ScaleY(20);
+		cr.SetRect(rcBorder.right - 1, nTop, rcBorder.right - theApp.m_metrics.ScaleX(13), rcBorder.bottom - theApp.m_metrics.ScaleY(20));
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
 	else if(m_lBottomBorder == CAPTION_BORDER)
 	{
-		cr.SetRect(20, rcBorder.bottom - 15, rcBorder.right - 20, rcBorder.bottom - 1);
+		cr.SetRect(theApp.m_metrics.ScaleX(20), rcBorder.bottom - theApp.m_metrics.ScaleY(15), rcBorder.right - theApp.m_metrics.ScaleX(20), rcBorder.bottom - 1);
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
 	else if(m_lLeftBorder == CAPTION_BORDER)
 	{
 		int nTop = 0;
 		if(m_bDrawClose)
-			nTop += 20;
+			nTop += theApp.m_metrics.ScaleY(20);
 		if(m_bDrawMaximize)
-			nTop += 20;
+			nTop += theApp.m_metrics.ScaleY(20);
 		if(m_bDrawMaximize)
-			nTop += 20;
+			nTop += theApp.m_metrics.ScaleY(20);
 
-		cr.SetRect(15, nTop, 2, rcBorder.bottom - 20);
+		cr.SetRect(theApp.m_metrics.ScaleX(15) , nTop, 2, rcBorder.bottom - theApp.m_metrics.ScaleY(20));
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
 	else if(m_lTopBorder == CAPTION_BORDER)
 	{
-		cr.SetRect(20, 1, rcBorder.right - 20, 15);
+		cr.SetRect(theApp.m_metrics.ScaleX(20), 1, rcBorder.right - theApp.m_metrics.ScaleX(20), theApp.m_metrics.ScaleY(15));
 		dc.DrawText(csText, cr, DT_SINGLELINE);
 	}
 

+ 0 - 3
DittoWindow.h

@@ -5,9 +5,6 @@
 #define BUTTON_MINIMIZE 3
 #define BUTTON_MAXIMIZE 4
 
-#define BORDER 2 
-#define CAPTION_BORDER 16 
-
 class CDittoWindow
 {
 public:

+ 43 - 0
GdiImageDrawer.cpp

@@ -0,0 +1,43 @@
+#include "stdafx.h"
+#include "GdiImageDrawer.h"
+
+
+#include "MemDC.h"
+
+
+CGdiImageDrawer::CGdiImageDrawer()
+{
+	m_pStdImage = NULL;
+}
+
+
+CGdiImageDrawer::~CGdiImageDrawer()
+{
+	delete m_pStdImage;
+}
+
+BOOL CGdiImageDrawer::LoadStdImage(UINT id, LPCTSTR pType)
+{
+	m_pStdImage = new CGdiPlusBitmapResource;
+	return m_pStdImage->Load(id, pType);
+}
+
+void CGdiImageDrawer::Draw(CDC* pScreenDC, int posX, int posY)
+{
+	//if (m_dcStd.m_hDC == NULL)
+	{
+		//CBitmap bmp, *pOldBitmap;
+
+		Gdiplus::Graphics graphics(pScreenDC->m_hDC);
+		graphics.DrawImage(m_pStdImage->m_pBitmap, posX, posY);
+
+
+		//m_dcStd.CreateCompatibleDC(pScreenDC);
+		//bmp.CreateCompatibleBitmap(pScreenDC, 15, 15);
+		//pOldBitmap = m_dcStd.SelectObject(&bmp);
+		//m_dcStd.BitBlt(0, 0, 15, 15, pScreenDC, 0, 0, SRCCOPY);
+		//bmp.DeleteObject();
+	}
+
+	//pScreenDC->BitBlt(0, 0, 15, 15, &m_dcStd, 0, 0, SRCCOPY);
+}

+ 19 - 0
GdiImageDrawer.h

@@ -0,0 +1,19 @@
+#pragma once
+
+#include "CGdiPlusBitmap.h"
+
+class CGdiImageDrawer
+{
+public:
+	CGdiImageDrawer();
+	~CGdiImageDrawer();
+
+	BOOL LoadStdImage(UINT id, LPCTSTR pType);
+	void CGdiImageDrawer::Draw(CDC* pScreenDC, int posX, int posY);
+
+protected:
+	CGdiPlusBitmapResource* m_pStdImage;
+	CDC*	m_pCurBtn;		// current pointer to one of the above
+	CDC		m_dcStd;		// standard button
+};
+

+ 24 - 0
GdipButton.cpp

@@ -29,6 +29,7 @@
 
 #include "CGdiPlusBitmap.h"
 #include "MemDC.h"
+#include "CP_Main.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -82,6 +83,29 @@ BEGIN_MESSAGE_MAP(CGdipButton, CButton)
 END_MESSAGE_MAP()
 
 
+BOOL CGdipButton::LoadStdImageDPI(UINT id96, UINT id120, UINT id144, UINT id192, LPCTSTR pType)
+{
+	BOOL ret = FALSE;
+
+	if (theApp.m_metrics.GetDPIX() >= 192)
+	{
+		ret = LoadStdImage(id192, pType);
+	}
+	else if (theApp.m_metrics.GetDPIX() >= 144)
+	{
+		ret = LoadStdImage(id144, pType);
+	}
+	else if (theApp.m_metrics.GetDPIX() >= 120)
+	{
+		ret = LoadStdImage(id120, pType);
+	}
+	else
+	{
+		ret = LoadStdImage(id96, pType);
+	}
+
+	return ret;
+}
 
 //=============================================================================
 //

+ 2 - 0
GdipButton.h

@@ -53,6 +53,8 @@ public:
 	BOOL LoadAltImage(UINT id, LPCTSTR pType);
 	BOOL LoadStdImage(UINT id, LPCTSTR pType);
 
+	BOOL LoadStdImageDPI(UINT id96, UINT id120, UINT id144, UINT id192, LPCTSTR pType);
+
 	// if false, disables the press state and uses grayscale image if it exists
 	void EnableButton(BOOL bEnable = TRUE) { m_bIsDisabled = !bEnable; }
 

+ 2 - 1
Options.cpp

@@ -5,6 +5,7 @@
 #include "shared/TextConvert.h"
 #include "sqlite\CppSQLite3.h"
 #include "Path.h"
+#include "CP_Main.h"
 
 using namespace nsPath;
 
@@ -1316,7 +1317,7 @@ BOOL CGetSetOptions::GetFont(LOGFONT &font)
 	}
 
 	ZeroMemory(&font, sizeof(font));
-	font.lfHeight = -11;
+	font.lfHeight = -theApp.m_metrics.PointsToPixels(8);
 	font.lfWeight = 400;
 	font.lfCharSet = 1;
 	STRCPY(font.lfFaceName, _T("Arial Unicode MS"));

+ 1 - 1
OptionsQuickPaste.cpp

@@ -172,7 +172,7 @@ BOOL COptionsQuickPaste::OnApply()
 
 void COptionsQuickPaste::OnButtonFont() 
 {
-	CFontDialog dlg(&m_LogFont);
+	CFontDialog dlg(&m_LogFont, (CF_TTONLY | CF_SCREENFONTS));
 	if(dlg.DoModal() == IDOK)
 	{	
 		m_Font.DeleteObject();

+ 4 - 0
QListCtrl.cpp

@@ -61,6 +61,8 @@ CQListCtrl::CQListCtrl()
 	m_allSelected = false;
 
 	m_mouseOverScrollAreaStart = 0;
+
+	//m_groupFolder.LoadStdImage(IDB_SHORTCUT_PNG, _T("PNG"));
 }
 
 CQListCtrl::~CQListCtrl()
@@ -488,6 +490,8 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
         // Draw a focus rect around the item if necessary.
         if(bListHasFocus && (rItem.state & LVIS_FOCUSED))
 			pDC->DrawFocusRect(rcItem);
+
+		//m_groupFolder.Draw(pDC, rcItem.left, rcItem.top);
 		
 		if( m_bShowTextForFirstTenHotKeys && firstTenNum > 0 )
 		{

+ 2 - 0
QListCtrl.h

@@ -12,6 +12,7 @@
 #include "sqlite/CppSQLite3.h"
 #include "ClipFormatQListCtrl.h"
 #include "Accels.h"
+#include "GdiImageDrawer.h"
 
 #define NM_SELECT					WM_USER+0x100
 #define NM_RIGHT					WM_USER+0x101
@@ -160,6 +161,7 @@ protected:
 	int m_linesPerRow;
 	DWORD m_mouseOverScrollAreaStart;
 	bool m_timerToHideScrollAreaSet;
+	CGdiImageDrawer m_groupFolder;
 
 	// Generated message map functions
 protected:

+ 6 - 6
QPasteWnd.cpp

@@ -265,16 +265,16 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
     m_ShowGroupsFolderBottom.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_BOTTOM);
     //m_ShowGroupsFolderBottom.LoadBitmaps(IDB_CLOSED_FOLDER, IDB_CLOSED_FOLDER_PRESSED, IDB_CLOSED_FOLDER_FOCUSED);
-	m_ShowGroupsFolderBottom.LoadStdImage(IDB_OPEN_FOLDER_PNG, _T("PNG"));
+	m_ShowGroupsFolderBottom.LoadStdImageDPI(IDB_OPEN_FOLDER_16_16, IDB_OPEN_FOLDER_20_20, IDB_OPEN_FOLDER_24_24, IDB_OPEN_FOLDER_32_32, _T("PNG"));
     m_ShowGroupsFolderBottom.ShowWindow(SW_SHOW);
 	m_ShowGroupsFolderBottom.SetToolTipText(theApp.m_Language.GetString(_T("GroupsTooltip"), _T("Groups")));
 
     m_BackButton.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_BACK_BUTTON);
-    m_BackButton.LoadStdImage(IDB_LEFT_ARROW_PNG, _T("PNG"));
+	m_BackButton.LoadStdImageDPI(IDB_LEFT_ARROW_16_16, IDB_LEFT_ARROW_20_20, IDB_LEFT_ARROW_24_24, IDB_LEFT_ARROW_32_32, _T("PNG"));
     m_BackButton.ShowWindow(SW_SHOW);
 
 	m_searchOptionsButton.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SEARCH_DESCRIPTION_BUTTON);
-	m_searchOptionsButton.LoadStdImage(IDB_COG_16_16, _T("PNG"));
+	m_searchOptionsButton.LoadStdImageDPI(IDB_COG_16_16, IDB_COG_20_20, IDB_COG_24_24, IDB_COG_32_32, _T("PNG"));
 	m_searchOptionsButton.SetToolTipText(theApp.m_Language.GetString(_T("SearchOptionsTooltip"), _T("Search options")));
 	m_searchOptionsButton.ShowWindow(SW_SHOW);
 
@@ -300,11 +300,11 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
         m_Alpha.SetWindowHandle(m_hWnd);
     #endif 
 
-    m_TitleFont.CreateFont(14, 0,  -900, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
+	m_TitleFont.CreateFont(theApp.m_metrics.PointsToPixels(10), 0, -900, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
 
     m_SearchFont.CreatePointFont(80, _T("Arial Unicode MS"));
 
-    GroupFont.CreateFont(-11, 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, _T("MS Sans Serif"));
+	GroupFont.CreateFont(-theApp.m_metrics.PointsToPixels(8), 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, _T("MS Sans Serif"));
 
     m_search.SetFont(&m_SearchFont);
     m_stGroup.SetFont(&GroupFont);
@@ -404,7 +404,7 @@ void CQPasteWnd::MoveControls()
 	m_lstHeader.MoveWindow(0, topOfListBox, cx+extraSize, cy - listBoxBottomOffset-topOfListBox + extraSize);
     m_search.MoveWindow(theApp.m_metrics.ScaleX(20), cy - theApp.m_metrics.ScaleY(21), cx - theApp.m_metrics.ScaleX(40), theApp.m_metrics.ScaleY(20));
 
-	m_searchOptionsButton.MoveWindow(cx - theApp.m_metrics.ScaleX(18), cy - theApp.m_metrics.ScaleY(19), 16, 16);
+	m_searchOptionsButton.MoveWindow(cx - theApp.m_metrics.ScaleX(18), cy - theApp.m_metrics.ScaleY(19), theApp.m_metrics.ScaleX(16), theApp.m_metrics.ScaleY(16));
 
     m_ShowGroupsFolderBottom.MoveWindow(theApp.m_metrics.ScaleY(2), cy - theApp.m_metrics.ScaleY(18), theApp.m_metrics.ScaleX(16), theApp.m_metrics.ScaleY(16));
 }

+ 14 - 3
Resource.h

@@ -43,11 +43,22 @@
 #define IDB_BITMAP_SEARCH_NORMAL_200    178
 #define IDB_OPEN_FOLDER_PNG             179
 #define IDB_PNG1                        180
-#define IDB_LEFT_ARROW_PNG              180
 #define IDR_MENU_SEARCH                 181
-#define IDB_COG_22_22                   182
 #define IDB_PNG2                        183
 #define IDB_COG_16_16                   183
+#define IDB_SHORTCUT_PNG                184
+#define IDB_OPEN_FOLDER_16_16           185
+#define IDB_OPEN_FOLDER_20_20           186
+#define IDB_OPEN_FOLDER_24_24           187
+#define IDB_PNG4                        188
+#define IDB_OPEN_FOLDER_32_32           188
+#define IDB_COG_20_20                   190
+#define IDB_COG_24_24                   191
+#define IDB_COG_32_32                   192
+#define IDB_LEFT_ARROW_16_16            193
+#define IDB_LEFT_ARROW_20_20            194
+#define IDB_LEFT_ARROW_24_24            195
+#define IDB_LEFT_ARROW_32_32            196
 #define IDC_PATH                        1000
 #define IDC_GET_PATH                    1001
 #define IDC_SELECT_SOUND                1002
@@ -382,7 +393,7 @@
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        184
+#define _APS_NEXT_RESOURCE_VALUE        197
 #define _APS_NEXT_COMMAND_VALUE         32881
 #define _APS_NEXT_CONTROL_VALUE         2101
 #define _APS_NEXT_SYMED_VALUE           101

BIN
res/cog_16_16.png


BIN
res/cog_20_20.png


BIN
res/cog_24_24.png


BIN
res/cog_32_32.png


BIN
res/left_arrow_16_16.png


BIN
res/left_arrow_20_20.png


BIN
res/left_arrow_24_24.png


BIN
res/left_arrow_32_32.png


BIN
res/opened_folder_16_16.png


BIN
res/opened_folder_20_20.png


BIN
res/opened_folder_24_24.png


BIN
res/opened_folder_32_32.png