#pragma once // CImageViewer #include "ImageBuffer.h" #include #include #include #include #include "afxmt.h" enum ViewScaleType { ViewScale_Origin=0, ViewScale_Zoom, ViewScale_Fit, ViewScale_Count }; enum DrawObjectType { DrawObject_Line=0, DrawObject_Rectangle, DrawObject_Ellipse, DrawObject_Polygon, DrawObject_Count }; enum ColorBandShiftValue { AlphaShiftValue = 24, RedShiftValue = 16, GreenShiftValue = 8, BlueShiftValue = 0 }; #define SafeRelease(T) if(T) {T->Release(); T = 0; } #define SafeDelete(T) if(T) {delete T; T = 0; } static UINT MakeColor(BYTE a, BYTE r, BYTE g, BYTE b) { return (((UINT) (b) << BlueShiftValue) | ((UINT) (g) << GreenShiftValue) | ((UINT) (r) << RedShiftValue) | ((UINT) (a) << AlphaShiftValue)); } struct SDoublePos { SDoublePos(double dX=0, double dY=0) { dPosX = dX; dPosY = dY; } double dPosX; double dPosY; }; typedef std::vector VectorDoublePos; typedef std::vector::iterator VectorDoublePosIt; typedef std::vector::const_iterator constVectorDoublePosIt; struct SDrawObject { public: SDrawObject() { Reset(); } ~SDrawObject() { Reset(); } void Reset() { nIndex = 0; nType = DrawObject_Line; strName = _T(""); nPenColor = MakeColor(0,255,0,0); nBrushColor = MakeColor(0,0,0,0); dPenOpacity = 0.6; dBrushOpacity = 0.2; dPenSize = 1; // 1pixel dPosX = 0.0; dPosY = 0.0; dSizeX = 0.0; dSizeY = 0.0; vecPolygon.clear(); } double Left() const { return dPosX; } double Top() const { return dPosY; } double Right() const { return (dPosX+dSizeX); } double Bottom() const { return (dPosY+dSizeY); } double Width() const { return dSizeX; } double Height() const { return dSizeY; } int nIndex; // ¼ø¹ø int nType; // ŸÀÔ CString strName; // À̸§ UINT nPenColor; // Ææ Ä÷¯ double dPenOpacity; // Ææ ºÒÅõ¸íµµ (0~1) UINT nBrushColor; // ºê·¯½Ã Ä÷¯ double dBrushOpacity; // ºê·¯½Ã ºÒÅõ¸íµµ (0~1) double dPenSize; // Ææ Å©±â pixel double dPosX; // ¿øÁ¡ X pixel double dPosY; // ¿øÁ¡ Y pixel double dSizeX; // »çÀÌÁî X pixel double dSizeY; // »çÀÌÁî Y pixel VectorDoublePos vecPolygon; // Æú¸®°ï Á¤º¸ pixel }; typedef std::list ListDrawObject; typedef std::list::iterator ListDrawObjectIt; typedef std::list::const_iterator constListDrawObjectIt; class AFX_EXT_CLASS CImageViewer : public CWnd, public CImageBuffer { DECLARE_DYNAMIC(CImageViewer) public: CImageViewer(CWnd* pParentWnd=NULL); virtual ~CImageViewer(); BOOL LoadImage(const CString& strFilename); protected: DECLARE_MESSAGE_MAP() public: // setter void SetViewType(int nType); void SetDrawViewName(BOOL bDraw); void SetDrawObject(BOOL bDraw); void SetDrawRoi(BOOL bDraw); void SetViewName(const CString& strValue); void SetRoiRect(const CRect& rtRect); void SetScale(double dScale); void SetWidthScale(double dScale); void SetHeightScale(double dScale); // getter int GetViewType() const; BOOL GetDrawViewName() const; BOOL GetDrawObject() const; BOOL GetDrawRoi() const; CString GetViewName() const; CRect GetRoiRect() const; double GetScale() const; double GetWidthScale(void) const; double GetHeightScale(void) const; int GetHScrollPos(void) const; int GetVScrollPos(void) const; int GetScaleWidth(void); int GetScaleHeight(void); // draw object void AddDrawObject(const SDrawObject& drawObject); void DeleteAllDrawObject(void); // clear screen void ClearScreen(); public: afx_msg void OnPaint(); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); protected: CWnd *m_pParentWnd; // scroll pos int m_nVScroll; int m_nHScroll; // max scroll pos int m_nMaxVScroll; int m_nMaxHScroll; // image draw int m_nViewType; int m_nScaleWidth; int m_nScaleHeight; double m_dWidthScale; double m_dHeightScale; // draw view name BOOL m_bDrawViewName; CString m_strViewName; // draw roi BOOL m_bDrawRoi; SDrawObject m_rtRoiRect; // draw object BOOL m_bDrawObject; ListDrawObject m_listDrawObject; protected: void DrawViewName(); void DrawRoi(); void DrawObject(); void DrawObject(const SDrawObject& object); void CalculateRect(); protected: BOOL CreateRenderTarget(const CRect& rtRect); int CreateWicBitmap(int nWidthStep, int nHeight, int nChannels, BYTE* pBuffer); static BOOL IntersectsWith(const D2D1_RECT_F& rect1, const D2D1_RECT_F& rect2) { return ( rect1.left < rect2.right && rect1.top < rect2.bottom && rect1.right > rect2.left && rect1.bottom > rect2.top); } protected: IWICImagingFactory *m_pWICFactory; IWICBitmap *m_pWICBitmap; IWICFormatConverter *m_pWICFormatConverter; ID2D1Factory *m_pD2DFactory; ID2D1HwndRenderTarget *m_pD2DRenderTarget; ID2D1Bitmap *m_pD2DBitmap; CCriticalSection *m_pD2DCriticalSection; int m_nWicBitmapWidthStep; int m_nWicBitmapHeight; int m_nWicBitmapChannels; CRect m_rtViewRect; // ÇöÀç ºäÀÇ Å©±âÁ¤º¸ CRect m_rtOrgViewRect; // ½ÇÀç ºäÀÇ Å©±âÁ¤º¸ D2D1_RECT_F m_rtSourceRect; // ¿øº» À̹ÌÁö Á¤º¸ D2D1_RECT_F m_rtDestRect; // ¸ñÇ¥ À̹ÌÁö Á¤º¸ D2D1_RECT_F m_rtRenderRect; };