nim_duilib/duilib/Core/Image.h

154 lines
3.7 KiB
C
Raw Permalink Normal View History

2019-04-19 17:19:57 +08:00
#ifndef UI_CORE_IMAGEDECODE_H_
#define UI_CORE_IMAGEDECODE_H_
#pragma once
#include <GdiPlus.h>
namespace ui
{
class UILIB_API ImageInfo
{
public:
ImageInfo();
~ImageInfo();
void SetAlpha(bool bAlphaChannel) { m_bAlphaChannel = bAlphaChannel; }
bool IsAlpha() { return m_bAlphaChannel; }
bool IsCached() { return m_bCached; }
void SetCached(bool bCached) { m_bCached = bCached; }
void SetPropertyItem(Gdiplus::PropertyItem* pPropertyItem);
void PushBackHBitmap(HBITMAP hBitmap);
HBITMAP GetHBitmap(int nIndex);
int GetFrameCount();
bool IsGif();
int GetInterval(int nIndex); //<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ
static std::unique_ptr<ImageInfo> LoadImage(const std::wstring& strImageFullPath);
static std::unique_ptr<ImageInfo> LoadImage(HGLOBAL hGlobal, const std::wstring& imageFullPath);
private:
static std::unique_ptr<ImageInfo> LoadImageByBitmap(std::unique_ptr<Gdiplus::Bitmap>& pGdiplusBitmap, const std::wstring& imageFullPath);
public:
int nX;
int nY;
std::wstring sImageFullPath;
private:
bool m_bAlphaChannel;
bool m_bCached;
std::unique_ptr<Gdiplus::PropertyItem> m_propertyItem;
std::vector<HBITMAP> m_vecBitmap;
};
struct UILIB_API ImageAttribute
{
public:
ImageAttribute();
void Init();
void SetImageString(const std::wstring& strImageString);
static void ModifyAttribute(ImageAttribute& imageAttribute, const std::wstring& strImageString);
std::wstring simageString;
std::wstring sImageName;
UiRect rcDest;
UiRect rcSource;
UiRect rcCorner;
BYTE bFade;
bool bTiledX;
bool bTiledY;
int nPlayCount;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GIF<49><46><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD> -1 <20><>һֱ<D2BB><D6B1><EFBFBD>ţ<EFBFBD>ȱʡֵ<CAA1><D6B5>
};
class UILIB_API Image
{
public:
Image();
bool IsValid() { return (bool)imageCache; }
bool IsPlaying() { return m_bPlaying; }
void SetPlaying(bool bPlaying) { m_bPlaying = bPlaying; }
void SetImageString(const std::wstring& strImageString);
void ClearCache();
bool IncrementCurrentFrame();
void SetCurrentFrame(int nCurrentFrame);
HBITMAP GetCurrentHBitmap();
int GetCurrentInterval();
int GetCurrentFrameIndex();
int GetCycledCount();
void ClearCycledCount();
bool ContinuePlay();
ImageAttribute imageAttribute;
std::shared_ptr<ImageInfo> imageCache;
private:
int m_nCurrentFrame;
bool m_bPlaying;
int m_nCycledCount;//<2F><><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>
};
class UILIB_API StateImage
{
public:
StateImage();
void SetControl(Control* control) { m_pControl = control; }
Image& operator[](ControlStateType stateType) { return m_stateImageMap[stateType]; }
bool HasHotImage();
bool PaintStatusImage(IRenderContext* pRender, ControlStateType stateType, const std::wstring& sImageModify = L"");
Image* GetEstimateImage();
void ClearCache();
private:
Control* m_pControl;
std::map<ControlStateType, Image> m_stateImageMap;
};
class UILIB_API StateImageMap
{
public:
StateImageMap() { }
void SetControl(Control* control);
void SetImage(StateImageType stateImageType, ControlStateType stateType, const std::wstring& strImagePath);
std::wstring GetImagePath(StateImageType stateImageType, ControlStateType stateType);
bool HasHotImage();
bool PaintStatusImage(IRenderContext* pRender, StateImageType stateImageType, ControlStateType stateType, const std::wstring& sImageModify = L"");
Image* GetEstimateImage(StateImageType stateImageType);
void ClearCache();
private:
std::map<StateImageType, StateImage> m_stateImageMap;
};
class UILIB_API StateColorMap
{
public:
StateColorMap();
void SetControl(Control* control);
std::wstring& operator[](ControlStateType stateType) { return m_stateColorMap[stateType]; }
bool HasHotColor();
void PaintStatusColor(IRenderContext* pRender, UiRect rcPaint, ControlStateType stateType);
private:
Control* m_pControl;
std::map<ControlStateType, std::wstring> m_stateColorMap;
};
} // namespace ui
#endif // UI_CORE_IMAGEDECODE_H_