void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device) { if (ClipPath.IsNull()) { if (!m_LastClipPath.IsNull()) { m_pDevice->RestoreState(TRUE); m_LastClipPath.SetNull(); } return; } if (m_LastClipPath == ClipPath) return; m_LastClipPath = ClipPath; m_pDevice->RestoreState(TRUE); int nClipPath = ClipPath.GetPathCount(); for (int i = 0; i < nClipPath; ++i) { const CFX_PathData* pPathData = ClipPath.GetPath(i); if (!pPathData) continue; if (pPathData->GetPointCount() == 0) { CFX_PathData EmptyPath; EmptyPath.AppendRect(-1, -1, 0, 0); int fill_mode = FXFILL_WINDING; m_pDevice->SetClip_PathFill(&EmptyPath, nullptr, fill_mode); } else { int ClipType = ClipPath.GetClipType(i); m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType); } } int textcount = ClipPath.GetTextCount(); if (textcount == 0) return; if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) { return; } nonstd::unique_ptr<CFX_PathData> pTextClippingPath; for (int i = 0; i < textcount; ++i) { CPDF_TextObject* pText = ClipPath.GetText(i); if (pText) { if (!pTextClippingPath) pTextClippingPath.reset(new CFX_PathData); ProcessText(pText, pObj2Device, pTextClippingPath.get()); continue; } if (!pTextClippingPath) continue; int fill_mode = FXFILL_WINDING; if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) fill_mode |= FXFILL_NOPATHSMOOTH; m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode); pTextClippingPath.reset(); } }
void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device) { if (ClipPath.IsNull()) { return; } int fill_mode = 0; if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { fill_mode |= FXFILL_NOPATHSMOOTH; } int nClipPath = ClipPath.GetPathCount(); int i; for (i = 0; i < nClipPath; i++) { const CFX_PathData* pPathData = ClipPath.GetPath(i); if (pPathData == NULL) { continue; } CFX_GraphStateData stroke_state; if (m_Options.m_Flags & RENDER_THINLINE) { stroke_state.m_LineWidth = 0; } m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode); } }