This commit is contained in:
Green
2024-09-30 14:29:03 +03:00
parent b518d5642f
commit 7d9e756f3f
29 changed files with 118 additions and 78 deletions

View File

@ -50,7 +50,7 @@ namespace MetaFile
virtual void End() = 0;
// pBuffer - BGRA картинка размерами ulWidth, ulHeight, которую надо нарисовать в заданном ректе
virtual void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) = 0;
virtual void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int nBlendMode) = 0;
virtual void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) = 0;

View File

@ -236,7 +236,7 @@ namespace MetaFile
m_bUpdatedClip = false;
}
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight)
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
if (!pBuffer || 0 == unWidth || 0 == unHeight)
return;
@ -284,7 +284,11 @@ namespace MetaFile
m_pRenderer->SetTransform(dKx * dM11, dKx * dM12, dKy * dM21, dKy * dM22, dShiftKoefX * dM11 + dShiftKoefY * dM21 + dMx, dShiftKoefX * dM12 + dShiftKoefY * dM22 + dMy);
}
m_pRenderer->BeginCommand(c_nLayerType);
m_pRenderer->put_BlendMode(unBlendMode);
m_pRenderer->DrawImage(&oImage, dImageX, dImageY, dImageW, dImageH);
m_pRenderer->EndCommand(c_nLayerType);
m_pRenderer->put_BlendMode(BLEND_MODE_DEFAULT);
}
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints)
{

View File

@ -348,6 +348,12 @@ typedef unsigned char BYTE;
#define HS_OUTLINEDDIAMOND 51
#define HS_SOLIDDIAMOND 52
//Blend mode's
#define BLEND_MODE_SRC_OVER 3
#define BLEND_MODE_XOR 11
#define BLEND_MODE_DRAW_ON_BLACK 28
#define BLEND_MODE_DEFAULT BLEND_MODE_SRC_OVER
namespace MetaFile
{
#define DEFAULT_FONT_SIZE 14

View File

@ -93,7 +93,7 @@ namespace MetaFile
return false;
}
bool ReadImageInfoHeader(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight)
bool ReadImageInfoHeader(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight, unsigned int& unColorUsed)
{
CDataStream oHeaderStream;
oHeaderStream.SetStream(pHeaderBuffer, ulHeaderBufferLen);
@ -108,7 +108,6 @@ namespace MetaFile
unsigned int unImageSize;
unsigned int unXPelsPerMeter;
unsigned int unYPelsPerMeter;
unsigned int unColorUsed;
unsigned int unColorImportant;
oHeaderStream >> nWidth;
@ -817,7 +816,7 @@ namespace MetaFile
return false;
}
void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight)
void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight, unsigned int& unColorUsed)
{
if (ulHeaderBufferLen <= 0 || NULL == pHeaderBuffer || NULL == pImageBuffer || ulImageBufferLen < 0)
return;
@ -834,9 +833,9 @@ namespace MetaFile
else if (0x0000000C == ulHeaderSize) // BitmapCoreHeader
ReadImageCoreHeader(pHeaderBuffer + 4, ulHeaderBufferLen - 4, pImageBuffer, ulImageBufferLen, ppDstBuffer, pulWidth, pulHeight);
else // BitmapInfoHeader
ReadImageInfoHeader(pHeaderBuffer + 4, ulHeaderBufferLen - 4, pImageBuffer, ulImageBufferLen, ppDstBuffer, pulWidth, pulHeight);
ReadImageInfoHeader(pHeaderBuffer + 4, ulHeaderBufferLen - 4, pImageBuffer, ulImageBufferLen, ppDstBuffer, pulWidth, pulHeight, unColorUsed);
}
void ReadImage(BYTE* pImageBuffer, unsigned int unBufferLen, unsigned int unColorUsage, BYTE** ppDstBuffer, unsigned int* punWidth, unsigned int* punHeight)
void ReadImage(BYTE* pImageBuffer, unsigned int unBufferLen, unsigned int unColorUsage, BYTE** ppDstBuffer, unsigned int* punWidth, unsigned int* punHeight, unsigned int& unColorUsed)
{
if (unBufferLen <= 0 || NULL == pImageBuffer)
return;
@ -866,7 +865,7 @@ namespace MetaFile
unsigned int unImageSize;
unsigned int unXPelsPerMeter;
unsigned int unYPelsPerMeter;
unsigned int unColorUsed;
// unsigned int unColorUsed;
unsigned int unColorImportant;
oHeaderStream >> nWidth;
@ -897,7 +896,7 @@ namespace MetaFile
}
unHeaderSize += 4 * unColorUsed; // RGBQuad
ReadImageInfoHeader(pImageBuffer + 4, unHeaderSize - 4, pImageBuffer + unHeaderSize, unBufferLen - unHeaderSize, ppDstBuffer, punWidth, punHeight);
ReadImageInfoHeader(pImageBuffer + 4, unHeaderSize - 4, pImageBuffer + unHeaderSize, unBufferLen - unHeaderSize, ppDstBuffer, punWidth, punHeight, unColorUsed);
}
else
{
@ -982,21 +981,6 @@ namespace MetaFile
for (unsigned int unIndex = 3; unIndex < unWidth * 4 * unHeight; unIndex += 4)
pBgra[unIndex] = 0xff;
}
else if (0x00660046 == unRasterOperation) //SRCINVERT
{
BYTE* pCur = pBgra;
for (unsigned int unY = 0; unY < unHeight; unY++)
{
for (unsigned int unX = 0; unX < unWidth; unX++)
{
unsigned int unIndex = (unY * unWidth + unX) * 4;
if (0x00 == pCur[unIndex + 0] && 0x00 == pCur[unIndex + 1] && 0x00 == pCur[unIndex + 2])
pCur[unIndex + 3] = 0;
}
}
}
}
std::wstring GetTempFilename(const std::wstring& sFolder)

View File

@ -1174,8 +1174,8 @@ namespace MetaFile
BYTE *pEnd;
};
void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight);
void ReadImage(BYTE* pImageBuffer, unsigned int unBufferLen, unsigned int unColorUsage, BYTE** ppDstBuffer, unsigned int* punWidth, unsigned int* punHeight);
void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight, unsigned int& unColorUsed);
void ReadImage(BYTE* pImageBuffer, unsigned int unBufferLen, unsigned int unColorUsage, BYTE** ppDstBuffer, unsigned int* punWidth, unsigned int* punHeight, unsigned int& unColorUsed);
double GetEllipseAngle(int nL, int nT, int nR, int nB, int nX, int nY);
void ProcessRasterOperation(unsigned int unRasterOperation, BYTE** ppBgra, unsigned int unWidth, unsigned int unHeight);
std::wstring GetTempFilename(const std::wstring& sFolder = L"");

View File

@ -215,7 +215,7 @@ namespace MetaFile
void Begin() override {};
void End() override {};
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override {};
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override {};
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};

View File

@ -73,10 +73,10 @@ namespace MetaFile
pInterpretator->End();
}
void CEmfInterpretatorArray::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CEmfInterpretatorArray::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
for (CEmfInterpretatorBase* pInterpretator : m_arInterpretators)
pInterpretator->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight);
pInterpretator->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight, unBlendMode);
}
void CEmfInterpretatorArray::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,

View File

@ -33,7 +33,7 @@ namespace MetaFile
void Begin() override;
void End() override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;

View File

@ -34,10 +34,10 @@ namespace MetaFile
m_pMetaFileRenderer->End();
}
void CEmfInterpretatorRender::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CEmfInterpretatorRender::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
if (NULL != m_pMetaFileRenderer)
m_pMetaFileRenderer->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight);
m_pMetaFileRenderer->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight, unBlendMode);
}
void CEmfInterpretatorRender::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,

View File

@ -19,7 +19,7 @@ namespace MetaFile
void Begin() override;
void End() override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;

View File

@ -1477,9 +1477,9 @@ namespace MetaFile
m_bUpdatedClip = false;
}
void CEmfInterpretatorSvg::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CEmfInterpretatorSvg::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
CInterpretatorSvgBase::DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight);
CInterpretatorSvgBase::DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight, unBlendMode);
}
void CEmfInterpretatorSvg::ResetClip()

View File

@ -195,7 +195,7 @@ namespace MetaFile
private:
TSvgConditional m_oSecondConditional;
public:
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
//Следующие методы ничего не делают
void Begin() override {};

View File

@ -213,7 +213,7 @@ namespace MetaFile
void End() override;
//Следующие методы ничего не делают
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override {};
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override {};
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};

View File

@ -449,8 +449,9 @@ namespace MetaFile
unsigned int ulBitsSizeSkip = 0 == ulBitsSize ? 0 : ((int)(((double)ulBitsSize - 0.5) / 4) + 1) * 4;
m_oStream.Skip(ulBitsSizeSkip);
unsigned int unColorUsed;
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight);
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight, unColorUsed);
return true;
}

View File

@ -64,7 +64,7 @@ namespace MetaFile
DrawImage(oTEmfAlphaBlend.nXDest, oTEmfAlphaBlend.nYDest,
oTEmfAlphaBlend.nCxDest, oTEmfAlphaBlend.nCyDest,
pBgraBuffer, unWidth, unHeight);
pBgraBuffer, unWidth, unHeight, BLEND_MODE_DEFAULT);
}
}
@ -84,9 +84,10 @@ namespace MetaFile
if (m_pInterpretator)
{
ProcessRasterOperation(oTEmfStretchDIBITS.unBitBltRasterOperation, &pBgraBuffer, ulWidth, ulHeight);
DrawImage(oTEmfStretchDIBITS.nXDest, oTEmfStretchDIBITS.nYDest,
oTEmfStretchDIBITS.nCxDest, oTEmfStretchDIBITS.nCyDest,
pBgraBuffer, ulWidth, ulHeight);
pBgraBuffer, ulWidth, ulHeight, BLEND_MODE_DEFAULT);
}
}
@ -108,7 +109,7 @@ namespace MetaFile
{
DrawImage(oTEmfBitBlt.nXDest, oTEmfBitBlt.nYDest,
oTEmfBitBlt.nCxDest, oTEmfBitBlt.nCyDest,
pBgraBuffer, ulWidth, ulHeight);
pBgraBuffer, ulWidth, ulHeight, BLEND_MODE_DEFAULT);
}
else
{
@ -158,7 +159,7 @@ namespace MetaFile
if (pBgraBuffer)
DrawImage(oTEmfBitBlt.nXDest, oTEmfBitBlt.nYDest,
oTEmfBitBlt.nCxDest, oTEmfBitBlt.nCyDest,
pBgraBuffer, ulWidth, ulHeight);
pBgraBuffer, ulWidth, ulHeight, BLEND_MODE_DEFAULT);
}
if (pBgraBuffer)
@ -177,7 +178,7 @@ namespace MetaFile
DrawImage(oTEmfSetDiBitsToDevice.oBounds.Left, oTEmfSetDiBitsToDevice.oBounds.Top,
oTEmfSetDiBitsToDevice.oBounds.Right - oTEmfSetDiBitsToDevice.oBounds.Left,
oTEmfSetDiBitsToDevice.oBounds.Bottom - oTEmfSetDiBitsToDevice.oBounds.Top,
pBgraBuffer, ulWidth, ulHeight);
pBgraBuffer, ulWidth, ulHeight, BLEND_MODE_DEFAULT);
}
if (pBgraBuffer)
@ -197,9 +198,15 @@ namespace MetaFile
if (m_pInterpretator)
{
ProcessRasterOperation(oTEmfStretchBLT.unBitBltRasterOperation, &pBgraBuffer, ulWidth, ulHeight);
unsigned int unBlendMode{BLEND_MODE_DEFAULT};
if (0x00660046 == oTEmfStretchBLT.unBitBltRasterOperation)
unBlendMode = 0;
DrawImage(oTEmfStretchBLT.nXDest, oTEmfStretchBLT.nYDest,
oTEmfStretchBLT.nCxDest, oTEmfStretchBLT.nCyDest,
pBgraBuffer, ulWidth, ulHeight);
pBgraBuffer, ulWidth, ulHeight, unBlendMode);
}
}
@ -225,14 +232,14 @@ namespace MetaFile
}
}
void CEmfParserBase::DrawImage(int nX, int nY, int nW, int nH, BYTE *pImageBuffer, unsigned int unImageW, unsigned int unImageH)
void CEmfParserBase::DrawImage(int nX, int nY, int nW, int nH, BYTE *pImageBuffer, unsigned int unImageW, unsigned int unImageH, unsigned int unBlendMode)
{
if (NULL != m_pInterpretator)
{
double dX, dY, dR, dB;
TranslatePoint(nX, nY, dX, dY);
TranslatePoint(nX + nW, nY + nH, dR, dB);
m_pInterpretator->DrawBitmap(dX, dY, dR - dX, dB - dY, pImageBuffer, unImageW, unImageH);
m_pInterpretator->DrawBitmap(dX, dY, dR - dX, dB - dY, pImageBuffer, unImageW, unImageH, unBlendMode);
}
}
@ -1601,7 +1608,7 @@ namespace MetaFile
pBgraBuffer[2] = oColor.r;
pBgraBuffer[3] = 0xff;
DrawImage(oPoint.X, oPoint.Y, 1, 1, pBgraBuffer, 1, 1);
DrawImage(oPoint.X, oPoint.Y, 1, 1, pBgraBuffer, 1, 1, BLEND_MODE_DEFAULT);
}
void CEmfParserBase::HANDLE_EMR_SMALLTEXTOUT(TEmfSmallTextout &oText)

View File

@ -128,7 +128,7 @@ namespace MetaFile
void ImageProcessing(const TEmfSetDiBitsToDevice&oTEmfSetDiBitsToDevice);
void ImageProcessing(const TEmfStretchBLT &oTEmfStretchBLT);
void ImageProcessing(const TEmfDibPatternBrush &oTEmfDibPatternBrush, unsigned int ulBrushIndex);
void DrawImage(int nX, int nY, int nW, int nH, BYTE *pImageBuffer, unsigned int unImageW, unsigned int unImageH);
void DrawImage(int nX, int nY, int nW, int nH, BYTE *pImageBuffer, unsigned int unImageW, unsigned int unImageH, unsigned int unBlendMode);
//----------------------
void TranslatePoint(TPointL &oPoint, double &dX, double &dY) const;

View File

@ -1659,7 +1659,7 @@ namespace MetaFile
BYTE* pNewBuffer = GetClipedImage(pPixels, nWidth, nHeight, oClipRect, nW, nH);
m_pInterpretator->DrawBitmap(arPoints[0].X, arPoints[0].Y, arPoints[1].X - arPoints[0].X - m_pDC->GetPixelWidth(), arPoints[2].Y - arPoints[0].Y - m_pDC->GetPixelHeight(),
(NULL != pNewBuffer) ? pNewBuffer : pPixels, nW, nH);
(NULL != pNewBuffer) ? pNewBuffer : pPixels, nW, nH, BLEND_MODE_DEFAULT);
RELEASEINTERFACE(pGrRenderer);
RELEASEARRAYOBJECTS(pNewBuffer);
@ -1738,7 +1738,7 @@ namespace MetaFile
BYTE* pNewBuffer = GetClipedImage(pBytes, unWidth, unHeight, oClipRect, nW, nH);
m_pInterpretator->DrawBitmap(arPoints[0].X, arPoints[0].Y, arPoints[1].X - arPoints[0].X, arPoints[2].Y - arPoints[0].Y,
(NULL != pNewBuffer) ? pNewBuffer : pBytes, nW, nH);
(NULL != pNewBuffer) ? pNewBuffer : pBytes, nW, nH, BLEND_MODE_DEFAULT);
if (!bExternalBuffer)
RELEASEARRAYOBJECTS(pBytes);

View File

@ -324,8 +324,9 @@ namespace MetaFile
unsigned int ulBitsSizeSkip = 0 == ulBitsSize ? 0 : ((int)(((double)ulBitsSize - 0.5) / 4) + 1) * 4;
m_oStream.Skip(ulBitsSizeSkip);
unsigned int unColorUsed;
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight);
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight, unColorUsed);
return true;
}
@ -1261,7 +1262,7 @@ namespace MetaFile
pBgraBuffer[2] = oColor.r;
pBgraBuffer[3] = 0xff;
DrawImage(oPoint.X, oPoint.Y, 1, 1, pBgraBuffer, 1, 1);
DrawImage(oPoint.X, oPoint.Y, 1, 1, pBgraBuffer, 1, 1, BLEND_MODE_DEFAULT);
}
void CEmfxParser::Read_EMR_SMALLTEXTOUT()
{

View File

@ -941,7 +941,8 @@ bool CSvmFile::ReadImage(unsigned short ushColorUsage, BYTE** ppBgraBuffer, unsi
return false;
BYTE* pBuffer = m_oStream.GetCurPtr();
MetaFile::ReadImage(pBuffer, unRemainBytes, ushColorUsage, ppBgraBuffer, pulWidth, pulHeight);
unsigned int unColorUsed;
MetaFile::ReadImage(pBuffer, unRemainBytes, ushColorUsage, ppBgraBuffer, pulWidth, pulHeight, unColorUsed);
return true;
}
void CSvmFile::Read_META_POP()
@ -994,7 +995,7 @@ void CSvmFile::Read_META_BMP()
{
if ( m_pOutput)
{
m_pOutput->DrawBitmap( m_oCurrnetOffset.x, m_oCurrnetOffset.y, bitmap_info.nWidth, bitmap_info.nHeight, pBgraBuffer, bitmap_info.nWidth, bitmap_info.nHeight);
m_pOutput->DrawBitmap( m_oCurrnetOffset.x, m_oCurrnetOffset.y, bitmap_info.nWidth, bitmap_info.nHeight, pBgraBuffer, bitmap_info.nWidth, bitmap_info.nHeight, BLEND_MODE_DEFAULT);
}
delete []pBgraBuffer;
@ -1049,6 +1050,8 @@ void CSvmFile::Read_META_BMP(TSvmBitmap & bitmap_info, BYTE** ppDstBuffer, unsig
else
nColors = 0;
unsigned int unColorUsed;
if( ZCOMPRESS == bitmap_info.nCompression )
{
COfficeUtils OfficeUtils(NULL);
@ -1069,7 +1072,7 @@ void CSvmFile::Read_META_BMP(TSvmBitmap & bitmap_info, BYTE** ppDstBuffer, unsig
}
m_oStream.Skip(srcSize);
MetaFile::ReadImage((BYTE*)&bitmap_info, bitmap_info.nSize, destBuf, destSize, ppDstBuffer, pulWidth, pulHeight);
MetaFile::ReadImage((BYTE*)&bitmap_info, bitmap_info.nSize, destBuf, destSize, ppDstBuffer, pulWidth, pulHeight, unColorUsed);
delete []destBuf;
}
else if (nHeaderSize >= bitmap_info.nSize)
@ -1079,7 +1082,7 @@ void CSvmFile::Read_META_BMP(TSvmBitmap & bitmap_info, BYTE** ppDstBuffer, unsig
m_oStream.ReadBytes(Header + bitmap_info.nSize, nHeaderSize - bitmap_info.nSize);
MetaFile::ReadImage(Header , nHeaderSize, m_oStream.GetCurPtr(), bitmap_info.nSizeImage, ppDstBuffer, pulWidth, pulHeight);
MetaFile::ReadImage(Header , nHeaderSize, m_oStream.GetCurPtr(), bitmap_info.nSizeImage, ppDstBuffer, pulWidth, pulHeight, unColorUsed);
m_oStream.Skip(bitmap_info.nSizeImage);
delete[] Header;
}

View File

@ -304,7 +304,8 @@ class CSvmFile : virtual public IMetaFileBase
BYTE* pBitsBuffer = m_oStream.GetCurPtr();
m_oStream.Skip(ulBitsSize);
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight);
unsigned int unColorUsed;
MetaFile::ReadImage(pHeaderBuffer, ulHeaderSize, pBitsBuffer, ulBitsSize, ppBgraBuffer, pulWidth, pulHeight, unColorUsed);
return true;
}
@ -321,7 +322,7 @@ class CSvmFile : virtual public IMetaFileBase
for (int nIndex = 3, nSize = 4 * unImageW * unImageH; nIndex < nSize; nIndex += 4)
pImageBuffer[nIndex] = 255;
m_pOutput->DrawBitmap(dX, dY, dR - dX, dB - dY, pImageBuffer, unImageW, unImageH);
m_pOutput->DrawBitmap(dX, dY, dR - dX, dB - dY, pImageBuffer, unImageW, unImageH, BLEND_MODE_DEFAULT);
}
}
void DrawImage(int nX, int nY, int nW, int nH, unsigned int unColorUsage)
@ -338,7 +339,7 @@ class CSvmFile : virtual public IMetaFileBase
TranslatePoint(nX, nY, dX, dY);
TranslatePoint(nX + nW, nY + nH, dX1, dY1);
m_pOutput->DrawBitmap(dX, dY, fabs(dX1 - dX), fabs(dY1 - dY), pBgra, unWidth, unHeight);
m_pOutput->DrawBitmap(dX, dY, fabs(dX1 - dX), fabs(dY1 - dY), pBgra, unWidth, unHeight, BLEND_MODE_DEFAULT);
}
if (pBgra)

View File

@ -451,7 +451,7 @@ namespace MetaFile
m_pXmlWriter->WriteNodeEnd(L"g");
}
void CInterpretatorSvgBase::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CInterpretatorSvgBase::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
if (NULL == pBuffer || Equals(0., dW) || Equals(0., dH) || 0 == unWidth || 0 == unHeight)
return;

View File

@ -108,7 +108,7 @@ namespace MetaFile
void WriteNodeEnd(const std::wstring& wsNodeName);
void WriteText(const std::wstring& wsText, const TPointD& oCoord, const TRectL& oBounds = TRectL(), const TPointD& oScale = TPointD(1, 1), const std::vector<double>& arDx = {});
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
void ResetClip() override;
void IntersectClip(const TRectD& oClip) override;

View File

@ -22,10 +22,10 @@ namespace MetaFile
m_pMetaFileRenderer->End();
}
void CWmfInterpretatorRender::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CWmfInterpretatorRender::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
if (NULL != m_pMetaFileRenderer)
m_pMetaFileRenderer->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight);
m_pMetaFileRenderer->DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight, unBlendMode);
}
void CWmfInterpretatorRender::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,

View File

@ -16,7 +16,7 @@ namespace MetaFile
void Begin() override;
void End() override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;

View File

@ -470,9 +470,9 @@ namespace MetaFile
m_bUpdatedClip = false;
}
void CWmfInterpretatorSvg::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight)
void CWmfInterpretatorSvg::DrawBitmap(double dX, double dY, double dW, double dH, BYTE *pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode)
{
CInterpretatorSvgBase::DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight);
CInterpretatorSvgBase::DrawBitmap(dX, dY, dW, dH, pBuffer, unWidth, unHeight, unBlendMode);
}
void CWmfInterpretatorSvg::ResetClip()

View File

@ -102,7 +102,7 @@ namespace MetaFile
void HANDLE_META_UNKNOWN(CDataStream& oDataStream) override {};
public:
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight) override;
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
//Следующие методы ничего не делают
void Begin() override {};

View File

@ -666,14 +666,14 @@ namespace MetaFile
}
}
bool CWmfParserBase::ReadImage(unsigned short ushColorUsage, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight)
bool CWmfParserBase::ReadImage(unsigned short ushColorUsage, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight, unsigned int& unColorUsed)
{
unsigned int unRemainBytes = GetRecordRemainingBytesCount();
if (unRemainBytes <= 0)
return false;
BYTE* pBuffer = m_oStream.GetCurPtr();
MetaFile::ReadImage(pBuffer, unRemainBytes, ushColorUsage, ppBgraBuffer, pulWidth, pulHeight);
MetaFile::ReadImage(pBuffer, unRemainBytes, ushColorUsage, ppBgraBuffer, pulWidth, pulHeight, unColorUsed);
return true;
}
@ -682,12 +682,17 @@ namespace MetaFile
if (NULL != m_pInterpretator)
{
BYTE* pBgra = NULL;
unsigned int unWidth, unHeight;
unsigned int unWidth, unHeight, unColorUsed;
if (ReadImage(unColorUsage, &pBgra, &unWidth, &unHeight))
if (ReadImage(unColorUsage, &pBgra, &unWidth, &unHeight, unColorUsed))
{
ProcessRasterOperation(unRasterOperation, &pBgra, unWidth, unHeight);
unsigned int unBlendMode{BLEND_MODE_DEFAULT};
if (2 == unColorUsed && 0x00660046 == unRasterOperation)
unBlendMode = BLEND_MODE_DRAW_ON_BLACK;
double dX, dY, dX1, dY1;
TranslatePoint(oDestRect.Left, oDestRect.Top, dX, dY);
TranslatePoint(oDestRect.Right, oDestRect.Bottom, dX1, dY1);
@ -703,14 +708,14 @@ namespace MetaFile
if (NULL != pNewBuffer)
{
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pNewBuffer, std::abs(oClip.Right - oClip.Left), std::abs(oClip.Bottom - oClip.Top));
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pNewBuffer, std::abs(oClip.Right - oClip.Left), std::abs(oClip.Bottom - oClip.Top), unBlendMode);
delete[] pNewBuffer;
}
else
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pBgra, unWidth, unHeight);
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pBgra, unWidth, unHeight, unBlendMode);
}
else
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pBgra, unWidth, unHeight);
m_pInterpretator->DrawBitmap(dX, dY, dX1 - dX, dY1 - dY, pBgra, unWidth, unHeight, unBlendMode);
}
if (pBgra)
@ -1220,7 +1225,7 @@ namespace MetaFile
if (NULL != m_pInterpretator)
{
m_pInterpretator->HANDLE_META_SETPIXEL(oColor, shY, shX);
m_pInterpretator->DrawBitmap(shX, shY, 1, 1, pBgraBuffer, 1, 1);
m_pInterpretator->DrawBitmap(shX, shY, 1, 1, pBgraBuffer, 1, 1, BLEND_MODE_DEFAULT);
}
}
@ -1310,8 +1315,8 @@ namespace MetaFile
m_pInterpretator->HANDLE_META_DIBCREATEPATTERNBRUSH(ushStyle, ushColorUsage, *pBrush, m_oStream);
BYTE* pBgra = NULL;
unsigned int unWidth = 0, unHeight = 0;
if (ReadImage(ushColorUsage, &pBgra, &unWidth, &unHeight))
unsigned int unWidth = 0, unHeight = 0, unColorUsed = 0;
if (ReadImage(ushColorUsage, &pBgra, &unWidth, &unHeight, unColorUsed))
{
pBrush->SetDibPattern(pBgra, unWidth, unHeight);
}

View File

@ -197,7 +197,7 @@ namespace MetaFile
void RegisterPoint(short shX, short shY);
bool ReadImage(unsigned short ushColorUsage, BYTE** ppBgraBuffer, unsigned int* pulWidth, unsigned int* pulHeight);
bool ReadImage(unsigned short ushColorUsage, BYTE** ppBgraBuffer, unsigned int* pulWidth, unsigned int* pulHeight, unsigned int& unColorUsed);
void DrawImage(const TRectL& oDestRect, const TRectL& oSrcRect, unsigned int unColorUsage, unsigned int unRasterOperation);
static BYTE* ClipBuffer(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, TRectL& oNewRect);