#pragma once
|
|
|
// CImageViewer
|
|
#include "ImageBuffer.h"
|
#include <d2d1.h>
|
#include <wincodec.h>
|
#include <vector>
|
#include <list>
|
#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<SDoublePos> VectorDoublePos;
|
typedef std::vector<SDoublePos>::iterator VectorDoublePosIt;
|
typedef std::vector<SDoublePos>::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<SDrawObject> ListDrawObject;
|
typedef std::list<SDrawObject>::iterator ListDrawObjectIt;
|
typedef std::list<SDrawObject>::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;
|
};
|