mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	Added PreserveAspectRatio=2 feature to Image meter (Thanks Kaelri!)
This commit is contained in:
		@@ -33,8 +33,7 @@ using namespace Gdiplus;
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
CMeterImage::CMeterImage(CMeterWindow* meterWindow, const WCHAR* name) : CMeter(meterWindow, name),
 | 
					CMeterImage::CMeterImage(CMeterWindow* meterWindow, const WCHAR* name) : CMeter(meterWindow, name),
 | 
				
			||||||
	m_NeedsRedraw(false),
 | 
						m_NeedsRedraw(false),
 | 
				
			||||||
	m_PreserveAspectRatio(false),
 | 
						m_DrawMode(DRAWMODE_NONE),
 | 
				
			||||||
	m_Tile(false),
 | 
					 | 
				
			||||||
	m_ScaleMargins()
 | 
						m_ScaleMargins()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -84,14 +83,14 @@ void CMeterImage::LoadImage(const std::wstring& imageName, bool bLoadAlways)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			if (!m_HDefined)
 | 
								if (!m_HDefined)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				m_H = (imageW == 0) ? 0 : (m_Tile) ? imageH : m_W * imageH / imageW;
 | 
									m_H = (imageW == 0) ? 0 : (m_DrawMode == DRAWMODE_TILE) ? imageH : m_W * imageH / imageW;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (m_HDefined)
 | 
								if (m_HDefined)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				m_W = (imageH == 0) ? 0 : (m_Tile) ? imageW : m_H * imageW / imageH;
 | 
									m_W = (imageH == 0) ? 0 : (m_DrawMode == DRAWMODE_TILE) ? imageW : m_H * imageW / imageH;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
@@ -121,8 +120,28 @@ void CMeterImage::ReadOptions(CConfigParser& parser, const WCHAR* section)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	m_ImageName = parser.ReadString(section, L"ImageName", L"");
 | 
						m_ImageName = parser.ReadString(section, L"ImageName", L"");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_PreserveAspectRatio = 0!=parser.ReadInt(section, L"PreserveAspectRatio", 0);
 | 
						int mode = parser.ReadInt(section, L"Tile", 0);
 | 
				
			||||||
	m_Tile = 0!=parser.ReadInt(section, L"Tile", 0);
 | 
						if (mode != 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							m_DrawMode = DRAWMODE_TILE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							mode = parser.ReadInt(section, L"PreserveAspectRatio", 0);
 | 
				
			||||||
 | 
							switch (mode)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								m_DrawMode = DRAWMODE_NONE;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 1:
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								m_DrawMode = DRAWMODE_KEEPRATIO;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								m_DrawMode = DRAWMODE_KEEPRATIOANDCROP;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static const RECT defMargins = {0};
 | 
						static const RECT defMargins = {0};
 | 
				
			||||||
	m_ScaleMargins = parser.ReadRECT(section, L"ScaleMargins", defMargins);
 | 
						m_ScaleMargins = parser.ReadRECT(section, L"ScaleMargins", defMargins);
 | 
				
			||||||
@@ -219,7 +238,7 @@ bool CMeterImage::Draw(Graphics& graphics)
 | 
				
			|||||||
			Rect r(x, y, drawW, drawH);
 | 
								Rect r(x, y, drawW, drawH);
 | 
				
			||||||
			graphics.DrawImage(drawBitmap, r, 0, 0, imageW, imageH, UnitPixel);
 | 
								graphics.DrawImage(drawBitmap, r, 0, 0, imageW, imageH, UnitPixel);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if (m_Tile)
 | 
							else if (m_DrawMode == DRAWMODE_TILE)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ImageAttributes imgAttr;
 | 
								ImageAttributes imgAttr;
 | 
				
			||||||
			imgAttr.SetWrapMode(WrapModeTile);
 | 
								imgAttr.SetWrapMode(WrapModeTile);
 | 
				
			||||||
@@ -227,31 +246,51 @@ bool CMeterImage::Draw(Graphics& graphics)
 | 
				
			|||||||
			Rect r(x, y, drawW, drawH);
 | 
								Rect r(x, y, drawW, drawH);
 | 
				
			||||||
			graphics.DrawImage(drawBitmap, r, 0, 0, drawW, drawH, UnitPixel, &imgAttr);
 | 
								graphics.DrawImage(drawBitmap, r, 0, 0, drawW, drawH, UnitPixel, &imgAttr);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if (m_PreserveAspectRatio)
 | 
							else if (m_DrawMode == DRAWMODE_KEEPRATIO || m_DrawMode == DRAWMODE_KEEPRATIOANDCROP)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								int cropX = 0;
 | 
				
			||||||
 | 
								int cropY = 0;
 | 
				
			||||||
 | 
								int cropW = imageW;
 | 
				
			||||||
 | 
								int cropH = imageH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (m_WDefined && m_HDefined)
 | 
								if (m_WDefined && m_HDefined)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				REAL imageRatio = imageW / (REAL)imageH;
 | 
									REAL imageRatio = imageW / (REAL)imageH;
 | 
				
			||||||
				REAL meterRatio = m_W / (REAL)m_H;
 | 
									REAL meterRatio = m_W / (REAL)m_H;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (imageRatio >= meterRatio)
 | 
									if (imageRatio != meterRatio)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										if (m_DrawMode == DRAWMODE_KEEPRATIO)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (imageRatio > meterRatio)
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
					drawW = m_W;
 | 
					 | 
				
			||||||
							drawH = m_W * imageH / imageW;
 | 
												drawH = m_W * imageH / imageW;
 | 
				
			||||||
 | 
												y += (m_H - drawH) / 2;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						else
 | 
											else
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							drawW = m_H * imageW / imageH;
 | 
												drawW = m_H * imageW / imageH;
 | 
				
			||||||
					drawH = m_H;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Centering
 | 
					 | 
				
			||||||
							x += (m_W - drawW) / 2;
 | 
												x += (m_W - drawW) / 2;
 | 
				
			||||||
				y += (m_H - drawH) / 2;
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											if (imageRatio > meterRatio)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												cropW = (int)(imageH * meterRatio);
 | 
				
			||||||
 | 
												cropX = (imageW - cropW) / 2;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												cropH = (int)(imageW / meterRatio);
 | 
				
			||||||
 | 
												cropY = (imageH - cropH) / 2;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Rect r(x, y, drawW, drawH);
 | 
								Rect r(x, y, drawW, drawH);
 | 
				
			||||||
			graphics.DrawImage(drawBitmap, r, 0, 0, imageW, imageH, UnitPixel);
 | 
								graphics.DrawImage(drawBitmap, r, cropX, cropY, cropW, cropH, UnitPixel);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,14 @@ protected:
 | 
				
			|||||||
	virtual bool IsFixedSize(bool overwrite = false) { return overwrite ? true : m_ImageNameResult.empty(); }
 | 
						virtual bool IsFixedSize(bool overwrite = false) { return overwrite ? true : m_ImageNameResult.empty(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
						enum DRAWMODE
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DRAWMODE_NONE = 0,
 | 
				
			||||||
 | 
							DRAWMODE_TILE,
 | 
				
			||||||
 | 
							DRAWMODE_KEEPRATIO,
 | 
				
			||||||
 | 
							DRAWMODE_KEEPRATIOANDCROP
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void LoadImage(const std::wstring& imageName, bool bLoadAlways);
 | 
						void LoadImage(const std::wstring& imageName, bool bLoadAlways);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CTintedImage m_Image;
 | 
						CTintedImage m_Image;
 | 
				
			||||||
@@ -49,8 +57,7 @@ private:
 | 
				
			|||||||
	std::wstring m_Path;
 | 
						std::wstring m_Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool m_NeedsRedraw;
 | 
						bool m_NeedsRedraw;
 | 
				
			||||||
	bool m_PreserveAspectRatio;
 | 
						DRAWMODE m_DrawMode;
 | 
				
			||||||
	bool m_Tile;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RECT m_ScaleMargins;
 | 
						RECT m_ScaleMargins;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user