mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Fix bug #72962
This commit is contained in:
@ -1218,30 +1218,56 @@ namespace MetaFile
|
|||||||
else if (PS_JOIN_MITER == ulPenJoin)
|
else if (PS_JOIN_MITER == ulPenJoin)
|
||||||
nJoinStyle = Aggplus::LineJoinMiter;
|
nJoinStyle = Aggplus::LineJoinMiter;
|
||||||
|
|
||||||
const double dWidth = pPen->GetWidth() * m_dScaleX;
|
double dWidth = pPen->GetWidth();
|
||||||
const double dMiterLimit = (0 != pPen->GetMiterLimit()) ? pPen->GetMiterLimit() : m_pFile->GetMiterLimit() * m_dScaleX;
|
|
||||||
|
|
||||||
BYTE nDashStyle = Aggplus::DashStyleSolid;
|
// Повторение кода из Graphics для вычисления минимальной ширины пера
|
||||||
|
double dM11, dM12, dM21, dM22, dDx, dDy;
|
||||||
|
m_pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
|
||||||
|
|
||||||
|
Aggplus::CMatrix oMatrix;
|
||||||
|
|
||||||
|
oMatrix.SetElements(dM11, dM12, dM21, dM22, dDx, dDy);
|
||||||
|
oMatrix.Scale(1. / m_dScaleX, 1. / m_dScaleY);
|
||||||
|
|
||||||
double *pDataDash;
|
double *pDataDash;
|
||||||
unsigned int unSizeDash;
|
unsigned int unSizeDash;
|
||||||
|
|
||||||
pPen->GetDashData(pDataDash, unSizeDash);
|
pPen->GetDashData(pDataDash, unSizeDash);
|
||||||
|
|
||||||
|
// Вычисление минимально возможной ширины пера
|
||||||
|
// # Код явялется дублированным из Graphics
|
||||||
|
const double dSqrtDet = sqrt(abs(oMatrix.Determinant()));
|
||||||
|
const double dWidthMinSize = (dSqrtDet != 0) ? (1.0 / dSqrtDet) : dWidth;
|
||||||
|
|
||||||
|
if (0 == pPen->GetWidth())
|
||||||
|
{
|
||||||
|
double dX = 0.72, dY = 0.72;
|
||||||
|
|
||||||
|
oMatrix.Invert();
|
||||||
|
oMatrix.TransformPoint(dX, dY);
|
||||||
|
dX -= oMatrix.OffsetX();
|
||||||
|
dY -= oMatrix.OffsetY();
|
||||||
|
dWidth = std::min(abs(dX), abs(dY));
|
||||||
|
}
|
||||||
|
//------------------------
|
||||||
|
else
|
||||||
|
dWidth *= m_dScaleX;
|
||||||
|
|
||||||
|
if (dWidth < dWidthMinSize)
|
||||||
|
dWidth = dWidthMinSize;
|
||||||
|
|
||||||
|
const double dMiterLimit = (0 != pPen->GetMiterLimit()) ? pPen->GetMiterLimit() : m_pFile->GetMiterLimit() * m_dScaleX;
|
||||||
|
|
||||||
|
BYTE nDashStyle = Aggplus::DashStyleSolid;
|
||||||
|
|
||||||
if (NULL != pDataDash && 0 != unSizeDash)
|
if (NULL != pDataDash && 0 != unSizeDash)
|
||||||
{
|
{
|
||||||
m_pRenderer->put_PenDashOffset(pPen->GetDashOffset());
|
m_pRenderer->put_PenDashOffset(pPen->GetDashOffset());
|
||||||
|
|
||||||
double dM11, dTemp;
|
|
||||||
m_pRenderer->GetTransform(&dM11, &dTemp, &dTemp, &dTemp, &dTemp, &dTemp);
|
|
||||||
double dDpi;
|
|
||||||
m_pRenderer->get_DpiX(&dDpi);
|
|
||||||
const double dNewWidth{dWidth * dM11 * dDpi / 25.4};
|
|
||||||
|
|
||||||
std::vector<double> arDashes(unSizeDash);
|
std::vector<double> arDashes(unSizeDash);
|
||||||
|
|
||||||
for (unsigned int unIndex = 0; unIndex < unSizeDash; ++unIndex)
|
for (unsigned int unIndex = 0; unIndex < unSizeDash; ++unIndex)
|
||||||
arDashes[unIndex] = pDataDash[unIndex] * dNewWidth;
|
arDashes[unIndex] = pDataDash[unIndex] * dWidth;
|
||||||
|
|
||||||
m_pRenderer->PenDashPattern(arDashes.data(), unSizeDash);
|
m_pRenderer->PenDashPattern(arDashes.data(), unSizeDash);
|
||||||
|
|
||||||
@ -1251,45 +1277,39 @@ namespace MetaFile
|
|||||||
{
|
{
|
||||||
std::vector<double> arDashPattern;
|
std::vector<double> arDashPattern;
|
||||||
|
|
||||||
double dM11, dTemp;
|
|
||||||
m_pRenderer->GetTransform(&dM11, &dTemp, &dTemp, &dTemp, &dTemp, &dTemp);
|
|
||||||
double dDpi;
|
|
||||||
m_pRenderer->get_DpiX(&dDpi);
|
|
||||||
const double dNewWidth{dWidth * dM11 * dDpi / 25.4};
|
|
||||||
|
|
||||||
switch (ulPenStyle)
|
switch (ulPenStyle)
|
||||||
{
|
{
|
||||||
case PS_DASH:
|
case PS_DASH:
|
||||||
{
|
{
|
||||||
arDashPattern.push_back(9 * dNewWidth);
|
arDashPattern.push_back(9 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PS_DOT:
|
case PS_DOT:
|
||||||
{
|
{
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PS_DASHDOT:
|
case PS_DASHDOT:
|
||||||
{
|
{
|
||||||
arDashPattern.push_back(9 * dNewWidth);
|
arDashPattern.push_back(9 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(6 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(6 * dWidth);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PS_DASHDOTDOT:
|
case PS_DASHDOTDOT:
|
||||||
{
|
{
|
||||||
arDashPattern.push_back(9 * dNewWidth);
|
arDashPattern.push_back(9 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(6 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(6 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(3 * dWidth);
|
||||||
arDashPattern.push_back(3 * dNewWidth);
|
arDashPattern.push_back(6 * dWidth);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user