Skip to content

Instantly share code, notes, and snippets.

@Polaringu
Created May 4, 2016 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Polaringu/917964fee3920dae58d600768dba9255 to your computer and use it in GitHub Desktop.
Save Polaringu/917964fee3920dae58d600768dba9255 to your computer and use it in GitHub Desktop.
template <typename T>
void ConvertAnnot(T* pData)
{
float r = 0, g = 0, b = 0;
CComPtr<PXC::IColor> pFClr;
CComPtr<PXC::IColor> pSClr;
pData->get_FColor(&pFClr);
if (pFClr == nullptr)
return;
pData->get_SColor(&pSClr);
if (pSClr == nullptr)
return;
PXC::ColorType nType = PXC::ColorType_None;
pFClr->get_Type(&nType);
if (nType != PXC::ColorType_None)
{
pFClr->GetRGB(&r, &g, &b);
float gray = (r * 0.212f) + (g * 0.701f) + (b * 0.087f); // "luminance" grayscale conversion.
pFClr->SetRGB(gray, gray, gray);
pData->put_FColor(pFClr);
}
nType = PXC::ColorType_None;
pSClr->get_Type(&nType);
if (nType != PXC::ColorType_None)
{
pSClr->GetRGB(&r, &g, &b);
float gray = (r * 0.212f) + (g * 0.701f) + (b * 0.087f); // "luminance" grayscale conversion.
pSClr->SetRGB(gray, gray, gray);
pData->put_SColor(pSClr);
}
}
HRESULT ConvertAnnotationsToGrayscale(PXC::IPXC_Document* pDoc, PXC::IPXS_Inst* pSInst)
{
PXC::ULONG_T freeTextAnnotType = 0;
pSInst->StrToAtom(L"FreeText", &freeTextAnnotType);
PXC::ULONG_T lineAnnotType = 0;
pSInst->StrToAtom(L"Line", &lineAnnotType);
PXC::ULONG_T squareAnnotType = 0;
pSInst->StrToAtom(L"Square", &squareAnnotType);
PXC::ULONG_T circleAnnotType = 0;
pSInst->StrToAtom(L"Circle", &circleAnnotType);
PXC::ULONG_T polygonAnnotType = 0;
pSInst->StrToAtom(L"Polygon", &polygonAnnotType);
PXC::ULONG_T polylineAnnotType = 0;
pSInst->StrToAtom(L"PolyLine", &polylineAnnotType);
PXC::ULONG_T redactAnnotType = 0;
pSInst->StrToAtom(L"Redact", &redactAnnotType);
HRESULT hr = S_OK;
do
{
CComPtr<PXC::IPXC_Pages> pPages;
hr = pDoc->get_Pages(&pPages);
if (!pPages)
break;
PXC::ULONG_T nCnt = 0;
pPages->get_Count(&nCnt);
for (DWORD i = 0; i < nCnt; i++)
{
CComPtr<PXC::IPXC_Page> pPage;
hr = pPages->get_Item(i, &pPage);
if (!pPage)
break;
PXC::ULONG_T nACount = 0;
pPage->GetAnnotsCount(&nACount);
for (DWORD j = 0; j < nACount; j++)
{
CComPtr<PXC::IPXC_Annotation> pAnnot;
pPage->GetAnnot(j, &pAnnot);
if (!pAnnot)
continue;
PXC::ULONG_T nType = 0;
pAnnot->get_Type(&nType);
CComPtr<PXC::IPXC_AnnotData> pData;
hr = pAnnot->get_Data(&pData);
if (FAILED(hr))
continue;
if (nType == freeTextAnnotType)
{
CComPtr<PXC::IPXC_AnnotData_FreeText> pFTData = static_cast<PXC::IPXC_AnnotData_FreeText*>(pData.p);
ConvertAnnot(pFTData.p);
pAnnot->put_Data(pFTData);
}
else if (nType == lineAnnotType)
{
CComPtr<PXC::IPXC_AnnotData_Line> pLData = static_cast<PXC::IPXC_AnnotData_Line*>(pData.p);
ConvertAnnot(pLData.p);
pAnnot->put_Data(pLData);
}
else if ((nType == squareAnnotType) || (nType == circleAnnotType))
{
CComPtr<PXC::IPXC_AnnotData_SquareCircle> pSCData = static_cast<PXC::IPXC_AnnotData_SquareCircle*>(pData.p);
ConvertAnnot(pSCData.p);
pAnnot->put_Data(pSCData);
}
else if ((nType == polygonAnnotType) || (nType == polylineAnnotType))
{
CComPtr<PXC::IPXC_AnnotData_Poly> pPData = static_cast<PXC::IPXC_AnnotData_Poly*>(pData.p);
ConvertAnnot(pPData.p);
pAnnot->put_Data(pPData);
}
else if (nType == redactAnnotType)
{
CComPtr<PXC::IPXC_AnnotData_Redaction> pRData = static_cast<PXC::IPXC_AnnotData_Redaction*>(pData.p);
ConvertAnnot(pRData.p);
pAnnot->put_Data(pRData);
}
else
{
float r = 0, g = 0, b = 0;
CComPtr<PXC::IColor> clr;
hr = pData->get_Color(&clr);
if (FAILED(hr))
continue;
PXC::ColorType nType = PXC::ColorType_None;
clr->get_Type(&nType);
if (nType != PXC::ColorType_None)
{
clr->GetRGB(&r, &g, &b);
float gray = (r * 0.212f) + (g * 0.701f) + (b * 0.087f); // "luminance" grayscale conversion.
clr->SetRGB(gray, gray, gray);
pData->put_Color(clr);
}
pAnnot->put_Data(pData);
}
}
}
} while (FALSE);
return hr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment