1. 修改 vxtPLDisplay 工程,在vaps的图形绘制层增加像素绘制函数的声明和定义
修改 vxtPLGraphicsImpl.h
VXT_PL_GRAPHICS_VIRTUAL_SPEC void vDrawPixels(const vxtRCoord& a_rBottomLeft, const vxtRCoord& a_rTopRight, void *pixel, int width, int height);
修改 vxtPLGraphicsImplInl.h
VXT_PL_GRAPHICS_INLINE_SPEC void vxtPLGraphicsImpl::vDrawPixels(const vxtRCoord& a_rBottomLeft, const vxtRCoord& a_rTopRight, void *pixel, int width, int height)
{
const vxtRTMatrix2d &rMat = rGetMatrix();
glRasterPos2i((rMat.m_11 * a_rBottomLeft.X) + (rMat.m_12 * a_rBottomLeft.Y) + rMat.m_13,
(rMat.m_21 * a_rBottomLeft.X) + (rMat.m_22 * a_rBottomLeft.Y) + rMat.m_23);
glDrawPixels(574, 574, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixel);
}
2. 修改 vxtClsImage 工程,给图片控件增加调用绘制像素的功能
修改 vxtClsImage.h ,增加以下成员
void CreateRenderTargetShareMemory(int size, TCHAR* name);
void FreeShareMemory();
HANDLE m_hMemRenderTarget;
void *m_pMemRenderTarget;
int m_nWidth;
int m_nHeight;
修改vxtClsImage.cpp,在构造函数中添加初始化代码
if (mp_AlphaValue == CREATE_VIDEO_IMAGE_1)
{
m_nWidth = 574;
m_nHeight = 574;
CreateRenderTargetShareMemory(m_nWidth * m_nHeight * 3, TEXT("RENDERTARGET"));
}
修改vxtClsImage.cpp,增加成员函数
void vxtClsImage::CreateRenderTargetShareMemory(int size, TCHAR* name)
{
m_hMemRenderTarget = CreateFileMapping((HANDLE)0xffffffffffffffff,
NULL,
PAGE_READWRITE,
0,
size,
name);
m_pMemRenderTarget = MapViewOfFile(m_hMemRenderTarget, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
}
void vxtClsImage::FreeShareMemory()
{
UnmapViewOfFile(m_pMemRenderTarget);
CloseHandle(m_hMemRenderTarget);
}
修改vxtClsImage.cpp,修改下面两个成员函数
char testdata[574 * 574 * 3];
void vxtClsImage::vDraw(vxtRTDrawMode & a_rMode)
{
#if VXT_CGRUNTIME_MODE
VXT_PRE_GROBJECT_VDRAW_PARAM_PRECONDITION;
VXT_PRE(IsVisible());
/// @pre This function must only be called from functions of ::vxtRTDrawMode.
#endif
if (mp_AlphaValue == CREATE_VIDEO_IMAGE_1)
{
#if 0
for (int i = 0; i < 574 * 574 * 3; i++)
{
if (i % 3 == 0)
testdata[i] = 255;
else if (i % 3 == 1)
testdata[i] = 0;
else if (i % 3 == 2)
testdata[i] = 0;
testdata[i] = rand() % 255;
}
#endif
vxtPLGraphics& rGraphics = a_rMode.rGetGraphics();
const vxtRTImage &rImage = mp_Index->rGetImage();
if (rImage.IsAllocated())
{
vxtRCoord Point1 = { mp_Position.GetFieldX(), mp_Position.GetFieldY() };
vxtRCoord Point2 = { mp_Position.GetFieldX() + mp_Size.GetFieldX(), mp_Position.GetFieldY() + mp_Size.GetFieldY() };
if (m_pMemRenderTarget != NULL)
{
rGraphics.vDrawPixels(Point1, Point2, m_pMemRenderTarget, m_nWidth, m_nHeight);
vRequireUpdate();
}
}
return;
}
if( 0 != mp_AlphaValue )
{
vxtPLGraphics& rGraphics = a_rMode.rGetGraphics();
const vxtRTImage &rImage = mp_Index->rGetImage();
if(rImage.IsAllocated())
{
vxtColorRGBA ImageColor = { VXT_MAX_PIXEL_LEVEL,
VXT_MAX_PIXEL_LEVEL,
VXT_MAX_PIXEL_LEVEL,
mp_AlphaValue };
//--------------------------------------------------------------------
// Coding Standard Deviation: MISRA C++ 2008 6-2-2
// Description: Floating-point expressions shall not be directly or
// indirectly tested for equality or inequality.
// Rationale: Direct equality test is used as a fast way to single
// out and optimize the most-used no-rotation case.
//--------------------------------------------------------------------
// PRQA S 3270 1
if (0.0F == mp_RotationAngle)
{
vxtRCoord Point1 = {mp_Position.GetFieldX(), mp_Position.GetFieldY()};
// SCS.LAN.EXPR.ARITH.ERROR
// DC1.RT.GENERAL.EXTENT_LIMIT.01 impose all graphics to be located
// inside the maximum extent bounding box (+- VXT_RT_GEOMETRY_MAX),
// therefore limiting the values of mp_Position and mp_Size to that range.
// Adding two floats in that interval cannot overflow.
vxtRCoord Point2 = {mp_Position.GetFieldX() + mp_Size.GetFieldX(),
mp_Position.GetFieldY() + mp_Size.GetFieldY() };
rGraphics.vDrawImage(rImage, Point1, Point2, ImageColor);
}
else
{
// General case of drawing a rotated image
vxtRCoord Zero = { 0.0F, 0.0F};
vxtRCoord Size = { mp_Size.GetFieldX(), mp_Size.GetFieldY() };
rGraphics.vPushTrans();
rGraphics.vTranslate(mp_Position.GetFieldX(), mp_Position.GetFieldY());
rGraphics.vRotate(mp_RotationAngle);
rGraphics.vDrawImage(rImage, Zero, Size, ImageColor);
rGraphics.vPopTrans();
}
}
}
}
void vxtClsImage::vUpdate(const vxtRTTopContext & a_rTopContext)
{
vFixSizeIfNeeded(a_rTopContext, VXT_FALSE);
if (mp_AlphaValue == CREATE_VIDEO_IMAGE_1)
vRequireDraw(a_rTopContext);
}
修改vxtClsImage.cpp,增加一个宏定义
#define CREATE_VIDEO_IMAGE_1 50