Commit c5b43376 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander Trofimov

Исправлен баг с чтением 2-битных картинок. Сделан клип по пату. Реализованы...

Исправлен баг с чтением 2-битных картинок. Сделан клип по пату. Реализованы команды рисования вслепую, которые не встретились в файлах.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62252 954022d7-b5bf-4e40-9824-e11837661b57
parent 1c437eb9
......@@ -143,29 +143,62 @@ namespace MetaFile
nLastBitCount = (int)pow((double)2, (double)nLastBitCount);
for (int nY = 0, nIndex = 0; nY < abs(nHeight); nY++)
if (nHeight < 0)
{
for (int nX = 0; nX < nWidthBytes; nX++)
for (int nY = 0; nY < abs(nHeight); nY++)
{
int nByte = *pBuffer; pBuffer++; lBufLen--;
int nBitCount = 128;
if (nX == nWidthBytes - 1)
nBitCount = nLastBitCount;
int nIndex = 4 * nWidth * nY;
for (int nX = 0; nX < nWidthBytes; nX++)
{
int nByte = *pBuffer; pBuffer++; lBufLen--;
int nBitCount = 128;
if (nX == nWidthBytes - 1)
nBitCount = nLastBitCount;
for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2)
for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2)
{
int nBit = (nByte & nBitIndex);
TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1);
pBgraBuffer[nIndex + 0] = pColor->b;
pBgraBuffer[nIndex + 1] = pColor->g;
pBgraBuffer[nIndex + 2] = pColor->r;
pBgraBuffer[nIndex + 3] = 255;
nIndex += 4;
}
}
for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++)
{
int nBit = (nByte & nBitIndex);
TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1);
pBgraBuffer[nIndex * 4 + 0] = pColor->b;
pBgraBuffer[nIndex * 4 + 1] = pColor->g;
pBgraBuffer[nIndex * 4 + 2] = pColor->r;
pBgraBuffer[nIndex * 4 + 3] = 255;
nIndex++;
int nByte = *pBuffer; pBuffer++; lBufLen--;
}
}
for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++)
}
else
{
for (int nY = abs(nHeight) - 1; nY >= 0; nY--)
{
int nByte = *pBuffer; pBuffer++; lBufLen--;
int nIndex = 4 * nWidth * nY;
for (int nX = 0; nX < nWidthBytes; nX++)
{
int nByte = *pBuffer; pBuffer++; lBufLen--;
int nBitCount = 128;
if (nX == nWidthBytes - 1)
nBitCount = nLastBitCount;
for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2)
{
int nBit = (nByte & nBitIndex);
TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1);
pBgraBuffer[nIndex + 0] = pColor->b;
pBgraBuffer[nIndex + 1] = pColor->g;
pBgraBuffer[nIndex + 2] = pColor->r;
pBgraBuffer[nIndex + 3] = 255;
nIndex += 4;
}
}
for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++)
{
int nByte = *pBuffer; pBuffer++; lBufLen--;
}
}
}
......
......@@ -258,7 +258,17 @@ namespace MetaFile
*this >> oText.iGraphicsMode;
*this >> oText.exScale;
*this >> oText.eyScale;
*this >> oText.wEmrText;
ReadEmrTextW(oText.wEmrText, 36); // 8 + 28 (8 - , 28 - )
return *this;
}
CDataStream& operator>>(TEmfExtTextoutA& oText)
{
*this >> oText.Bounds;
*this >> oText.iGraphicsMode;
*this >> oText.exScale;
*this >> oText.eyScale;
ReadEmrTextA(oText.aEmrText, 36); // 8 + 28 (8 - , 28 - )
return *this;
}
......@@ -438,6 +448,117 @@ namespace MetaFile
return *this;
}
CDataStream& operator>>(TEmfPolyTextoutA& oText)
{
*this >> oText.Bounds;
*this >> oText.iGraphicsMode;
*this >> oText.exScale;
*this >> oText.eyScale;
*this >> oText.cStrings;
if (0 != oText.cStrings)
{
oText.aEmrText = new TEmfEmrText[oText.cStrings];
if (!oText.aEmrText)
return *this;
unsigned int nStartPos = Tell();
for (unsigned int unIndex = 0; unIndex < oText.cStrings; unIndex++)
{
unsigned int nCurPos = Tell();
ReadEmrTextA(oText.aEmrText[unIndex], nCurPos - nStartPos + 36); // 8 + 28 (8 - , 28 - )
}
}
else
{
oText.aEmrText = NULL;
}
return *this;
}
CDataStream& operator>>(TEmfPolyTextoutW& oText)
{
*this >> oText.Bounds;
*this >> oText.iGraphicsMode;
*this >> oText.exScale;
*this >> oText.eyScale;
*this >> oText.cStrings;
if (0 != oText.cStrings)
{
oText.wEmrText = new TEmfEmrText[oText.cStrings];
if (!oText.wEmrText)
return *this;
unsigned int nStartPos = Tell();
for (unsigned int unIndex = 0; unIndex < oText.cStrings; unIndex++)
{
unsigned int nCurPos = Tell();
ReadEmrTextW(oText.wEmrText[unIndex], nCurPos - nStartPos + 36); // 8 + 28 (8 - , 28 - )
}
}
else
{
oText.wEmrText = NULL;
}
return *this;
}
CDataStream& operator>>(TEmfSmallTextout& oText)
{
*this >> oText.x;
*this >> oText.y;
*this >> oText.cChars;
*this >> oText.fuOptions;
*this >> oText.iGraphicsMode;
*this >> oText.exScale;
*this >> oText.eyScale;
if (!(oText.fuOptions & ETO_NO_RECT))
*this >> oText.Bounds;
oText.TextString = NULL;
if (oText.cChars)
{
unsigned short* pUnicode = NULL;
if (oText.fuOptions & ETO_SMALL_CHARS)
{
unsigned char* pString = new unsigned char[oText.cChars + 1];
if (!pString)
return *this;
pString[oText.cChars] = 0x00;
ReadBytes(pString, oText.cChars);
oText.cChars++;
pUnicode = new unsigned short[oText.cChars];
if (!pUnicode)
{
delete[] pString;
return *this;
}
for (unsigned int unIndex = 0; unIndex < oText.cChars; unIndex++)
{
pUnicode[unIndex] = pString[unIndex];
}
delete[] pString;
}
else
{
pUnicode = new unsigned short[oText.cChars + 1];
if (!pUnicode)
return *this;
pUnicode[oText.cChars] = 0x0000;
ReadBytes(pUnicode, oText.cChars);
oText.cChars++;
}
oText.TextString = pUnicode;
}
return *this;
}
bool IsValid() const
{
......@@ -480,6 +601,45 @@ namespace MetaFile
return (unsigned int)(pEnd - pCur);
}
private:
template<typename T>void ReadEmrTextBase(TEmfEmrText& oText, unsigned int unOffset)
{
*this >> oText;
// OutputString
const unsigned int unCharsCount = oText.Chars;
int nSkip = oText.offString - (unOffset + 40); // 40 - TEmfEmrText
Skip(nSkip);
T* pString = new T[unCharsCount + 1];
if (pString)
{
pString[unCharsCount] = 0x00;
ReadBytes(pString, unCharsCount);
oText.OutputString = (void*)pString;
}
// OutputDx
nSkip = oText.offDx - oText.offString - 2 * unCharsCount;
Skip(nSkip);
const unsigned int unDxCount = oText.Options & ETO_PDY ? 2 * unCharsCount : unCharsCount;
unsigned int* pDx = new unsigned int[unDxCount];
if (pDx)
{
ReadBytes(pDx, unDxCount);
oText.OutputDx = pDx;
}
}
void ReadEmrTextA(TEmfEmrText& oText, unsigned int unOffset)
{
ReadEmrTextBase<unsigned char>(oText, unOffset);
// TODO: Charset
}
void ReadEmrTextW(TEmfEmrText& oText, unsigned int unOffset)
{
ReadEmrTextBase<unsigned short>(oText, unOffset);
}
private:
BYTE *pBuffer;
......
......@@ -25,6 +25,12 @@ namespace MetaFile
pNewCommand = new CEmfClipCommandIntersect(((CEmfClipCommandIntersect*)pCommand)->m_oRect);
break;
}
case EMF_CLIPCOMMAND_SETPATH:
{
CEmfClipCommandPath* pPathCommand = (CEmfClipCommandPath*)pCommand;
pNewCommand = new CEmfClipCommandPath(&pPathCommand->m_oPath, pPathCommand->m_unMode);
break;
}
}
if (pNewCommand)
......@@ -44,9 +50,18 @@ namespace MetaFile
m_vCommands.push_back(pCommand);
return true;
}
bool CEmfClip::SetPath(CEmfPath* pPath, unsigned int unMode)
{
CEmfClipCommandBase* pCommand = new CEmfClipCommandPath(pPath, unMode);
if (!pCommand)
return false;
m_vCommands.push_back(pCommand);
return true;
}
void CEmfClip::ClipOnRenderer(CEmfOutputDevice* pOutput)
{
if (pOutput)
if (!pOutput)
return;
pOutput->ResetClip();
......@@ -61,6 +76,12 @@ namespace MetaFile
pOutput->IntersectClip(pIntersect->m_oRect.lLeft, pIntersect->m_oRect.lTop, pIntersect->m_oRect.lRight, pIntersect->m_oRect.lBottom);
break;
}
case EMF_CLIPCOMMAND_SETPATH:
{
CEmfClipCommandPath* pClipPath = (CEmfClipCommandPath*)pCommand;
pClipPath->m_oPath.Draw(pOutput, false, false, pClipPath->m_unMode);
break;
}
}
}
......
......@@ -76,6 +76,7 @@ namespace MetaFile
void operator=(CEmfClip& oClip);
void Reset();
bool Intersect(TEmfRectL& oRect);
bool SetPath(CEmfPath* pPath, unsigned int umMode);
void ClipOnRenderer(CEmfOutputDevice* pOutput);
private:
......
This diff is collapsed.
......@@ -33,6 +33,9 @@ namespace MetaFile
virtual void ResetClip() = 0;
virtual void IntersectClip(int lLeft, int lTop, int lRight, int lBottom) = 0;
virtual void StartClipPath(unsigned int unMode) = 0;
virtual void EndClipPath(unsigned int unMode) = 0;
virtual void UpdateDC() = 0;
};
......
......@@ -10,7 +10,42 @@ namespace MetaFile
{
if (pPath)
{
for (unsigned int unIndex = 0; unIndex < pPath->m_pCommands.size(); unIndex++)
{
CEmfPathCommandBase* pCommand = pPath->m_pCommands.at(unIndex);
switch (pCommand->GetType())
{
case EMF_PATHCOMMAND_MOVETO:
{
CEmfPathMoveTo* pMoveTo = (CEmfPathMoveTo*)pCommand;
MoveTo(pMoveTo->x, pMoveTo->y);
break;
}
case EMF_PATHCOMMAND_LINETO:
{
CEmfPathLineTo* pLineTo = (CEmfPathLineTo*)pCommand;
LineTo(pLineTo->x, pLineTo->y);
break;
}
case EMF_PATHCOMMAND_CURVETO:
{
CEmfPathCurveTo* pCurveTo = (CEmfPathCurveTo*)pCommand;
CurveTo(pCurveTo->x1, pCurveTo->y1, pCurveTo->x2, pCurveTo->y2, pCurveTo->xE, pCurveTo->yE);
break;
}
case EMF_PATHCOMMAND_ARCTO:
{
CEmfPathArcTo* pArcTo = (CEmfPathArcTo*)pCommand;
ArcTo(pArcTo->left, pArcTo->top, pArcTo->right, pArcTo->bottom, pArcTo->start, pArcTo->sweep);
break;
}
case EMF_PATHCOMMAND_CLOSE:
{
Close();
break;
}
}
}
}
}
CEmfPath::~CEmfPath()
......@@ -127,11 +162,14 @@ namespace MetaFile
return true;
}
void CEmfPath::Draw(CEmfOutputDevice* pOutput, bool bStroke, bool bFill)
void CEmfPath::Draw(CEmfOutputDevice* pOutput, bool bStroke, bool bFill, unsigned int unClipMode)
{
if (pOutput)
{
pOutput->StartPath();
{
if (-1 != unClipMode)
pOutput->StartClipPath(unClipMode);
else
pOutput->StartPath();
for (unsigned int ulIndex = 0; ulIndex < m_pCommands.size(); ulIndex++)
{
......@@ -170,12 +208,19 @@ namespace MetaFile
}
}
int lType = (bStroke ? 1 : 0) + (bFill ? 2 : 0);
pOutput->DrawPath(lType);
pOutput->EndPath();
if (-1 == unClipMode)
{
int lType = (bStroke ? 1 : 0) + (bFill ? 2 : 0);
pOutput->DrawPath(lType);
pOutput->EndPath();
}
else
pOutput->EndClipPath(unClipMode);
}
Clear();
//
if (-1 == unClipMode)
Clear();
}
void CEmfPath::Clear()
{
......
......@@ -204,7 +204,7 @@ namespace MetaFile
bool CurveTo(int lX1, int lY1, int lX2, int lY2, int lXE, int lYE);
bool ArcTo(int lL, int lT, int lR, int lB, double dStart, double dSweep);
bool Close();
void Draw(CEmfOutputDevice* pOutput, bool bStroke, bool bFill);
void Draw(CEmfOutputDevice* pOutput, bool bStroke, bool bFill, unsigned int unClipMode = -1);
private:
......
......@@ -564,8 +564,8 @@ namespace MetaFile
{
return &m_oClip;
}
void CEmfDC::ClipToPath()
void CEmfDC::ClipToPath(CEmfPath* pPath, unsigned int unMode)
{
m_oClip.SetPath(pPath, unMode);
}
}
\ No newline at end of file
......@@ -11,6 +11,7 @@ namespace MetaFile
{
class CEmfFile;
class CEmfDC;
class CEmfPath;
class CEmfPlayer
{
......@@ -96,7 +97,7 @@ namespace MetaFile
void SetCurPos(int lX, int lY);
TEmfPointL& GetCurPos();
CEmfClip* GetClip();
void ClipToPath();
void ClipToPath(CEmfPath* pPath, unsigned int unMode);
private:
......@@ -108,7 +109,7 @@ namespace MetaFile
CEmfLogPen m_oDefaultPen;
CEmfLogBrushEx m_oDefaultBrush;
unsigned int m_ulMapMode;
unsigned int m_ulMapMode;
CEmfLogBrushEx* m_pBrush;
CEmfLogPen* m_pPen;
CEmfLogFont* m_pFont;
......@@ -117,12 +118,12 @@ namespace MetaFile
TEmfXForm m_oInverseTransform;
TEmfColor m_oTextColor;
TEmfColor m_oBgColor;
unsigned int m_ulTextAlign;
unsigned int m_ulBgMode;
unsigned int m_ulMiterLimit;
unsigned int m_ulFillMode;
unsigned int m_ulStretchMode;
unsigned int m_ulRop2Mode;
unsigned int m_ulTextAlign;
unsigned int m_ulBgMode;
unsigned int m_ulMiterLimit;
unsigned int m_ulFillMode;
unsigned int m_ulStretchMode;
unsigned int m_ulRop2Mode;
double m_dPixelWidth;
double m_dPixelHeight;
TEmfWindow m_oWindow;
......
#ifndef _EMF_TYPES_H
#define _EMF_TYPES_H
#include "../../../common/Types.h"
#if !defined(_WIN32) && !defined(_WIN64)
//from wingdi.h
......@@ -151,6 +153,23 @@
#endif
#ifndef EMR_SMALLTEXTOUT
#define EMR_SMALLTEXTOUT EMR_RESERVED_108
#endif
#define ETO_OPAQUE 0x00000002
#define ETO_CLIPPED 0x00000004
#define ETO_GLYPH_INDEX 0x00000010
#define ETO_RTLREADING 0x00000080
#define ETO_NO_RECT 0x00000100
#define ETO_SMALL_CHARS 0x00000200
#define ETO_NUMERICSLOCAL 0x00000400
#define ETO_NUMERICSLATIN 0x00000800
#define ETO_IGNORELANGUAGE 0x00001000
#define ETO_PDY 0x00002000
#define ETO_REVERSE_INDEX_MAP 0x00010000
namespace MetaFile
{
struct TEmfColor
......@@ -274,15 +293,15 @@ namespace MetaFile
{
TEmfRectL oBounds;
TEmfRectL oFrame;
unsigned int ulSignature;
unsigned int ulVersion;
unsigned int ulSize;
unsigned int ulRecords;
unsigned int ulSignature;
unsigned int ulVersion;
unsigned int ulSize;
unsigned int ulRecords;
unsigned short ushObjects;
unsigned short ushReserved;
unsigned int ulSizeDescription;
unsigned int ulOffsetDescription;
unsigned int ulPalEntries;
unsigned int ulSizeDescription;
unsigned int ulOffsetDescription;
unsigned int ulPalEntries;
TEmfSizeL oDevice;
TEmfSizeL oMillimeters;
TEmfRectL oFrameToBounds;
......@@ -290,7 +309,7 @@ namespace MetaFile
struct TEmfStretchDIBITS
{
TEmfRectL Bounds;
TEmfRectL Bounds;
int xDest;
int yDest;
int xSrc;
......@@ -398,32 +417,153 @@ namespace MetaFile
struct TEmfEmrText
{
TEmfPointL Reference;
TEmfPointL Reference;
unsigned int Chars;
unsigned int offString;
unsigned int Options;
TEmfRectL Rectangle;
TEmfRectL Rectangle;
unsigned int offDx;
void* OutputString; // unsinged short* unsigned char*
unsigned int* OutputDx;
void* OutputString; // unsinged short* unsigned char*
unsigned int* OutputDx;
TEmfEmrText()
{
OutputString = NULL;
OutputDx = NULL;
}
void FreeA()
{
if (OutputString)
{
unsigned char* pString = (unsigned char*)OutputString;
delete[] pString;
OutputString = NULL;
}
if (OutputDx)
{
delete[] OutputDx;
OutputDx = NULL;
}
}
void FreeW()
{
if (OutputString)
{
unsigned short* pString = (unsigned short*)OutputString;
delete[] pString;
OutputString = NULL;
}
if (OutputDx)
{
delete[] OutputDx;
OutputDx = NULL;
}
}
};
struct TEmfExtTextoutW
{
TEmfRectL Bounds;
unsigned int iGraphicsMode;
unsigned int iGraphicsMode;
double exScale;
double eyScale;
TEmfEmrText wEmrText;
~TEmfExtTextoutW()
{
Free();
}
void Free()
{
wEmrText.FreeW();
}
};
struct TEmfLogFont
struct TEmfExtTextoutA
{
int Height;
int Width;
int Escapement;
int Orientation;
int Weight;
TEmfRectL Bounds;
unsigned int iGraphicsMode;
double exScale;
double eyScale;
TEmfEmrText aEmrText;
~TEmfExtTextoutA()
{
Free();
}
void Free()
{
aEmrText.FreeA();
}
};
struct TEmfPolyTextoutA
{
TEmfRectL Bounds;
unsigned int iGraphicsMode;
double exScale;
double eyScale;
unsigned int cStrings;
TEmfEmrText* aEmrText;
TEmfPolyTextoutA()
{
aEmrText = NULL;
}
~TEmfPolyTextoutA()
{
if (aEmrText)
{
for (unsigned int unIndex = 0; unIndex < cStrings; unIndex++)
{
aEmrText[unIndex].FreeA();
}
delete[] aEmrText;
aEmrText = NULL;
}
}
};
struct TEmfPolyTextoutW
{
TEmfRectL Bounds;
unsigned int iGraphicsMode;
double exScale;
double eyScale;
unsigned int cStrings;
TEmfEmrText* wEmrText;
TEmfPolyTextoutW()
{
wEmrText = NULL;
}
~TEmfPolyTextoutW()
{
if (wEmrText)
{
for (unsigned int unIndex = 0; unIndex < cStrings; unIndex++)
{
wEmrText[unIndex].FreeW();
}
delete[] wEmrText;
wEmrText = NULL;
}
}
};
struct TEmfLogFont
{
int Height;
int Width;
int Escapement;
int Orientation;
int Weight;
unsigned char Italic;
unsigned char Underline;
unsigned char StrikOut;
......@@ -437,7 +577,7 @@ namespace MetaFile
struct TEmfLogFontEx
{
TEmfLogFont LogFont;
TEmfLogFont LogFont;
unsigned short FullName[64];
unsigned short Style[32];
unsigned short Script[32];
......@@ -452,7 +592,7 @@ namespace MetaFile
struct TEmfBitBlt
{
TEmfRectL Bounds;
TEmfRectL Bounds;
int xDest;
int yDest;
int cxDest;
......@@ -460,8 +600,8 @@ namespace MetaFile
unsigned int BitBltRasterOperation;
int xSrc;
int ySrc;
TEmfXForm XfromSrc;
TEmfColor BkColorSrc;
TEmfXForm XfromSrc;
TEmfColor BkColorSrc;
unsigned int UsageSrc;
unsigned int offBmiSrc;
unsigned int cbBmiSrc;
......@@ -471,7 +611,7 @@ namespace MetaFile
struct TEmfSetDiBitsToDevice
{
TEmfRectL Bounds;
TEmfRectL Bounds;
int xDest;
int yDest;
int xSrc;
......@@ -503,5 +643,45 @@ namespace MetaFile
unsigned char Green;
unsigned char Red;
};
struct TEmfSmallTextout
{
int x;
int y;
unsigned int cChars;
unsigned int fuOptions;
unsigned int iGraphicsMode;
double exScale;
double eyScale;
TEmfRectL Bounds;
unsigned short* TextString;
TEmfSmallTextout()
{
TextString = NULL;
}
~TEmfSmallTextout()
{
if (TextString)
delete[] TextString;
}
unsigned int GetSize()
{
unsigned int unSize = 28;
if (!(fuOptions & ETO_NO_RECT))
unSize += 16;
// .
if (fuOptions & ETO_SMALL_CHARS)
unSize += (cChars - 1);
else
unSize += 2 * (cChars - 1);
return unSize;
}
};
};
#endif //_EMF_TYPES_H
......@@ -370,6 +370,8 @@ namespace MetaFile
}
void IntersectClip(int lLeft, int lTop, int lRight, int lBottom)
{
m_pRenderer->put_ClipMode(c_nClipRegionTypeWinding | c_nClipRegionIntersect);
m_pRenderer->BeginCommand(c_nClipType);
m_pRenderer->BeginCommand(c_nPathType);
m_pRenderer->PathCommandStart();
......@@ -387,6 +389,45 @@ namespace MetaFile
m_pRenderer->EndCommand(c_nClipType);
m_pRenderer->PathCommandEnd();
}
void StartClipPath(unsigned int unMode)
{
CheckEndPath();
m_bStartedPath = true;
unsigned int unClipMode = -1;
switch (unMode)
{
case RGN_AND: unClipMode = c_nClipRegionIntersect; break;
case RGN_OR: unClipMode = c_nClipRegionUnion; break;
case RGN_XOR: unClipMode = c_nClipRegionXor; break;
case RGN_DIFF: unClipMode = c_nClipRegionDiff; break;
default: unClipMode = c_nClipRegionIntersect; break;
}
CEmfDC* pDC = m_pEmfFile->GetDC();
if (!pDC)
return;
unsigned int unFillMode = pDC->GetFillMode();
if (ALTERNATE == unFillMode)
unClipMode |= c_nClipRegionTypeEvenOdd;
else //if (WINDING == unFillMode)
unClipMode |= c_nClipRegionTypeWinding;
m_pRenderer->put_ClipMode(unClipMode);
m_pRenderer->BeginCommand(c_nClipType);
m_pRenderer->BeginCommand(c_nPathType);
m_pRenderer->PathCommandStart();
}
void EndClipPath(unsigned int unMode)
{
m_pRenderer->EndCommand(c_nPathType);
m_pRenderer->EndCommand(c_nClipType);
m_pRenderer->PathCommandEnd();
m_bStartedPath = false;
}
private:
......@@ -573,7 +614,7 @@ namespace MetaFile
private:
IRenderer* m_pRenderer;
int m_lDrawPathType;
int m_lDrawPathType;
double m_dX; //
double m_dY; //
double m_dW; //
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment