mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
For bug #8257
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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"");
|
||||
|
||||
@ -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 {};
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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 {};
|
||||
|
||||
@ -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 {};
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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 {};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user