2018-01-09:改进模拟器像素面板的缓存结构,方便后续拓展。

This commit is contained in:
Polarix 2018-01-10 20:35:55 +08:00
parent 09eea18a99
commit 0e80ac4044
5 changed files with 192 additions and 155 deletions

View File

@ -3,14 +3,14 @@
//=======================================================================//
//= Include files. =//
//=======================================================================//
#include "wxDotLCD.h"
#include "wxPixelatedPanel.h"
#include "Common.h"
#include <wx/colour.h>
//=======================================================================//
//= Class declare. =//
//=======================================================================//
class MonochromeDotLCD : public wxDotLCD
class MonochromeDotLCD : public wxPixelatedPanel
{
private:
uint32_t m_uiPageCount;

View File

@ -13,7 +13,7 @@
//=======================================================================//
//= Event table. =//
//=======================================================================//
BEGIN_EVENT_TABLE(MonochromeDotLCD,wxDotLCD)
BEGIN_EVENT_TABLE(MonochromeDotLCD,wxPixelatedPanel)
EVT_SET_FOCUS (MonochromeDotLCD::wxEvent_OnSetFocus)
END_EVENT_TABLE()
@ -21,7 +21,7 @@ END_EVENT_TABLE()
//= Function define. =//
//=======================================================================//
MonochromeDotLCD::MonochromeDotLCD(wxWindow *pclsParent, wxWindowID iWinID, const wxPoint& clsPosition):
wxDotLCD(pclsParent, iWinID, clsPosition)
wxPixelatedPanel(pclsParent, iWinID, clsPosition)
{
m_pclsPanelColor = new wxColor(0x00, 0x00, 0x00, 0x00);
m_pclsPixelColor = new wxColor(0x00, 0x00, 0x00, 0x00);
@ -37,16 +37,16 @@ void MonochromeDotLCD::SetParameter(PixelPanelParameter* pstPanelParameter)
{
if(NULL != pstPanelParameter)
{
wxDotLCD::SetEdgeWidth(pstPanelParameter->EdgeWidth);
wxDotLCD::SetPixelSize(pstPanelParameter->PixelSize);
wxDotLCD::SetGridVisibled(pstPanelParameter->EnableGrid);
wxDotLCD::SetDisplaySizes(pstPanelParameter->HorizontalPixelNumber, pstPanelParameter->VerticalPixelNumber);
wxPixelatedPanel::SetEdgeWidth(pstPanelParameter->EdgeWidth);
wxPixelatedPanel::SetPixelSize(pstPanelParameter->PixelSize);
wxPixelatedPanel::SetGridVisibled(pstPanelParameter->EnableGrid);
wxPixelatedPanel::SetPixelNumber(pstPanelParameter->HorizontalPixelNumber, pstPanelParameter->VerticalPixelNumber);
m_uiColumnCount = pstPanelParameter->HorizontalPixelNumber;
m_uiPageCount = pstPanelParameter->VerticalPixelNumber/8;
m_pclsPanelColor->SetRGBA(pstPanelParameter->PanelColor.RGBA);
m_pclsPixelColor->SetRGBA(pstPanelParameter->PixelColor.RGBA);
wxDotLCD::SetDisplayColors( wxColor(pstPanelParameter->EdgeColor.RGBA),
wxPixelatedPanel::SetColors( wxColor(pstPanelParameter->EdgeColor.RGBA),
wxColor(pstPanelParameter->PanelColor.RGBA),
wxColor(pstPanelParameter->GridColor.RGBA));
}
@ -57,11 +57,11 @@ void MonochromeDotLCD::SetPixel(uint32_t uiPosX, uint32_t uiPosY, LCD_PIXEL_COLO
{
if(LCD_PIXEL_COLOR_L == ePixelValue)
{
wxDotLCD::SetPixelUnitColor(uiPosX, uiPosY, *m_pclsPanelColor);
wxPixelatedPanel::SetPixelUnitColor(uiPosX, uiPosY, *m_pclsPanelColor);
}
else
{
wxDotLCD::SetPixelUnitColor(uiPosX, uiPosY, *m_pclsPixelColor);
wxPixelatedPanel::SetPixelUnitColor(uiPosX, uiPosY, *m_pclsPixelColor);
}
}
@ -97,11 +97,11 @@ void MonochromeDotLCD::DrawPixel(uint32_t uiPosX, uint32_t uiPosY, LCD_PIXEL_COL
{
if(LCD_PIXEL_COLOR_L == ePixelValue)
{
wxDotLCD::DrawPixel(uiPosX, uiPosY, *m_pclsPanelColor);
wxPixelatedPanel::DrawPixel(uiPosX, uiPosY, *m_pclsPanelColor);
}
else
{
wxDotLCD::DrawPixel(uiPosX, uiPosY, *m_pclsPixelColor);
wxPixelatedPanel::DrawPixel(uiPosX, uiPosY, *m_pclsPixelColor);
}
}
@ -115,7 +115,7 @@ void MonochromeDotLCD::CleanScreen(void)
{
uint32_t uiHorizontalPixelNumber, uiVerticalPixelNumber;
GetDisplaySize(&uiHorizontalPixelNumber, &uiVerticalPixelNumber);
GetPixelNumber(&uiHorizontalPixelNumber, &uiVerticalPixelNumber);
for(uint32_t i_V=0; i_V<uiVerticalPixelNumber; i_V++)
{
for(uint32_t i_H=0; i_H<uiHorizontalPixelNumber; i_H++)

View File

@ -101,10 +101,6 @@
<Unit filename="../../../DemoProc/src/VariableBox.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="../../../GUI/inc/Font_H12.h" />
<Unit filename="../../../GUI/inc/Font_H16.h" />
<Unit filename="../../../GUI/inc/Font_H32.h" />
<Unit filename="../../../GUI/inc/Font_H8.h" />
<Unit filename="../../../GUI/inc/SGUI_Basic.h" />
<Unit filename="../../../GUI/inc/SGUI_Common.h" />
<Unit filename="../../../GUI/inc/SGUI_Frame.h" />
@ -179,8 +175,8 @@
<Unit filename="../../Resource/Resource.rc">
<Option compilerVar="WINDRES" />
</Unit>
<Unit filename="../../wxExpand/inc/wxDotLCD.h" />
<Unit filename="../../wxExpand/src/wxDotLCD.cpp" />
<Unit filename="../../wxExpand/inc/wxPixelatedPanel.h" />
<Unit filename="../../wxExpand/src/wxPixelatedPanel.cpp" />
<Extensions>
<code_completion />
<envvars />

View File

@ -9,9 +9,9 @@
/// Class LCD_DisplayPanel
///////////////////////////////////////////////////////////////////////////////
class wxDotLCD : public wxPanel
class wxPixelatedPanel : public wxPanel
{
private: //Appearance parameters.
private:
// Colors
wxColor* m_pclsEdgeColor;
wxColor* m_pclsBaseColor;
@ -24,34 +24,32 @@ private: //Appearance parameters.
uint32_t m_uiEdgeWidth;
bool m_bGridVisible;
// Private data declare.
private: // Private data.
uint32_t* m_parrDisplayBuffer;
void (wxDotLCD::*m_pfDrawPoint)(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
private: // Private object;
// Private data.
uint32_t** m_ppuiDisplayBuffer;
void (wxPixelatedPanel::*m_pfDrawPoint)(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
// Private object;
wxClientDC m_clsCDC;
wxPen m_clsPen;
wxBrush m_clsBrush;
private: // Event callback function.
private:
// Event callback function.
void _wxEvent_OnPaint(wxPaintEvent &event) {OnPaint();event.Skip();}
public: // Constructor/Destructor
wxDotLCD(wxWindow *pclsParent, wxWindowID iWinID = wxID_ANY, const wxPoint& clsPosition = wxDefaultPosition);
~wxDotLCD();
public: // Public interface
void SetDisplaySizes(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber);
void GetDisplaySize(uint32_t* puiHorizontalPixelNumber, uint32_t* puiVerticalPixelNumber);
void SetDisplayColors(const wxColor& clsEdgeColor, const wxColor& clsBaseColor, const wxColor& clsGridColor);
public:
// Constructor/Destructor
wxPixelatedPanel(wxWindow *pclsParent, wxWindowID iWinID = wxID_ANY, const wxPoint& clsPosition = wxDefaultPosition);
~wxPixelatedPanel();
// Public interface
void SetPixelNumber(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber);
void GetPixelNumber(uint32_t* puiHorizontalPixelNumber, uint32_t* puiVerticalPixelNumber);
void SetColors(const wxColor& clsEdgeColor, const wxColor& clsBaseColor, const wxColor& clsGridColor);
void SetEdgeWidth(uint32_t uiEdgeWidth);
uint32_t GetEdgeWidth(void) {return m_uiEdgeWidth;}
void SetPixelSize(uint32_t uiPixelSize);
uint32_t GetPixelSize(void) {return m_uiPixelSize;}
void SetGridVisibled(bool bGridVisible);
bool GetGridVisibled(void) {return m_bGridVisible;}
void SetDisplayAreaSize( uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber);
void SetEdgeColor(const wxColor& clsColor);
wxColor& GetEdgeColor(void);
void SetBaseColor(const wxColor& clsColor);
@ -59,7 +57,7 @@ public: // Public interface
void SetGridColor(const wxColor& clsColor);
wxColor& GetGridColor(void);
void OnPaint(void);
void SetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor, bool bRefreshNow = false);
void SetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY, const wxColor& clsColor, bool bRefreshNow = false);
void DrawPixel(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor);
uint32_t GetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY);
void RefreshDisplay(void);
@ -69,14 +67,16 @@ public: // Public interface
void ResizeParent(void);
private: // Private process function.
inline void DrawPointSinglePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void DrawPointMultiplePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void DrawPointMultiplePixelWithGrid(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void ReleaseDC(wxMemoryDC& clsCDCObject) {clsCDCObject.SetBrush(wxNullBrush); clsCDCObject.SetPen(wxNullPen);}
inline void PrepareDC(wxMemoryDC& clsCDCObject) {clsCDCObject.SetBrush(m_clsBrush); clsCDCObject.SetPen(m_clsPen);}
inline void ReleaseDC(wxClientDC& clsCDCObject) {clsCDCObject.SetBrush(wxNullBrush); clsCDCObject.SetPen(wxNullPen);}
inline void PrepareDC(wxClientDC& clsCDCObject) {clsCDCObject.SetBrush(m_clsBrush); clsCDCObject.SetPen(m_clsPen);}
inline void SetDCColor(const wxColor& clsColour) {m_clsPen.SetColour(clsColour);m_clsBrush.SetColour(clsColour);}
inline void _drawPointSinglePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void _drawPointMultiplePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void _drawPointMultiplePixelWithGrid(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize);
inline void _releaseDC(wxMemoryDC& clsCDCObject) {clsCDCObject.SetBrush(wxNullBrush); clsCDCObject.SetPen(wxNullPen);}
inline void _prepareDC(wxMemoryDC& clsCDCObject) {clsCDCObject.SetBrush(m_clsBrush); clsCDCObject.SetPen(m_clsPen);}
inline void _releaseDC(wxClientDC& clsCDCObject) {clsCDCObject.SetBrush(wxNullBrush); clsCDCObject.SetPen(wxNullPen);}
inline void _prepareDC(wxClientDC& clsCDCObject) {clsCDCObject.SetBrush(m_clsBrush); clsCDCObject.SetPen(m_clsPen);}
inline void _setDCColor(const wxColor& clsColour) {m_clsPen.SetColour(clsColour);m_clsBrush.SetColour(clsColour);}
inline void _freeDisplayBuffer(uint32_t** ppuiDisplayBuffer);
inline uint32_t** _createNewDisplayBuffer(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber);
DECLARE_EVENT_TABLE();
};

View File

@ -2,23 +2,23 @@
//= Include files. =//
//=======================================================================//
#include <wx/clipbrd.h>
#include "wxDotLCD.h"
#include "wxPixelatedPanel.h"
//=======================================================================//
//= Event table. =//
//=======================================================================//
BEGIN_EVENT_TABLE(wxDotLCD,wxPanel)
EVT_PAINT (wxDotLCD::_wxEvent_OnPaint)
BEGIN_EVENT_TABLE(wxPixelatedPanel,wxPanel)
EVT_PAINT (wxPixelatedPanel::_wxEvent_OnPaint)
END_EVENT_TABLE()
//=======================================================================//
//= Function define. =//
//=======================================================================//
wxDotLCD::wxDotLCD(wxWindow *pclsParent, wxWindowID iWinID, const wxPoint& clsPosition):
wxPixelatedPanel::wxPixelatedPanel(wxWindow *pclsParent, wxWindowID iWinID, const wxPoint& clsPosition):
wxPanel(pclsParent, iWinID, clsPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxNO_BORDER, wxPanelNameStr),
m_clsCDC(this)
{
m_parrDisplayBuffer = NULL;
m_ppuiDisplayBuffer = NULL;
m_pfDrawPoint = NULL;
m_uiHorizontalPixelNumber = 0;
@ -32,51 +32,54 @@ m_clsCDC(this)
m_pclsGridColor = new wxColor(0x80, 0x80, 0x80, 0x00);
}
wxDotLCD::~wxDotLCD()
wxPixelatedPanel::~wxPixelatedPanel()
{
if(NULL != m_parrDisplayBuffer)
{
free(m_parrDisplayBuffer);
}
_freeDisplayBuffer(m_ppuiDisplayBuffer);
delete m_pclsEdgeColor;
delete m_pclsBaseColor;
delete m_pclsGridColor;
}
void wxDotLCD::SetDisplaySizes(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber)
void wxPixelatedPanel::SetPixelNumber(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint32_t** ppuiNewDisplayBuffer;
uint32_t uiCopiedRowNumber;
uint32_t uiCopiedColumnNumber;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
ppuiNewDisplayBuffer = NULL;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
// Free current buffer.
if(NULL != m_parrDisplayBuffer)
{
free(m_parrDisplayBuffer);
}
if((uiHorizontalPixelNumber > 0) && (uiVerticalPixelNumber > 0))
{
uint32_t uiDisplayBufferSize;
// Recalculate buffer size.
m_uiHorizontalPixelNumber = uiHorizontalPixelNumber;
m_uiVerticalPixelNumber = uiVerticalPixelNumber;
uiDisplayBufferSize = m_uiHorizontalPixelNumber*m_uiVerticalPixelNumber;
// Reallocate display buffer;
m_parrDisplayBuffer = (uint32_t*)malloc(uiDisplayBufferSize*sizeof(uint32_t));
if(NULL != m_parrDisplayBuffer)
{
// Clear memory.
memset(m_parrDisplayBuffer, 0x00, uiDisplayBufferSize);
}
}
else
{
m_uiHorizontalPixelNumber = 0;
m_uiVerticalPixelNumber = 0;
}
{
// Create a new display buffer
ppuiNewDisplayBuffer = _createNewDisplayBuffer(uiHorizontalPixelNumber, uiVerticalPixelNumber);
if(NULL != ppuiNewDisplayBuffer)
{
uiCopiedRowNumber = m_uiVerticalPixelNumber<uiVerticalPixelNumber?m_uiVerticalPixelNumber:uiVerticalPixelNumber;
uiCopiedColumnNumber = m_uiHorizontalPixelNumber<uiHorizontalPixelNumber?m_uiHorizontalPixelNumber:uiHorizontalPixelNumber;
// Copy old buffer content to new buffer;
for(uint32_t uiIdxV=0; uiIdxV<uiCopiedRowNumber; uiIdxV++)
{
memcpy(*(ppuiNewDisplayBuffer+uiIdxV), *(m_ppuiDisplayBuffer+uiIdxV), sizeof(uint32_t)*uiCopiedColumnNumber);
}
// Free current buffer.
_freeDisplayBuffer(m_ppuiDisplayBuffer);
m_ppuiDisplayBuffer = ppuiNewDisplayBuffer;
m_uiHorizontalPixelNumber = uiHorizontalPixelNumber;
m_uiVerticalPixelNumber = uiVerticalPixelNumber;
}
}
}
void wxDotLCD::GetDisplaySize(uint32_t* puiHorizontalPixelNumber, uint32_t* puiVerticalPixelNumber)
void wxPixelatedPanel::GetPixelNumber(uint32_t* puiHorizontalPixelNumber, uint32_t* puiVerticalPixelNumber)
{
/*----------------------------------*/
/* Process */
@ -92,7 +95,7 @@ void wxDotLCD::GetDisplaySize(uint32_t* puiHorizontalPixelNumber, uint32_t* puiV
}
}
void wxDotLCD::SetDisplayColors(const wxColor& clsEdgeColor, const wxColor& clsBaseColor, const wxColor& clsGridColor)
void wxPixelatedPanel::SetColors(const wxColor& clsEdgeColor, const wxColor& clsBaseColor, const wxColor& clsGridColor)
{
/*----------------------------------*/
/* Process */
@ -111,16 +114,7 @@ void wxDotLCD::SetDisplayColors(const wxColor& clsEdgeColor, const wxColor& clsB
}
}
void wxDotLCD::SetDisplayAreaSize( uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
m_uiHorizontalPixelNumber = uiHorizontalPixelNumber;
m_uiVerticalPixelNumber = uiVerticalPixelNumber;
}
void wxDotLCD::SetEdgeWidth(uint32_t uiEdgeWidth)
void wxPixelatedPanel::SetEdgeWidth(uint32_t uiEdgeWidth)
{
/*----------------------------------*/
/* Process */
@ -128,7 +122,7 @@ void wxDotLCD::SetEdgeWidth(uint32_t uiEdgeWidth)
m_uiEdgeWidth = uiEdgeWidth;
}
void wxDotLCD::SetPixelSize(uint32_t uiPixelSize)
void wxPixelatedPanel::SetPixelSize(uint32_t uiPixelSize)
{
/*----------------------------------*/
/* Process */
@ -147,27 +141,27 @@ void wxDotLCD::SetPixelSize(uint32_t uiPixelSize)
else if(1 == m_uiPixelSize)
// If pixel size is 1, the pixel drawing function will set to draw pixel unit by point.
{
m_pfDrawPoint = &DrawPointSinglePixel;
m_pfDrawPoint = &_drawPointSinglePixel;
}
else
{
m_pfDrawPoint = &DrawPointMultiplePixel;
m_pfDrawPoint = &_drawPointMultiplePixel;
}
}
else
{
if(true == m_bGridVisible)
{
m_pfDrawPoint = &DrawPointMultiplePixelWithGrid;
m_pfDrawPoint = &_drawPointMultiplePixelWithGrid;
}
else
{
m_pfDrawPoint = &DrawPointMultiplePixel;
m_pfDrawPoint = &_drawPointMultiplePixel;
}
}
}
void wxDotLCD::SetGridVisibled(bool bGridVisible)
void wxPixelatedPanel::SetGridVisibled(bool bGridVisible)
{
/*----------------------------------*/
/* Process */
@ -179,83 +173,76 @@ void wxDotLCD::SetGridVisibled(bool bGridVisible)
{
if(true == m_bGridVisible)
{
m_pfDrawPoint = &DrawPointMultiplePixelWithGrid;
m_pfDrawPoint = &_drawPointMultiplePixelWithGrid;
}
else
{
m_pfDrawPoint = &DrawPointMultiplePixel;
m_pfDrawPoint = &_drawPointMultiplePixel;
}
}
}
void wxDotLCD::CleanPanel(void)
void wxPixelatedPanel::CleanPanel(void)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint32_t uiDisplayBufferSize;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
uiDisplayBufferSize = m_uiHorizontalPixelNumber*m_uiVerticalPixelNumber;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
memset(m_parrDisplayBuffer, 0x00, sizeof(uint32_t)*uiDisplayBufferSize);
for(uint32_t uiIdxV=0; uiIdxV<m_uiVerticalPixelNumber; uiIdxV++)
{
memset(*(m_ppuiDisplayBuffer+uiIdxV), 0x00, sizeof(uint32_t)*m_uiHorizontalPixelNumber);
}
RefreshDisplay();
}
void wxDotLCD::SetEdgeColor(const wxColor& clsColor)
void wxPixelatedPanel::SetEdgeColor(const wxColor& clsColor)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != m_pclsEdgeColor)
{
m_pclsEdgeColor->SetRGB(clsColor.GetRGB());
*m_pclsEdgeColor = clsColor;
}
}
wxColor& wxDotLCD::GetEdgeColor(void)
wxColor& wxPixelatedPanel::GetEdgeColor(void)
{
return *m_pclsEdgeColor;
}
void wxDotLCD::SetBaseColor(const wxColor& clsColor)
void wxPixelatedPanel::SetBaseColor(const wxColor& clsColor)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != m_pclsBaseColor)
{
m_pclsBaseColor->SetRGB(clsColor.GetRGB());
*m_pclsBaseColor = clsColor;
}
}
wxColor& wxDotLCD::GetBaseColor(void)
wxColor& wxPixelatedPanel::GetBaseColor(void)
{
return *m_pclsBaseColor;
}
void wxDotLCD::SetGridColor(const wxColor& clsColor)
void wxPixelatedPanel::SetGridColor(const wxColor& clsColor)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != m_pclsGridColor)
{
m_pclsGridColor->SetRGB(clsColor.GetRGB());
*m_pclsGridColor = clsColor;
}
}
wxColor& wxDotLCD::GetGridColor(void)
wxColor& wxPixelatedPanel::GetGridColor(void)
{
return *m_pclsGridColor;
}
void wxDotLCD::OnPaint(void)
void wxPixelatedPanel::OnPaint(void)
{
/*----------------------------------*/
/* Process */
@ -264,7 +251,7 @@ void wxDotLCD::OnPaint(void)
}
void wxDotLCD::DrawPointSinglePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
void wxPixelatedPanel::_drawPointSinglePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
{
/*----------------------------------*/
/* Process */
@ -272,7 +259,7 @@ void wxDotLCD::DrawPointSinglePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, u
clsCDCObject.DrawPoint(wxPoint(m_uiEdgeWidth+uiPosX, m_uiEdgeWidth+uiPosY));
}
void wxDotLCD::DrawPointMultiplePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
void wxPixelatedPanel::_drawPointMultiplePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
{
/*----------------------------------*/
/* Process */
@ -280,7 +267,7 @@ void wxDotLCD::DrawPointMultiplePixel(wxMemoryDC& clsCDCObject, uint32_t uiPosX,
clsCDCObject.DrawRectangle(wxPoint(m_uiEdgeWidth+uiPosX*uiPixelSize, m_uiEdgeWidth+uiPosY*uiPixelSize), wxSize(uiPixelSize, uiPixelSize));
}
void wxDotLCD::DrawPointMultiplePixelWithGrid(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
void wxPixelatedPanel::_drawPointMultiplePixelWithGrid(wxMemoryDC& clsCDCObject, uint32_t uiPosX, uint32_t uiPosY, uint32_t uiPixelSize)
{
/*----------------------------------*/
/* Process */
@ -304,16 +291,16 @@ void wxDotLCD::DrawPointMultiplePixelWithGrid(wxMemoryDC& clsCDCObject, uint32_t
/** only one pixel, please use the DrawPixel function **/
/** directly. **/
/*************************************************************************/
void wxDotLCD::SetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor, bool bRefreshNow)
void wxPixelatedPanel::SetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY, const wxColor& clsColor, bool bRefreshNow)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if((uiPosX < m_uiHorizontalPixelNumber) && (uiPosY < m_uiVerticalPixelNumber))
{
if(NULL != m_parrDisplayBuffer)
if(NULL != m_ppuiDisplayBuffer)
{
*(m_parrDisplayBuffer+uiPosX+(uiPosY*m_uiHorizontalPixelNumber)) = clsColor.GetRGBA();
*(*(m_ppuiDisplayBuffer+uiPosY)+uiPosX) = clsColor.GetRGBA();
}
if(true == bRefreshNow)
{
@ -331,7 +318,7 @@ void wxDotLCD::SetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsC
/** Return: RGBA color value of the pixel unit. **/
/** Notice: None. **/
/*************************************************************************/
uint32_t wxDotLCD::GetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY)
uint32_t wxPixelatedPanel::GetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY)
{
/*----------------------------------*/
/* Variable Declaration */
@ -343,9 +330,9 @@ uint32_t wxDotLCD::GetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY)
/*----------------------------------*/
if((uiPosX < m_uiHorizontalPixelNumber) && (uiPosY < m_uiVerticalPixelNumber))
{
if(NULL != m_parrDisplayBuffer)
if(NULL != m_ppuiDisplayBuffer)
{
uiReturnValue = *(m_parrDisplayBuffer+uiPosX+(uiPosY*m_uiHorizontalPixelNumber));
uiReturnValue = *(*(m_ppuiDisplayBuffer+uiPosY)+uiPosX);
}
}
@ -362,15 +349,15 @@ uint32_t wxDotLCD::GetPixelUnitColor(uint32_t uiPosX, uint32_t uiPosY)
/** Return: None. **/
/** Notice: Draw only one pixel directly. **/
/*************************************************************************/
void wxDotLCD::DrawPixel(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor)
void wxPixelatedPanel::DrawPixel(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(m_uiPixelSize != 0)
if((uiPosX < m_uiHorizontalPixelNumber) && (uiPosY < m_uiVerticalPixelNumber) && (m_uiPixelSize != 0))
{
SetDCColor(clsColor);
PrepareDC(m_clsCDC);
_setDCColor(clsColor);
_prepareDC(m_clsCDC);
if(m_uiPixelSize == 1)
{
m_clsCDC.DrawPoint(wxPoint(m_uiEdgeWidth+uiPosX, m_uiEdgeWidth+uiPosY));
@ -387,14 +374,13 @@ void wxDotLCD::DrawPixel(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor)
}
}
SetPixelUnitColor(uiPosX, uiPosY, clsColor);
ReleaseDC(m_clsCDC);
_releaseDC(m_clsCDC);
if(NULL != m_ppuiDisplayBuffer)
{
*(*(m_ppuiDisplayBuffer+uiPosY)+uiPosX) = clsColor.GetRGBA();
}
}
if(NULL != m_parrDisplayBuffer)
{
*(m_parrDisplayBuffer+uiPosX+(uiPosY*m_uiHorizontalPixelNumber)) = clsColor.GetRGBA();
}
}
/*************************************************************************/
@ -406,7 +392,7 @@ void wxDotLCD::DrawPixel(uint32_t uiPosX, uint32_t uiPosY, wxColor& clsColor)
/** all pixels of the LCD panel will be repaint by the **/
/** pixels's RGBA value register array. **/
/*************************************************************************/
void wxDotLCD::RefreshDisplay(void)
void wxPixelatedPanel::RefreshDisplay(void)
{
/*----------------------------------*/
/* Variable Declaration */
@ -430,15 +416,15 @@ void wxDotLCD::RefreshDisplay(void)
wxBufferedDC clsBufferedDC(&m_clsCDC, clsBufferImage);
// Draw background.
SetDCColor(*m_pclsEdgeColor);
PrepareDC(clsBufferedDC);
_setDCColor(*m_pclsEdgeColor);
_prepareDC(clsBufferedDC);
clsBufferedDC.DrawRectangle(wxPoint(0, 0),wxSize(uiPaintSizeWidth, uiPaintSizeHeight));
// Draw grid line.
if((true == m_bGridVisible) && (2 < m_uiPixelSize))
{
SetDCColor(*m_pclsGridColor);
PrepareDC(clsBufferedDC);
_setDCColor(*m_pclsGridColor);
_prepareDC(clsBufferedDC);
clsBufferedDC.DrawRectangle(wxPoint(m_uiEdgeWidth, m_uiEdgeWidth),
wxSize( m_uiHorizontalPixelNumber*m_uiPixelSize+1,
m_uiVerticalPixelNumber*m_uiPixelSize+1));
@ -451,8 +437,8 @@ void wxDotLCD::RefreshDisplay(void)
{
for(uint32_t i_W=0; i_W<m_uiHorizontalPixelNumber; i_W++)
{
SetDCColor(wxColor(*(m_parrDisplayBuffer+(i_W+i_H*m_uiHorizontalPixelNumber))));
PrepareDC(clsBufferedDC);
_setDCColor(wxColor(*(*(m_ppuiDisplayBuffer+i_H)+i_W)));
_prepareDC(clsBufferedDC);
(this->*m_pfDrawPoint)(clsBufferedDC, i_W, i_H, m_uiPixelSize);
}
}
@ -468,7 +454,7 @@ void wxDotLCD::RefreshDisplay(void)
/** all pixels of the LCD panel will be repaint by the **/
/** pixels's RGBA value register array. **/
/*************************************************************************/
void wxDotLCD::ResizeParent(void)
void wxPixelatedPanel::ResizeParent(void)
{
/*----------------------------------*/
/* Variable Declaration */
@ -508,7 +494,7 @@ void wxDotLCD::ResizeParent(void)
/** the wxApp Object. **/
/** wxImage::AddHandler(new wxJPEGHandler) **/
/*************************************************************************/
bool wxDotLCD::SaveScreenImageToFile(const wxString& strFilePath)
bool wxPixelatedPanel::SaveScreenImageToFile(const wxString& strFilePath)
{
/*----------------------------------*/
/* Variable Declaration */
@ -555,7 +541,7 @@ bool wxDotLCD::SaveScreenImageToFile(const wxString& strFilePath)
/** @ false: Copy failed. **/
/** Notice: None. **/
/*************************************************************************/
bool wxDotLCD::CopyScreenImageToClipBoard(void)
bool wxPixelatedPanel::CopyScreenImageToClipBoard(void)
{
/*----------------------------------*/
/* Variable Declaration */
@ -597,3 +583,58 @@ bool wxDotLCD::CopyScreenImageToClipBoard(void)
return bReturn;
}
void wxPixelatedPanel::_freeDisplayBuffer(uint32_t** ppuiDisplayBuffer)
{
if(NULL != ppuiDisplayBuffer)
{
for(uint32_t uiIdxV=0; uiIdxV<m_uiVerticalPixelNumber; uiIdxV++)
{
free(*(ppuiDisplayBuffer+uiIdxV));
}
free(ppuiDisplayBuffer);
}
}
uint32_t** wxPixelatedPanel::_createNewDisplayBuffer(uint32_t uiHorizontalPixelNumber, uint32_t uiVerticalPixelNumber)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
uint32_t** ppuiNewDisplayBuffer;
uint32_t* puiNewHorizontalPixelBuffer;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
ppuiNewDisplayBuffer = NULL;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if((uiHorizontalPixelNumber > 0) && (uiVerticalPixelNumber > 0))
{
ppuiNewDisplayBuffer = (uint32_t**)malloc(sizeof(uint32_t*)*uiVerticalPixelNumber);
if(NULL != ppuiNewDisplayBuffer)
{
memset(ppuiNewDisplayBuffer, 0x00, sizeof(uint32_t*)*uiVerticalPixelNumber);
for(uint32_t uiIdxV=0; uiIdxV<uiVerticalPixelNumber; uiIdxV++)
{
puiNewHorizontalPixelBuffer = (uint32_t*)malloc(sizeof(uint32_t)*uiHorizontalPixelNumber);
if(NULL != puiNewHorizontalPixelBuffer)
{
memset(puiNewHorizontalPixelBuffer, 0x00, sizeof(uint32_t)*uiHorizontalPixelNumber);
*(ppuiNewDisplayBuffer+uiIdxV) = puiNewHorizontalPixelBuffer;
}
else
{
_freeDisplayBuffer(ppuiNewDisplayBuffer);
ppuiNewDisplayBuffer = NULL;
break;
}
}
}
}
return ppuiNewDisplayBuffer;
}