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

Исправлены баги с пересчетом координат. Настойки карандаша переделаны на нормальные константы.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62181 954022d7-b5bf-4e40-9824-e11837661b57
parent c0b0338b
......@@ -5,7 +5,25 @@
namespace MetaFile
{
unsigned char GetLowestBit(unsigned long ulValue)
{
if (0 == ulValue)
return 0;
unsigned char unOffset = 0;
unsigned long ulBit = 1;
while (!(ulValue & ulBit))
{
ulBit = ulBit << 1;
unOffset++;
// 32-
if (ulBit & 0x80000000)
return 0;
}
return unOffset;
}
bool ReadImageCoreHeader(BYTE* pHeaderBuffer, unsigned long ulHeaderBufferLen, BYTE* pImageBuffer, unsigned long ulImageBufferLen, BYTE** ppDstBuffer, unsigned long* pulWidth, unsigned long* pulHeight)
{
CDataStream oHeaderStream;
......@@ -159,8 +177,119 @@ namespace MetaFile
}
else if (BI_BITCOUNT_2 == ushBitCount)
{
// TODO: ,
unsigned char unColorTableLen = 16;
if (0 != unColorUsed)
unColorTableLen = (std::min)((unsigned char)16, (unsigned char)unColorUsed);
TRgbQuad oColorTable[16];
if (oHeaderStream.CanRead() < unColorTableLen * 4)
return false;
//
for (unsigned short ushIndex = 0; ushIndex < unColorTableLen; ushIndex++)
{
oHeaderStream >> oColorTable[ushIndex];
}
// 4 - 1
//
long lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight);
if (lCalcLen != lBufLen)
return false;
// 4, 8
int nAdd = 0;
while (0 != div_t(div(nWidth + nAdd, 8)).rem)
{
nAdd++;
}
int nScanLineBytes = (nWidth + nAdd) / 2;
if (lBufLen < (nScanLineBytes * nHeight))
return false;
pBgraBuffer = new BYTE[nWidth * nHeight * 4 * sizeof(BYTE)];
if (NULL == pBgraBuffer)
return false;
ulHeight = (unsigned short)abs(nHeight);
ulWidth = (unsigned short)nWidth;
if (nHeight < 0)
{
for (int nY = 0; nY < abs(nHeight); nY++)
{
for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++)
{
BYTE nByte = *pBuffer; pBuffer++;
int nX = nLineIndex * 2;
int nIndex = 4 * (nWidth * nY + nX);
BYTE nColorIndex = (nByte & 0xf0) >> 4;
if (nX < nWidth)
{
pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b;
pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g;
pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r;
pBgraBuffer[nIndex + 3] = 255;
}
nX = nLineIndex * 2 + 1;
nIndex = 4 * (nWidth * nY + nX);
nColorIndex = nByte & 0x0f;
if (nX < nWidth)
{
pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b;
pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g;
pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r;
pBgraBuffer[nIndex + 3] = 255;
}
}
}
}
else
{
for (int nY = abs(nHeight) - 1; nY >= 0; nY--)
{
for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++)
{
BYTE nByte = *pBuffer; pBuffer++;
int nX = nLineIndex * 2;
int nIndex = 4 * (nWidth * nY + nX);
BYTE nColorIndex = (nByte & 0xf0) >> 4;
if (nX < nWidth)
{
pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b;
pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g;
pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r;
pBgraBuffer[nIndex + 3] = 255;
}
nX = nLineIndex * 2 + 1;
nIndex = 4 * (nWidth * nY + nX);
nColorIndex = nByte & 0x0f;
if (nX < nWidth)
{
pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b;
pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g;
pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r;
pBgraBuffer[nIndex + 3] = 255;
}
}
}
}
*ppDstBuffer = pBgraBuffer;
*pulWidth = ulWidth;
*pulHeight = ulHeight;
return true;
}
else if (BI_BITCOUNT_3 == ushBitCount)
{
......@@ -170,7 +299,7 @@ namespace MetaFile
ushColorTableLen = (std::min)((unsigned short)256, (unsigned short)unColorUsed);
TRgbQuad oColorTable[256];
if (lBufLen < ushColorTableLen * 4)
if (oHeaderStream.CanRead() < ushColorTableLen * 4)
return false;
//
......@@ -242,11 +371,33 @@ namespace MetaFile
}
else if (BI_BITCOUNT_4 == ushBitCount)
{
// ( )
pBuffer += unColorUsed * 4; lBufLen -= unColorUsed * 4;
unsigned long ulMaskR = 0x1f, ulMaskB = 0x7C00, ulMaskG = 0x3E0;
unsigned long ulShiftR = 0, ulShiftB = 10, ulShiftG = 5;
double dKoefR = 255 / 31.0, dKoefB = 255 / 31.0, dKoefG = 255 / 31.0;
if (BI_RGB != unCompression)
return false; // TODO: ,
if (BI_RGB == unCompression)
{
// ,
// 000000000011111 - Red
// 000001111100000 - Green
// 111110000000000 - Blue
}
else if (BI_BITFIELDS == unCompression)
{
oHeaderStream >> ulMaskR;
oHeaderStream >> ulMaskG;
oHeaderStream >> ulMaskB;
ulShiftR = GetLowestBit(ulMaskR);
ulShiftB = GetLowestBit(ulMaskB);
ulShiftG = GetLowestBit(ulMaskG);
dKoefR = 255.0 / (ulMaskR >> ulShiftR);
dKoefG = 255.0 / (ulMaskG >> ulShiftG);
dKoefB = 255.0 / (ulMaskB >> ulShiftB);
}
else
return false;
//
long lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight);
......@@ -276,14 +427,15 @@ namespace MetaFile
{
int nIndex = 4 * (nWidth * nY + nX);
unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 32767; pBuffer += 2; lBufLen -= 2;
unsigned char unR = ushValue & 31; // 000000000011111
unsigned char unG = (ushValue & 992) >> 5; // 000001111100000
unsigned char unB = (ushValue & 31744) >> 10; // 111110000000000
unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2;
unsigned char unR = (ushValue & ulMaskR) >> ulShiftR;
unsigned char unG = (ushValue & ulMaskG) >> ulShiftG;
unsigned char unB = (ushValue & ulMaskB) >> ulShiftB;
pBgraBuffer[nIndex + 0] = (unsigned char)(unR / 31.0 * 255);
pBgraBuffer[nIndex + 1] = (unsigned char)(unG / 31.0 * 255);
pBgraBuffer[nIndex + 2] = (unsigned char)(unB / 31.0 * 255);
pBgraBuffer[nIndex + 0] = (unsigned char)(unB * dKoefB);
pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG);
pBgraBuffer[nIndex + 2] = (unsigned char)(unR * dKoefR);
pBgraBuffer[nIndex + 3] = 255;
}
pBuffer += nAdd; lBufLen -= nAdd;
......@@ -297,14 +449,14 @@ namespace MetaFile
{
int nIndex = 4 * (nWidth * nY + nX);
unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 32767; pBuffer += 2; lBufLen -= 2;
unsigned char unR = ushValue & 31; // 000000000011111
unsigned char unG = (ushValue & 992) >> 5; // 000001111100000
unsigned char unB = (ushValue & 31744) >> 10; // 111110000000000
unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2;
unsigned char unR = (ushValue & ulMaskR) >> ulShiftR;
unsigned char unG = (ushValue & ulMaskG) >> ulShiftG;
unsigned char unB = (ushValue & ulMaskB) >> ulShiftB;
pBgraBuffer[nIndex + 0] = (unsigned char)(unR / 31.0 * 255);
pBgraBuffer[nIndex + 1] = (unsigned char)(unG / 31.0 * 255);
pBgraBuffer[nIndex + 2] = (unsigned char)(unB / 31.0 * 255);
pBgraBuffer[nIndex + 0] = (unsigned char)(unB * dKoefB);
pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG);
pBgraBuffer[nIndex + 2] = (unsigned char)(unR * dKoefR);
pBgraBuffer[nIndex + 3] = 255;
}
pBuffer += nAdd; lBufLen -= nAdd;
......
......@@ -475,6 +475,11 @@ namespace MetaFile
pCur = pBuffer;
}
unsigned long CanRead()
{
return (unsigned long)(pEnd - pCur);
}
private:
BYTE *pBuffer;
......
......@@ -144,17 +144,8 @@ namespace MetaFile
//-----------------------------------------------------------
// 2.3.4 Control
//-----------------------------------------------------------
case EMR_HEADER:
{
Read_EMR_HEADER();
break;
}
case EMR_EOF:
{
Read_EMR_EOF();
bEof = true;
break;
}
case EMR_HEADER: Read_EMR_HEADER(); break;
case EMR_EOF: Read_EMR_EOF(); bEof = true; break;
//-----------------------------------------------------------
// 2.3.5 Drawing
//-----------------------------------------------------------
......@@ -176,185 +167,59 @@ namespace MetaFile
//-----------------------------------------------------------
// 2.3.7 Object Creation
//-----------------------------------------------------------
case EMR_CREATEBRUSHINDIRECT:
{
Read_EMR_CREATEBRUSHINDIRECT();
break;
}
case EMR_CREATEPEN:
{
Read_EMR_CREATEPEN();
break;
}
case EMR_EXTCREATEFONTINDIRECTW:
{
Read_EMR_EXTCREATEFONTINDIRECTW();
break;
}
case EMR_EXTCREATEPEN:
{
Read_EMR_EXTCREATEPEN();
break;
}
case EMR_CREATEDIBPATTERNBRUSHPT:
{
Read_EMR_CREATEDIBPATTERNBRUSHPT();
break;
}
case EMR_CREATEBRUSHINDIRECT: Read_EMR_CREATEBRUSHINDIRECT(); break;
case EMR_CREATEPEN: Read_EMR_CREATEPEN(); break;
case EMR_EXTCREATEFONTINDIRECTW: Read_EMR_EXTCREATEFONTINDIRECTW(); break;
case EMR_EXTCREATEPEN: Read_EMR_EXTCREATEPEN(); break;
case EMR_CREATEDIBPATTERNBRUSHPT: Read_EMR_CREATEDIBPATTERNBRUSHPT(); break;
case EMR_CREATEPALETTE: Read_EMR_CREATEPALETTE(); break;
//-----------------------------------------------------------
// 2.3.8 Object Manipulation
//-----------------------------------------------------------
case EMR_SELECTOBJECT:
{
Read_EMR_SELECTOBJECT();
break;
}
case EMR_DELETEOBJECT:
{
Read_EMR_DELETEOBJECT();
break;
}
case EMR_SELECTOBJECT: Read_EMR_SELECTOBJECT(); break;
case EMR_DELETEOBJECT: Read_EMR_DELETEOBJECT(); break;
case EMR_SELECTPALETTE: Read_EMR_SELECTPALETTE(); break;
//-----------------------------------------------------------
// 2.3.10 Path Bracket
//-----------------------------------------------------------
case EMR_BEGINPATH:
{
Read_EMR_BEGINPATH();
break;
}
case EMR_ENDPATH:
{
Read_EMR_ENDPATH();
break;
}
case EMR_CLOSEFIGURE:
{
Read_EMR_CLOSEFIGURE();
break;
}
case EMR_FLATTENPATH:
{
Read_EMR_FLATTENPATH();
break;
}
case EMR_WIDENPATH:
{
Read_EMR_WIDENPATH();
break;
}
case EMR_ABORTPATH:
{
Read_EMR_ABORTPATH();
break;
}
case EMR_BEGINPATH: Read_EMR_BEGINPATH(); break;
case EMR_ENDPATH: Read_EMR_ENDPATH(); break;
case EMR_CLOSEFIGURE: Read_EMR_CLOSEFIGURE(); break;
case EMR_FLATTENPATH: Read_EMR_FLATTENPATH(); break;
case EMR_WIDENPATH: Read_EMR_WIDENPATH(); break;
case EMR_ABORTPATH: Read_EMR_ABORTPATH(); break;
//-----------------------------------------------------------
// 2.3.11 State
//-----------------------------------------------------------
case EMR_MOVETOEX:
{
Read_EMR_MOVETOEX();
break;
}
case EMR_SAVEDC:
{
Read_EMR_SAVEDC();
break;
}
case EMR_RESTOREDC:
{
Read_EMR_RESTOREDC();
break;
}
case EMR_SETTEXTCOLOR:
{
Read_EMR_SETTEXTCOLOR();
break;
}
case EMR_SETTEXTALIGN:
{
Read_EMR_SETTEXTALIGN();
break;
}
case EMR_SETBKMODE:
{
Read_EMR_SETBKMODE();
break;
}
case EMR_SETMITERLIMIT:
{
Read_EMR_SETMITERLIMIT();
break;
}
case EMR_SETPOLYFILLMODE:
{
Read_EMR_SETPOLYFILLMODE();
break;
}
case EMR_SETMAPMODE:
{
Read_EMR_SETMAPMODE();
break;
}
case EMR_SETWINDOWORGEX:
{
Read_EMR_SETWINDOWORGEX();
break;
}
case EMR_SETWINDOWEXTEX:
{
Read_EMR_SETWINDOWEXTEX();
break;
}
case EMR_SETVIEWPORTORGEX:
{
Read_EMR_SETVIEWPORTORGEX();
break;
}
case EMR_SETVIEWPORTEXTEX:
{
Read_EMR_SETVIEWPORTEXTEX();
break;
}
case EMR_SETBKCOLOR:
{
Read_EMR_SETBKCOLOR();
break;
}
case EMR_SETSTRETCHBLTMODE:
{
Read_EMR_SETSTRETCHBLTMODE();
break;
}
case EMR_SETICMMODE:
{
Read_EMR_SETICMMODE();
break;
}
case EMR_MOVETOEX: Read_EMR_MOVETOEX(); break;
case EMR_SAVEDC: Read_EMR_SAVEDC(); break;
case EMR_RESTOREDC: Read_EMR_RESTOREDC(); break;
case EMR_SETTEXTCOLOR: Read_EMR_SETTEXTCOLOR(); break;
case EMR_SETTEXTALIGN: Read_EMR_SETTEXTALIGN(); break;
case EMR_SETBKMODE: Read_EMR_SETBKMODE(); break;
case EMR_SETMITERLIMIT: Read_EMR_SETMITERLIMIT(); break;
case EMR_SETPOLYFILLMODE: Read_EMR_SETPOLYFILLMODE(); break;
case EMR_SETMAPMODE: Read_EMR_SETMAPMODE(); break;
case EMR_SETWINDOWORGEX: Read_EMR_SETWINDOWORGEX(); break;
case EMR_SETWINDOWEXTEX: Read_EMR_SETWINDOWEXTEX(); break;
case EMR_SETVIEWPORTORGEX: Read_EMR_SETVIEWPORTORGEX(); break;
case EMR_SETVIEWPORTEXTEX: Read_EMR_SETVIEWPORTEXTEX(); break;
case EMR_SETBKCOLOR: Read_EMR_SETBKCOLOR(); break;
case EMR_SETSTRETCHBLTMODE: Read_EMR_SETSTRETCHBLTMODE(); break;
case EMR_SETICMMODE: Read_EMR_SETICMMODE(); break;
case EMR_SETROP2: Read_EMR_SETROP2(); break;
case EMR_REALIZEPALETTE: Read_EMR_REALIZEPALETTE(); break;
case EMR_SETLAYOUT: Read_EMR_SETLAYOUT(); break;
case EMR_SETBRUSHORGEX: Read_EMR_SETBRUSHORGEX(); break;
//-----------------------------------------------------------
// 2.3.12 Transform
//-----------------------------------------------------------
case EMR_SETWORLDTRANSFORM:
{
Read_EMR_SETWORLDTRANSFORM();
break;
}
case EMR_MODIFYWORLDTRANSFORM:
{
Read_EMR_MODIFYWORLDTRANSFORM();
break;
}
case EMR_SETWORLDTRANSFORM: Read_EMR_SETWORLDTRANSFORM(); break;
case EMR_MODIFYWORLDTRANSFORM: Read_EMR_MODIFYWORLDTRANSFORM(); break;
//-----------------------------------------------------------
//
//-----------------------------------------------------------
case EMR_GDICOMMENT:
{
Read_EMR_UNKNOWN();
break;
}
case EMR_GDICOMMENT: Read_EMR_UNKNOWN(); break;
//-----------------------------------------------------------
//
//-----------------------------------------------------------
......@@ -454,7 +319,7 @@ namespace MetaFile
TEmfWindow* pWindow = m_pDC->GetWindow();
TEmfWindow* pViewport = m_pDC->GetViewport();
dDstX = pWindow->lX + (double)((double)(lSrcX - pViewport->lX / m_pDC->GetPixelWidth()) * m_pDC->GetPixelWidth());
dDstX = (double)((double)(lSrcX - pWindow->lX) * m_pDC->GetPixelWidth()) + pViewport->lX;
return dDstX;
}
double TranslateY(long lSrcY)
......@@ -464,7 +329,7 @@ namespace MetaFile
TEmfWindow* pWindow = m_pDC->GetWindow();
TEmfWindow* pViewport = m_pDC->GetViewport();
dDstY = pWindow->lY + (double)((double)(lSrcY - pViewport->lY / m_pDC->GetPixelHeight()) * m_pDC->GetPixelHeight());
dDstY = (double)((double)(lSrcY - pWindow->lY) * m_pDC->GetPixelHeight()) + pViewport->lY;
return dDstY;
}
......@@ -593,11 +458,24 @@ namespace MetaFile
unsigned long ulRemaining = m_ulRecordSize - 80; // sizeof(TEmfHeader)
m_oStream.Skip(ulRemaining);
double dL = m_oHeader.oFrame.lLeft / 100.0 / m_oHeader.oMillimeters.cx * m_oHeader.oDevice.cx;
double dR = m_oHeader.oFrame.lRight / 100.0 / m_oHeader.oMillimeters.cx * m_oHeader.oDevice.cx;
double dT = m_oHeader.oFrame.lTop / 100.0 / m_oHeader.oMillimeters.cy * m_oHeader.oDevice.cy;
double dB = m_oHeader.oFrame.lBottom / 100.0 / m_oHeader.oMillimeters.cy * m_oHeader.oDevice.cy;
double dW = dR - dL;
double dH = dB - dT;
long lL = (long)std::floor(dL + 0.5);
long lT = (long)std::floor(dT + 0.5);
long lR = (long)std::floor(dW + 0.5) + lL;
long lB = (long)std::floor(dH + 0.5) + lT;
// , oBounds, , .
m_oHeader.oFrameToBounds.lLeft = (long)(m_oHeader.oFrame.lLeft / 100.0 / m_oHeader.oMillimeters.cx * m_oHeader.oDevice.cx);
m_oHeader.oFrameToBounds.lRight = (long)(m_oHeader.oFrame.lRight / 100.0 / m_oHeader.oMillimeters.cx * m_oHeader.oDevice.cx);
m_oHeader.oFrameToBounds.lTop = (long)(m_oHeader.oFrame.lTop / 100.0 / m_oHeader.oMillimeters.cy * m_oHeader.oDevice.cy);
m_oHeader.oFrameToBounds.lBottom = (long)(m_oHeader.oFrame.lBottom/ 100.0 / m_oHeader.oMillimeters.cy * m_oHeader.oDevice.cy);
m_oHeader.oFrameToBounds.lLeft = lL;
m_oHeader.oFrameToBounds.lRight = lR;
m_oHeader.oFrameToBounds.lTop = lT;
m_oHeader.oFrameToBounds.lBottom = lB;
}
void Read_EMR_STRETCHDIBITS()
{
......@@ -663,9 +541,9 @@ namespace MetaFile
{
//
pBgraBuffer = new BYTE[4];
pBgraBuffer[0] = pBrush->Color.r;
pBgraBuffer[0] = pBrush->Color.b;
pBgraBuffer[1] = pBrush->Color.g;
pBgraBuffer[2] = pBrush->Color.b;
pBgraBuffer[2] = pBrush->Color.r;
pBgraBuffer[3] = 0xff;
ulWidth = 1;
......@@ -1025,6 +903,9 @@ namespace MetaFile
m_pPath = new CEmfPath();
if (!m_pPath)
SetError();
// MoveTo BeginPath
m_pPath->MoveTo(m_pDC->GetCurPos());
}
void Read_EMR_ENDPATH()
{
......@@ -1173,20 +1054,6 @@ namespace MetaFile
ClosePath();
DrawPath(true, true);
}
void Read_EMR_SELECTCLIPPATH()
{
unsigned long ulRegionMode;
m_oStream >> ulRegionMode;
// TODO:
}
void Read_EMR_SETBKCOLOR()
{
TEmfColor oColor;
m_oStream >> oColor;
// TODO:
UpdateOutputDC();
}
void Read_EMR_SETSTRETCHBLTMODE()
{
unsigned long ulStretchMode;
......@@ -1240,6 +1107,20 @@ namespace MetaFile
DrawPath(true, false);
}
void Read_EMR_SELECTCLIPPATH()
{
unsigned long ulRegionMode;
m_oStream >> ulRegionMode;
// TODO:
}
void Read_EMR_SETBKCOLOR()
{
TEmfColor oColor;
m_oStream >> oColor;
// TODO:
UpdateOutputDC();
}
void Read_EMR_EXTSELECTCLIPRGN()
{
unsigned long ulRgnDataSize, ulRegionMode;
......@@ -1250,6 +1131,9 @@ namespace MetaFile
}
void Read_EMR_SETMETARGN()
{
//
// TODO:
}
void Read_EMR_ELLIPSE()
......@@ -1390,6 +1274,20 @@ namespace MetaFile
delete[] pPolylinePointCount;
}
void Read_EMR_SETLAYOUT()
{
unsigned long ulLayoutMode;
m_oStream >> ulLayoutMode;
// TODO:
}
void Read_EMR_SETBRUSHORGEX()
{
TEmfPointL oOrigin;
m_oStream >> oOrigin;
// TODO:
}
private:
......
......@@ -386,13 +386,13 @@ namespace MetaFile
Copy(&oOther);
}
}
void Apply(double* pX, double* pY)
void Apply(double& dX, double& dY)
{
double dX = *pX;
double dY = *pY;
double _dX = dX;
double _dY = dY;
*pX = dX * M11 + dY * M21 + Dx;
*pY = dX * M12 + dY * M22 + Dy;
dX = _dX * M11 + _dY * M21 + Dx;
dY = _dX * M12 + _dY * M22 + Dy;
}
};
......
......@@ -7,6 +7,7 @@
#include "../../../graphics/Image.h"
#include "../../../raster/ImageFileFormatChecker.h"
#include "../../../raster/BgraFrame.h"
#include "../../../graphics/AggPlusEnums.h"
#include "EmfOutputDevice.h"
#include "EmfFile.h"
......@@ -101,10 +102,8 @@ namespace MetaFile
if (lLogicalFontHeight < 0.01)
lLogicalFontHeight = 18;
TEmfRectL* pBounds = m_pEmfFile->GetDCBounds();
TEmfPointD oHeightPoint = TranslatePoint(0, lLogicalFontHeight + pBounds->lTop);
double dFontHeight = lLogicalFontHeight * m_dScaleY * pDC->GetPixelHeight() / 25.4 * 72;
double dFontHeight = oHeightPoint.y / 25.4 * 72;
std::wstring wsFaceName((const wchar_t*)pLogFont->FaceName);
m_pRenderer->put_FontName(wsFaceName);
m_pRenderer->put_FontSize(dFontHeight);
......@@ -260,6 +259,8 @@ namespace MetaFile
void StartPath()
{
CheckEndPath();
UpdateTransform();
m_lDrawPathType = -1;
......@@ -395,16 +396,22 @@ namespace MetaFile
double dX = m_pEmfFile->TranslateX(lX);
double dY = m_pEmfFile->TranslateY(lY);
//
// . ,
// .
TEmfRectL* pBounds = m_pEmfFile->GetDCBounds();
double dT = pBounds->lTop;
double dL = pBounds->lLeft;
TEmfXForm* pInverse = m_pEmfFile->GetDC()->GetInverseTransform();
pInverse->Apply(&dL, &dT);
TEmfXForm* pTransform = m_pEmfFile->GetDC()->GetTransform();
pTransform->Apply(dX, dY);
dX -= dL;
dY -= dT;
pInverse->Apply(dX, dY);
TEmfPointD oPoint;
oPoint.x = m_dScaleX * (double)(dX - dL) + m_dX;
oPoint.y = m_dScaleY * (double)(dY - dT) + m_dY;
oPoint.x = m_dScaleX * dX + m_dX;
oPoint.y = m_dScaleY * dY + m_dY;
return oPoint;
}
......@@ -473,20 +480,20 @@ namespace MetaFile
unsigned long ulPenStyle = pPen->PenStyle & PS_STYLE_MASK;
BYTE nCapStyle = 0;
if (0 == ulPenEndCap)
nCapStyle = 2;
else if (1 == ulPenEndCap)
nCapStyle = 1;
else if (2 == ulPenEndCap)
nCapStyle = 0;
if (PS_ENDCAP_ROUND == ulPenEndCap)
nCapStyle = Aggplus::LineCapRound;
else if (PS_ENDCAP_SQUARE == ulPenEndCap)
nCapStyle = Aggplus::LineCapSquare;
else if (PS_ENDCAP_FLAT == ulPenEndCap)
nCapStyle = Aggplus::LineCapFlat;
BYTE nJoinStyle = 0;
if (0 == ulPenJoin)
nJoinStyle = 2;
else if (1 == ulPenJoin)
nJoinStyle = 1;
else if (2 == ulPenJoin)
nJoinStyle = 2;
if (PS_JOIN_ROUND == ulPenJoin)
nJoinStyle = Aggplus::LineJoinRound;
else if (PS_JOIN_BEVEL == ulPenJoin)
nJoinStyle = Aggplus::LineJoinBevel;
else if (PS_JOIN_MITER == ulPenJoin)
nJoinStyle = Aggplus::LineJoinMiter;
double dMiterLimit = pDC->GetMiterLimit() * m_dScaleX * pDC->GetPixelWidth();
......
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