mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Write style checked symbol
This commit is contained in:
@ -519,9 +519,6 @@ function readAnnotAP(reader, AP)
|
||||
// 0 - Normal, 1 - Multiply, 2 - Screen, 3 - Overlay, 4 - Darken, 5 - Lighten, 6 - ColorDodge, 7 - ColorBurn, 8 - HardLight,
|
||||
// 9 - SoftLight, 10 - Difference, 11 - Exclusion, 12 - Hue, 13 - Saturation, 14 - Color, 15 - Luminosity
|
||||
APi["BlendMode"] = reader.readByte();
|
||||
let k = reader.readByte();
|
||||
if (k != 0)
|
||||
APi["apValue"] = reader.readString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1824,7 +1824,7 @@ namespace PdfWriter
|
||||
//----------------------------------------------------------------------------------------
|
||||
CCheckBoxWidget::CCheckBoxWidget(CXref* pXref) : CWidgetAnnotation(pXref, AnnotWidget)
|
||||
{
|
||||
m_nSubtype = WidgetRadiobutton;
|
||||
m_nSubtype = WidgetCheckbox;
|
||||
m_nStyle = ECheckBoxStyle::Circle;
|
||||
}
|
||||
void CCheckBoxWidget::SetV(const std::wstring& wsV)
|
||||
@ -1859,7 +1859,7 @@ namespace PdfWriter
|
||||
CCheckBoxAnnotAppearance* pAP = new CCheckBoxAnnotAppearance(m_pXref, this, m_sAP_N_Yes.empty() ? NULL : m_sAP_N_Yes.c_str());
|
||||
Add("AP", pAP);
|
||||
|
||||
if (m_nStyle == ECheckBoxStyle::Circle)
|
||||
if (m_nStyle == ECheckBoxStyle::Circle && m_nSubtype == WidgetRadiobutton)
|
||||
{
|
||||
pAP->GetYesN()->DrawCheckBoxCircle(true, true);
|
||||
pAP->GetOffN()->DrawCheckBoxCircle(false, true);
|
||||
@ -1909,8 +1909,8 @@ namespace PdfWriter
|
||||
if (nFlag < 0)
|
||||
return;
|
||||
int nFlags = nFlag;
|
||||
if (m_nSubtype == WidgetRadiobutton)
|
||||
nFlags |= (1 << 15);
|
||||
if (nFlags & (1 << 15))
|
||||
m_nSubtype = WidgetRadiobutton;
|
||||
CWidgetAnnotation::SetFlag(nFlags);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------
|
||||
|
||||
@ -3316,45 +3316,106 @@ namespace PdfWriter
|
||||
m_pStream->WriteStr(m_pAnnot->GetBorderDash().c_str());
|
||||
m_pStream->WriteStr(pAnnot->GetBCforAP().c_str());
|
||||
|
||||
StreamWriteRect(m_pStream, dBorder / 2.0, dBorder / 2.0, dW - dBorder, dH - dBorder);
|
||||
if (nBorderType == EBorderType::Underline)
|
||||
{
|
||||
StreamWriteXYMove(m_pStream, 0, dBorder / 2.0);
|
||||
StreamWriteXYLine(m_pStream, dW, dBorder / 2.0);
|
||||
}
|
||||
else
|
||||
StreamWriteRect(m_pStream, dBorder / 2.0, dBorder / 2.0, dW - dBorder, dH - dBorder);
|
||||
m_pStream->WriteStr("s\012");
|
||||
|
||||
// Установлен
|
||||
if (!bSet)
|
||||
return;
|
||||
double dDiff = std::abs(dW - dH) / 2.0;
|
||||
double dShift = dBorder;
|
||||
if (nBorderType == EBorderType::Beveled || nBorderType == EBorderType::Inset)
|
||||
dShift *= 2;
|
||||
dShift += 1;
|
||||
bool bW = dW > dH;
|
||||
double dCX = dW / 2.0, dCY = dH / 2.0;
|
||||
double dC = std::min(dW, dH) / 2.0;
|
||||
|
||||
ECheckBoxStyle nStyle = pAnnot->GetStyle();
|
||||
switch (nStyle)
|
||||
{
|
||||
case ECheckBoxStyle::Check:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case ECheckBoxStyle::Cross:
|
||||
{
|
||||
m_pStream->WriteStr("q\012");
|
||||
StreamWriteRect(m_pStream, dBorder * 2.0, dBorder * 2.0, dW - dBorder * 4.0, dH - dBorder * 4.0);
|
||||
m_pStream->WriteStr("W\012n\0120 G\0121 w\012");
|
||||
|
||||
double x1 = dShift + (bW ? dDiff : 0);
|
||||
double y1 = dShift + (bW ? 0 : dDiff);
|
||||
double x2 = dW - dShift - (bW ? dDiff : 0);
|
||||
double y2 = dH - dShift - (bW ? 0 : dDiff);
|
||||
StreamWriteXYMove(m_pStream, x1, y2);
|
||||
StreamWriteXYLine(m_pStream, x2, y1);
|
||||
StreamWriteXYMove(m_pStream, x2, y2);
|
||||
StreamWriteXYLine(m_pStream, x1, y1);
|
||||
|
||||
m_pStream->WriteStr("s\012Q\012");
|
||||
break;
|
||||
}
|
||||
case ECheckBoxStyle::Diamond:
|
||||
{
|
||||
double dSq = dC - dShift;
|
||||
double ca = cos(45.0 / 180.0 * M_PI);
|
||||
|
||||
m_pStream->WriteStr("0 g\012q\012");
|
||||
StreamWriteCM(m_pStream, ca, ca, -ca, ca, dCX, dCY);
|
||||
StreamWriteRect(m_pStream, -dSq / 2.0, -dSq / 2.0, dSq / 2.0, dSq / 2.0);
|
||||
m_pStream->WriteStr("f\012Q\012");
|
||||
break;
|
||||
}
|
||||
case ECheckBoxStyle::Check:
|
||||
case ECheckBoxStyle::Circle:
|
||||
{
|
||||
double dR = dC - dShift;
|
||||
|
||||
m_pStream->WriteStr("0 g\012q\012");
|
||||
m_pStream->WriteStr("1 0 0 1 ");
|
||||
m_pStream->WriteReal(dW / 2.0);
|
||||
m_pStream->WriteReal(dCX);
|
||||
m_pStream->WriteChar(' ');
|
||||
m_pStream->WriteReal(dH / 2.0);
|
||||
m_pStream->WriteReal(dCY);
|
||||
m_pStream->WriteStr(" cm\012");
|
||||
StreamWriteCircle(m_pStream, 0, 0, std::min(dW, dH) / 2.0 - dBorder);
|
||||
StreamWriteCircle(m_pStream, 0, 0, dR);
|
||||
m_pStream->WriteStr("f\012Q\012");
|
||||
break;
|
||||
}
|
||||
case ECheckBoxStyle::Star:
|
||||
{
|
||||
double dROuter = dC - dShift;
|
||||
double dRInner = dROuter / 2.5;
|
||||
int nPoints = 5;
|
||||
|
||||
m_pStream->WriteStr("0 g\012q\012");
|
||||
for (int i = 0; i < nPoints * 2; ++i)
|
||||
{
|
||||
double dR = i % 2 == 0 ? dROuter : dRInner;
|
||||
double dAngle = M_PI / nPoints * i;
|
||||
double dX = dCX + dR * std::sin(dAngle);
|
||||
double dY = dCY - dR * std::cos(dAngle);
|
||||
if (i == 0)
|
||||
StreamWriteXYMove(m_pStream, dX, dY);
|
||||
else
|
||||
StreamWriteXYLine(m_pStream, dX, dY);
|
||||
}
|
||||
m_pStream->WriteStr("f\012Q\012");
|
||||
break;
|
||||
}
|
||||
case ECheckBoxStyle::Square:
|
||||
{
|
||||
double dSq = dC - dShift;
|
||||
double x1 = dCX - dSq / 2.0;
|
||||
double y1 = dCY - dSq / 2.0;
|
||||
double x2 = x1 + dSq;
|
||||
double y2 = y1 + dSq;
|
||||
|
||||
m_pStream->WriteStr("0 g\012q\012");
|
||||
StreamWriteRect(m_pStream, x1, y1, x2, y2);
|
||||
m_pStream->WriteStr("f\012Q\012");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user