bool CPDF_DataAvail::CheckPageAnnots(uint32_t dwPage, DownloadHints* pHints) { if (m_objs_array.empty()) { m_ObjectSet.clear(); FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage); CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); if (!pPageDict) return true; CPDF_Object* pAnnots = pPageDict->GetObjectFor("Annots"); if (!pAnnots) return true; std::vector<CPDF_Object*> obj_array; obj_array.push_back(pAnnots); if (!AreObjectsAvailable(obj_array, false, pHints, m_objs_array)) return false; m_objs_array.clear(); return true; } std::vector<CPDF_Object*> new_objs_array; if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { m_objs_array = new_objs_array; return false; } m_objs_array.clear(); return true; }
bool CPDF_DataAvail::ValidatePage(uint32_t dwPage) { FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage); CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); if (!pPageDict) return false; std::vector<CPDF_Object*> obj_array; obj_array.push_back(pPageDict); std::vector<CPDF_Object*> dummy; return AreObjectsAvailable(obj_array, true, nullptr, dummy); }
bool CPDF_DataAvail::LoadDocPage(uint32_t dwPage, DownloadHints* pHints) { FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage); int32_t iPage = safePage.ValueOrDie(); if (m_pDocument->GetPageCount() <= iPage || m_pDocument->IsPageLoaded(iPage)) { m_docStatus = PDF_DATAAVAIL_DONE; return true; } if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) { if (iPage == 0) { m_docStatus = PDF_DATAAVAIL_DONE; return true; } m_docStatus = PDF_DATAAVAIL_ERROR; return true; } int32_t iCount = -1; return CheckPageNode(m_pageNodes, iPage, iCount, pHints, 0); }
FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { int pos = 0; CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs); FX_FLOAT* encoded_input = encoded_input_buf; CFX_FixedBufGrow<uint32_t, 32> int_buf(m_nInputs * 2); uint32_t* index = int_buf; uint32_t* blocksize = index + m_nInputs; for (uint32_t i = 0; i < m_nInputs; i++) { if (i == 0) blocksize[i] = 1; else blocksize[i] = blocksize[i - 1] * m_EncodeInfo[i - 1].sizes; encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], m_EncodeInfo[i].encode_min, m_EncodeInfo[i].encode_max); index[i] = std::min((uint32_t)std::max(0.f, encoded_input[i]), m_EncodeInfo[i].sizes - 1); pos += index[i] * blocksize[i]; } FX_SAFE_INT32 bits_to_output = m_nOutputs; bits_to_output *= m_nBitsPerSample; if (!bits_to_output.IsValid()) return FALSE; FX_SAFE_INT32 bitpos = pos; bitpos *= bits_to_output.ValueOrDie(); if (!bitpos.IsValid()) return FALSE; FX_SAFE_INT32 range_check = bitpos; range_check += bits_to_output.ValueOrDie(); if (!range_check.IsValid()) return FALSE; const uint8_t* pSampleData = m_pSampleStream->GetData(); if (!pSampleData) return FALSE; for (uint32_t j = 0; j < m_nOutputs; j++) { uint32_t sample = GetBits32(pSampleData, bitpos.ValueOrDie() + j * m_nBitsPerSample, m_nBitsPerSample); FX_FLOAT encoded = (FX_FLOAT)sample; for (uint32_t i = 0; i < m_nInputs; i++) { if (index[i] == m_EncodeInfo[i].sizes - 1) { if (index[i] == 0) encoded = encoded_input[i] * (FX_FLOAT)sample; } else { FX_SAFE_INT32 bitpos2 = blocksize[i]; bitpos2 += pos; bitpos2 *= m_nOutputs; bitpos2 += j; bitpos2 *= m_nBitsPerSample; if (!bitpos2.IsValid()) return FALSE; uint32_t sample1 = GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample); } } results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, m_DecodeInfo[j].decode_min, m_DecodeInfo[j].decode_max); } return TRUE; }
CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail( uint32_t dwPage, DownloadHints* pHints) { if (!m_pDocument) return DataError; if (IsFirstCheck(dwPage)) { m_bCurPageDictLoadOK = false; m_bPageLoadedOK = false; m_bAnnotsLoad = false; m_bNeedDownLoadResource = false; m_objs_array.clear(); m_ObjectSet.clear(); } if (pdfium::ContainsKey(m_pagesLoadState, dwPage)) return DataAvailable; if (m_pLinearized) { if (dwPage == m_pLinearized->GetFirstPageNo()) { DocAvailStatus nRet = CheckLinearizedFirstPage(dwPage, pHints); if (nRet == DataAvailable) m_pagesLoadState.insert(dwPage); return nRet; } DocAvailStatus nResult = CheckLinearizedData(pHints); if (nResult != DataAvailable) return nResult; if (m_pHintTables) { nResult = m_pHintTables->CheckPage(dwPage, pHints); if (nResult != DataAvailable) return nResult; m_pagesLoadState.insert(dwPage); return GetPage(dwPage) ? DataAvailable : DataError; } if (m_bMainXRefLoadedOK) { if (m_bTotalLoadPageTree) { if (!LoadPages(pHints)) return DataNotAvailable; } else { if (!m_bCurPageDictLoadOK && !CheckPage(dwPage, pHints)) return DataNotAvailable; } } else { if (!LoadAllFile(pHints)) return DataNotAvailable; m_pDocument->GetParser()->RebuildCrossRef(); ResetFirstCheck(dwPage); return DataAvailable; } } else { if (!m_bTotalLoadPageTree && !m_bCurPageDictLoadOK && !CheckPage(dwPage, pHints)) { return DataNotAvailable; } } if (m_bHaveAcroForm && !m_bAcroFormLoad) { if (!CheckAcroFormSubObject(pHints)) return DataNotAvailable; m_bAcroFormLoad = true; } if (!m_bPageLoadedOK) { if (m_objs_array.empty()) { m_ObjectSet.clear(); FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage); m_pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); if (!m_pPageDict) { ResetFirstCheck(dwPage); // This is XFA page. return DataAvailable; } std::vector<CPDF_Object*> obj_array; obj_array.push_back(m_pPageDict); if (!AreObjectsAvailable(obj_array, true, pHints, m_objs_array)) return DataNotAvailable; m_objs_array.clear(); } else { std::vector<CPDF_Object*> new_objs_array; if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { m_objs_array = new_objs_array; return DataNotAvailable; } } m_objs_array.clear(); m_bPageLoadedOK = true; } if (!m_bAnnotsLoad) { if (!CheckPageAnnots(dwPage, pHints)) return DataNotAvailable; m_bAnnotsLoad = true; } if (m_pPageDict && !m_bNeedDownLoadResource) { m_pPageResource = m_pPageDict->GetObjectFor("Resources"); m_bNeedDownLoadResource = m_pPageResource || HaveResourceAncestor(m_pPageDict); } if (m_bNeedDownLoadResource) { if (!CheckResources(pHints)) return DataNotAvailable; m_bNeedDownLoadResource = false; } m_bPageLoadedOK = false; m_bAnnotsLoad = false; m_bCurPageDictLoadOK = false; ResetFirstCheck(dwPage); m_pagesLoadState.insert(dwPage); const bool is_page_valid = ValidatePage(dwPage); (void)is_page_valid; ASSERT(is_page_valid); return DataAvailable; }
void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CFX_Matrix* pUser2Device) { CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); CPDF_Rect rcClient = GetClientRect(); CFX_ByteTextBuf sLine; int32_t nCharArray = m_pEdit->GetCharArray(); FX_SAFE_INT32 nCharArraySafe = nCharArray; nCharArraySafe -= 1; nCharArraySafe *= 2; if (nCharArray > 0 && nCharArraySafe.IsValid()) { switch (GetBorderStyle()) { case PBS_SOLID: { CFX_GraphStateData gsd; gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); CFX_PathData path; path.SetPointCount(nCharArraySafe.ValueOrDie()); for (int32_t i = 0; i < nCharArray - 1; i++) { path.SetPoint( i * 2, rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.bottom, FXPT_MOVETO); path.SetPoint( i * 2 + 1, rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.top, FXPT_LINETO); } if (path.GetPointCount() > 0) pDevice->DrawPath( &path, pUser2Device, &gsd, 0, CPWL_Utils::PWLColorToFXColor(GetBorderColor(), 255), FXFILL_ALTERNATE); } break; case PBS_DASH: { CFX_GraphStateData gsd; gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); gsd.SetDashCount(2); gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash; gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap; gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase; CFX_PathData path; path.SetPointCount(nCharArraySafe.ValueOrDie()); for (int32_t i = 0; i < nCharArray - 1; i++) { path.SetPoint( i * 2, rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.bottom, FXPT_MOVETO); path.SetPoint( i * 2 + 1, rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.top, FXPT_LINETO); } if (path.GetPointCount() > 0) pDevice->DrawPath( &path, pUser2Device, &gsd, 0, CPWL_Utils::PWLColorToFXColor(GetBorderColor(), 255), FXFILL_ALTERNATE); } break; } } CPDF_Rect rcClip; CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); CPVT_WordRange* pRange = NULL; if (!HasFlag(PES_TEXTOVERFLOW)) { rcClip = GetClientRect(); pRange = &wrRange; } IFX_SystemHandler* pSysHandler = GetSystemHandler(); IFX_Edit::DrawEdit( pDevice, pUser2Device, m_pEdit, CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()), rcClip, CPDF_Point(0.0f, 0.0f), pRange, pSysHandler, m_pFormFiller); if (HasFlag(PES_SPELLCHECK)) { CPWL_Utils::DrawEditSpellCheck(pDevice, pUser2Device, m_pEdit, rcClip, CPDF_Point(0.0f, 0.0f), pRange, GetCreationParam().pSpellCheck); } }
FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { int pos = 0; CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs); FX_FLOAT* encoded_input = encoded_input_buf; CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2); int* index = int_buf; int* blocksize = index + m_nInputs; for (int i = 0; i < m_nInputs; i ++) { if (i == 0) { blocksize[i] = 1; } else { blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes; } encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max); index[i] = (int)encoded_input[i]; if (index[i] < 0) { index[i] = 0; } else if (index[i] > m_pEncodeInfo[i].sizes - 1) { index[i] = m_pEncodeInfo[i].sizes - 1; } pos += index[i] * blocksize[i]; } FX_SAFE_INT32 bitpos = pos; bitpos *= m_nBitsPerSample; bitpos *= m_nOutputs; if (!bitpos.IsValid()) { return FALSE; } FX_LPCBYTE pSampleData = m_pSampleStream->GetData(); if (pSampleData == NULL) { return FALSE; } FX_SAFE_INT32 bitpos1 = m_nOutputs - 1 > 0 ? m_nOutputs - 1 : 0; bitpos1 *= m_nBitsPerSample; bitpos1 += bitpos.ValueOrDie(); if (!bitpos1.IsValid()) { return FALSE; } for (int j = 0; j < m_nOutputs; j ++) { FX_DWORD sample = _GetBits32(pSampleData, bitpos.ValueOrDie() + j * m_nBitsPerSample, m_nBitsPerSample); FX_FLOAT encoded = (FX_FLOAT)sample; for (int i = 0; i < m_nInputs; i ++) { if (index[i] == m_pEncodeInfo[i].sizes - 1) { if (index[i] == 0) { encoded = encoded_input[i] * (FX_FLOAT)sample; } } else { FX_SAFE_INT32 bitpos2 = blocksize[i]; bitpos2 += 1; bitpos2 *= m_nBitsPerSample; bitpos2 *= m_nOutputs; bitpos2 += bitpos.ValueOrDie(); if (!bitpos2.IsValid()) { return FALSE; } FX_DWORD sample1 = _GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample); } } results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max); } return TRUE; }
void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CFX_Matrix* pUser2Device) { CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); CFX_FloatRect rcClient = GetClientRect(); CFX_ByteTextBuf sLine; int32_t nCharArray = m_pEdit->GetCharArray(); FX_SAFE_INT32 nCharArraySafe = nCharArray; nCharArraySafe -= 1; nCharArraySafe *= 2; if (nCharArray > 0 && nCharArraySafe.IsValid()) { switch (GetBorderStyle()) { case BorderStyle::SOLID: { CFX_GraphStateData gsd; gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); CFX_PathData path; for (int32_t i = 0; i < nCharArray - 1; i++) { path.AppendPoint( CFX_PointF( rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.bottom), FXPT_TYPE::MoveTo, false); path.AppendPoint( CFX_PointF( rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.top), FXPT_TYPE::LineTo, false); } if (!path.GetPoints().empty()) { pDevice->DrawPath(&path, pUser2Device, &gsd, 0, GetBorderColor().ToFXColor(255), FXFILL_ALTERNATE); } break; } case BorderStyle::DASH: { CFX_GraphStateData gsd; gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); gsd.SetDashCount(2); gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash; gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap; gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase; CFX_PathData path; for (int32_t i = 0; i < nCharArray - 1; i++) { path.AppendPoint( CFX_PointF( rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.bottom), FXPT_TYPE::MoveTo, false); path.AppendPoint( CFX_PointF( rcClient.left + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), rcClient.top), FXPT_TYPE::LineTo, false); } if (!path.GetPoints().empty()) { pDevice->DrawPath(&path, pUser2Device, &gsd, 0, GetBorderColor().ToFXColor(255), FXFILL_ALTERNATE); } break; } default: break; } } CFX_FloatRect rcClip; CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); CPVT_WordRange* pRange = nullptr; if (!HasFlag(PES_TEXTOVERFLOW)) { rcClip = GetClientRect(); pRange = &wrRange; } CFX_SystemHandler* pSysHandler = GetSystemHandler(); CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit.get(), GetTextColor().ToFXColor(GetTransparency()), rcClip, CFX_PointF(), pRange, pSysHandler, m_pFormFiller); }