CFX_FloatRect CPDFSDK_WidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) { if (!pAnnot->IsSignatureWidget() && m_pFormFiller) return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot)); return CFX_FloatRect(0, 0, 0, 0); }
CFX_FloatRect CPDF_ClipPath::GetClipBox() const { CFX_FloatRect rect; bool bStarted = false; if (GetPathCount() > 0) { rect = GetPath(0).GetBoundingBox(); for (size_t i = 1; i < GetPathCount(); ++i) { CFX_FloatRect path_rect = GetPath(i).GetBoundingBox(); rect.Intersect(path_rect); } bStarted = true; } CFX_FloatRect layer_rect; bool bLayerStarted = false; for (size_t i = 0; i < GetTextCount(); ++i) { CPDF_TextObject* pTextObj = GetText(i); if (pTextObj) { if (bLayerStarted) { layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox())); } else { layer_rect = CFX_FloatRect(pTextObj->GetBBox()); bLayerStarted = true; } } else { if (bStarted) { rect.Intersect(layer_rect); } else { rect = layer_rect; bStarted = true; } bLayerStarted = false; } } return rect; }
CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const { if (m_ObjectList.GetCount() == 0) { return CFX_FloatRect(0, 0, 0, 0); } FX_FLOAT left, right, top, bottom; left = bottom = 1000000 * 1.0f; right = top = -1000000 * 1.0f; FX_POSITION pos = m_ObjectList.GetHeadPosition(); while (pos) { CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); if (left > pObj->m_Left) { left = pObj->m_Left; } if (right < pObj->m_Right) { right = pObj->m_Right; } if (top < pObj->m_Top) { top = pObj->m_Top; } if (bottom > pObj->m_Bottom) { bottom = pObj->m_Bottom; } } return CFX_FloatRect(left, bottom, right, top); }
CFX_FloatRect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) { CFX_ByteString sSubType = pAnnot->GetSubType(); if (sSubType != BFFT_SIGNATURE && m_pFormFiller) return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot)); return CFX_FloatRect(0, 0, 0, 0); }
CFX_FloatRect CFFL_FormFiller::GetPDFWindowRect() const { CFX_FloatRect rectAnnot; m_pWidget->GetPDFAnnot()->GetRect(rectAnnot); FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; if ((m_pWidget->GetRotate() / 90) & 0x01) return CFX_FloatRect(0, 0, fHeight, fWidth); return CFX_FloatRect(0, 0, fWidth, fHeight); }
FX_FLOAT GetMinMaxValue(CPDF_RectArray& array, FPDF_TYPE type, FPDF_VALUE value) { int nRects = array.GetSize(); FX_FLOAT fRet = 0.0f; if (nRects <= 0) return 0.0f; FX_FLOAT* pArray = new FX_FLOAT[nRects]; switch (value) { case LEFT: { for (int i = 0; i < nRects; i++) pArray[i] = CFX_FloatRect(array.GetAt(i)).left; break; } case TOP: { for (int i = 0; i < nRects; i++) pArray[i] = CFX_FloatRect(array.GetAt(i)).top; break; } case RIGHT: { for (int i = 0; i < nRects; i++) pArray[i] = CFX_FloatRect(array.GetAt(i)).right; break; } case BOTTOM: { for (int i = 0; i < nRects; i++) pArray[i] = CFX_FloatRect(array.GetAt(i)).bottom; break; } default: // Not reachable. return 0.0f; } fRet = pArray[0]; if (type == MAX) { for (int i = 1; i < nRects; i++) if (fRet <= pArray[i]) fRet = pArray[i]; } else { for (int i = 1; i < nRects; i++) if (fRet >= pArray[i]) fRet = pArray[i]; } delete[] pArray; return fRet; }
CFX_FloatRect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView) { if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { return pWnd->GetWindowRect(); } return CFX_FloatRect(0, 0, 0, 0); }
void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM& cp) { if (!m_pList) { m_pList = new CPWL_CBListBox; m_pList->AttachFFLData(m_pFormFiller); PWL_CREATEPARAM lcp = cp; lcp.pParentWnd = this; lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL; lcp.nBorderStyle = BorderStyle::SOLID; lcp.dwBorderWidth = 1; lcp.eCursorType = FXCT_ARROW; lcp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); if (cp.dwFlags & PWS_AUTOFONTSIZE) lcp.fFontSize = PWLCB_DEFAULTFONTSIZE; else lcp.fFontSize = cp.fFontSize; if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT) lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT) lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; m_pList->Create(lcp); } }
CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const { if (m_PageObjectList.empty()) return CFX_FloatRect(0, 0, 0, 0); FX_FLOAT left = 1000000.0f; FX_FLOAT right = -1000000.0f; FX_FLOAT bottom = 1000000.0f; FX_FLOAT top = -1000000.0f; for (const auto& pObj : m_PageObjectList) { left = std::min(left, pObj->m_Left); right = std::max(right, pObj->m_Right); bottom = std::min(bottom, pObj->m_Bottom); top = std::max(top, pObj->m_Top); } return CFX_FloatRect(left, bottom, right, top); }
bool CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const FX_RECT& rect, const CPDF_PageObject* pObj, int max_dpi) { m_pDevice = pDevice; m_pContext = pContext; m_Rect = rect; m_pObject = pObj; m_Matrix.Translate(-rect.left, -rect.top); #if _FX_PLATFORM_ != _FX_PLATFORM_APPLE_ int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE); int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE); if (horz_size && vert_size && max_dpi) { int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10); int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10); if (dpih > max_dpi) m_Matrix.Scale((float)(max_dpi) / dpih, 1.0f); if (dpiv > max_dpi) m_Matrix.Scale(1.0f, (float)(max_dpi) / (float)dpiv); } #endif FX_RECT bitmap_rect = m_Matrix.TransformRect(CFX_FloatRect(rect)).GetOuterRect(); m_pBitmap = pdfium::MakeRetain<CFX_DIBitmap>(); m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb); return true; }
CFX_FloatRect CPDF_VariableText::InToOut(const CPVT_FloatRect& rect) const { CFX_FloatPoint ptLeftTop = InToOut(CFX_FloatPoint(rect.left, rect.top)); CFX_FloatPoint ptRightBottom = InToOut(CFX_FloatPoint(rect.right, rect.bottom)); return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y); }
Optional<PAGECHAR_INFO> CPDF_TextPage::GenerateCharInfo(wchar_t unicode) { const PAGECHAR_INFO* pPrevCharInfo = GetPrevCharInfo(); if (!pPrevCharInfo) return {}; PAGECHAR_INFO info; info.m_Index = m_TextBuf.GetLength(); info.m_CharCode = CPDF_Font::kInvalidCharCode; info.m_Unicode = unicode; info.m_Flag = FPDFTEXT_CHAR_GENERATED; int preWidth = 0; if (pPrevCharInfo->m_pTextObj && pPrevCharInfo->m_CharCode != -1) { preWidth = GetCharWidth(pPrevCharInfo->m_CharCode, pPrevCharInfo->m_pTextObj->GetFont()); } float fFontSize = pPrevCharInfo->m_pTextObj ? pPrevCharInfo->m_pTextObj->GetFontSize() : pPrevCharInfo->m_CharBox.Height(); if (!fFontSize) fFontSize = kDefaultFontSize; info.m_Origin = CFX_PointF(pPrevCharInfo->m_Origin.x + preWidth * (fFontSize) / 1000, pPrevCharInfo->m_Origin.y); info.m_CharBox = CFX_FloatRect(info.m_Origin.x, info.m_Origin.y, info.m_Origin.x, info.m_Origin.y); return info; }
CFX_FloatRect CPDF_Annot::GetRect() const { if (!m_pAnnotDict) return CFX_FloatRect(); CFX_FloatRect rect = m_pAnnotDict->GetRectBy("Rect"); rect.Normalize(); return rect; }
FPDF_EXPORT void FPDF_CALLCONV FPDFPage_SetTrimBox(FPDF_PAGE page, float left, float bottom, float right, float top) { SetBoundingBox(CPDFPageFromFPDFPage(page), pdfium::page_object::kTrimBox, CFX_FloatRect(left, bottom, right, top)); }
CFX_FloatRect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) { if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { CFX_FloatRect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect())); CFX_FloatRect rcPage = pPageView->GetPDFPage()->GetPageBBox(); if (rcPage.Contains(rcFocus)) return rcFocus; } return CFX_FloatRect(0, 0, 0, 0); }
CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const { if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { CFX_FloatRect rcItem = pListItem->GetRect(); rcItem.left = 0.0f; rcItem.right = GetPlateRect().Width(); return InnerToOuter(CLST_Rect(rcItem)); } return CFX_FloatRect(); }
CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS) { if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) { return CFX_FloatRect(0, 0, 0, 0); } CPDF_MeshStream stream; if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) { return CFX_FloatRect(0, 0, 0, 0); } CFX_FloatRect rect; FX_BOOL bStarted = FALSE; FX_BOOL bGouraud = type == 4 || type == 5; int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1); int full_color_count = (type == 6 || type == 7) ? 4 : 1; while (!stream.m_BitStream.IsEOF()) { FX_DWORD flag; if (type != 5) { flag = stream.GetFlag(); } int point_count = full_point_count, color_count = full_color_count; if (!bGouraud && flag) { point_count -= 4; color_count -= 2; } for (int i = 0; i < point_count; i ++) { FX_FLOAT x, y; stream.GetCoords(x, y); if (bStarted) { rect.UpdateRect(x, y); } else { rect.InitRect(x, y); bStarted = TRUE; } } stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count); if (bGouraud) { stream.m_BitStream.ByteAlign(); } } rect.Transform(pMatrix); return rect; }
CFX_FloatRect CPWL_Wnd::GetClientRect() const { CFX_FloatRect rcWindow = GetWindowRect(); CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( rcWindow, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); if (CPWL_ScrollBar* pVSB = GetVScrollBar()) rcClient.right -= pVSB->GetScrollBarWidth(); rcClient.Normalize(); return rcWindow.Contains(rcClient) ? rcClient : CFX_FloatRect(); }
void CPWL_Label::OnCreated() { SetParamByFlag(); SetFontSize(GetCreationParam().fFontSize); m_pEdit->SetFontMap(GetFontMap()); m_pEdit->Initialize(); if (HasFlag(PES_TEXTOVERFLOW)) { SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f)); m_pEdit->SetTextOverflow(TRUE); } }
CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_PointF* pPoints, int nPoints) { if (nPoints == 0) { return CFX_FloatRect(); } FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y; for (int i = 1; i < nPoints; i++) { if (min_x > pPoints[i].x) { min_x = pPoints[i].x; } if (max_x < pPoints[i].x) { max_x = pPoints[i].x; } if (min_y > pPoints[i].y) { min_y = pPoints[i].y; } if (max_y < pPoints[i].y) { max_y = pPoints[i].y; } } return CFX_FloatRect(min_x, min_y, max_x, max_y); }
void CPDF_Type3Char::Transform(const CFX_Matrix& matrix) { m_Width = m_Width * matrix.GetXUnit() + 0.5f; CFX_FloatRect char_rect; if (m_BBox.right <= m_BBox.left || m_BBox.bottom >= m_BBox.top) { char_rect = form()->CalcBoundingBox(); TextUnitRectToGlyphUnitRect(&char_rect); } else { char_rect = CFX_FloatRect(m_BBox); } m_BBox = matrix.TransformRect(char_rect).ToRoundedFxRect(); }
void CPWL_Wnd::RePosChildWnd() { CFX_FloatRect rcContent = CPWL_Utils::DeflateRect( GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); CPWL_ScrollBar* pVSB = GetVScrollBar(); CFX_FloatRect rcVScroll = CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom, rcContent.right - 1.0f, rcContent.top); if (pVSB) pVSB->Move(rcVScroll, TRUE, FALSE); }
CFX_FloatRect CPDF_ClipPath::GetClipBox() const { CFX_FloatRect rect; bool bStarted = false; int count = GetPathCount(); if (count) { rect = GetPath(0).GetBoundingBox(); for (int i = 1; i < count; i++) { CFX_FloatRect path_rect = GetPath(i).GetBoundingBox(); rect.Intersect(path_rect); } bStarted = true; } count = GetTextCount(); if (count) { CFX_FloatRect layer_rect; bool bLayerStarted = false; for (int i = 0; i < count; i++) { CPDF_TextObject* pTextObj = GetText(i); if (!pTextObj) { if (!bStarted) { rect = layer_rect; bStarted = true; } else { rect.Intersect(layer_rect); } bLayerStarted = false; } else { if (!bLayerStarted) { layer_rect = CFX_FloatRect(pTextObj->GetBBox(nullptr)); bLayerStarted = true; } else { layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox(nullptr))); } } } } return rect; }
void CPWL_Edit::RePosChildWnd() { if (CPWL_ScrollBar* pVSB = GetVScrollBar()) { CFX_FloatRect rcWindow = m_rcOldWindow; CFX_FloatRect rcVScroll = CFX_FloatRect(rcWindow.right, rcWindow.bottom, rcWindow.right + PWL_SCROLLBAR_WIDTH, rcWindow.top); pVSB->Move(rcVScroll, true, false); } if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW)) m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( GetClientRect(), 1.0f)); // +1 for caret beside border CPWL_EditCtrl::RePosChildWnd(); }
void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM& cp) { if (m_pEditCaret) return; m_pEditCaret = new CPWL_Caret; m_pEditCaret->SetInvalidRect(GetClientRect()); PWL_CREATEPARAM ecp = cp; ecp.pParentWnd = this; ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP; ecp.dwBorderWidth = 0; ecp.nBorderStyle = BorderStyle::SOLID; ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); m_pEditCaret->Create(ecp); }
void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM& cp) { if (!m_pEdit) { m_pEdit = new CPWL_CBEdit; m_pEdit->AttachFFLData(m_pFormFiller); PWL_CREATEPARAM ecp = cp; ecp.pParentWnd = this; ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO; if (HasFlag(PWS_AUTOFONTSIZE)) ecp.dwFlags |= PWS_AUTOFONTSIZE; if (!HasFlag(PCBS_ALLOWCUSTOMTEXT)) ecp.dwFlags |= PWS_READONLY; ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); ecp.dwBorderWidth = 0; ecp.nBorderStyle = BorderStyle::SOLID; m_pEdit->Create(ecp); } }
void CPWL_Edit::SetParamByFlag() { if (HasFlag(PES_RIGHT)) { m_pEdit->SetAlignmentH(2, false); } else if (HasFlag(PES_MIDDLE)) { m_pEdit->SetAlignmentH(1, false); } else { m_pEdit->SetAlignmentH(0, false); } if (HasFlag(PES_BOTTOM)) { m_pEdit->SetAlignmentV(2, false); } else if (HasFlag(PES_CENTER)) { m_pEdit->SetAlignmentV(1, false); } else { m_pEdit->SetAlignmentV(0, false); } if (HasFlag(PES_PASSWORD)) { m_pEdit->SetPasswordChar('*', false); } m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), false); m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), false); m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), false); m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), false); m_pEdit->EnableUndo(HasFlag(PES_UNDO)); if (HasFlag(PES_TEXTOVERFLOW)) { SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f)); m_pEdit->SetTextOverflow(true, false); } else { if (m_pEditCaret) { m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( GetClientRect(), 1.0f)); // +1 for caret beside border } } }
void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { while (m_Status == ToBeContinued) { if (!m_pCurrentLayer) { if (m_LayerIndex >= m_pContext->CountLayers()) { m_Status = Done; return; } m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); m_LastObjectRendered = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); m_pRenderStatus.reset(new CPDF_RenderStatus()); m_pRenderStatus->Initialize( m_pContext, m_pDevice, nullptr, nullptr, nullptr, nullptr, m_pOptions, m_pCurrentLayer->m_pObjectHolder->m_Transparency, FALSE, nullptr); m_pDevice->SaveState(); m_ClipRect = CFX_FloatRect(m_pDevice->GetClipBox()); CFX_Matrix device2object; device2object.SetReverse(m_pCurrentLayer->m_Matrix); device2object.TransformRect(m_ClipRect); } CPDF_PageObjectList::iterator iter; CPDF_PageObjectList::iterator iterEnd = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); if (m_LastObjectRendered != iterEnd) { iter = m_LastObjectRendered; ++iter; } else { iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin(); } int nObjsToGo = kStepLimit; while (iter != iterEnd) { CPDF_PageObject* pCurObj = iter->get(); if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left && pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) { if (m_pRenderStatus->ContinueSingleObject( pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { return; } if (pCurObj->IsImage() && m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { m_pContext->GetPageCache()->CacheOptimization( m_pRenderStatus->m_Options.m_dwLimitCacheSize); } if (pCurObj->IsForm() || pCurObj->IsShading()) { nObjsToGo = 0; } else { --nObjsToGo; } } m_LastObjectRendered = iter; if (nObjsToGo == 0) { if (pPause && pPause->NeedToPauseNow()) return; nObjsToGo = kStepLimit; } ++iter; } if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { m_pRenderStatus.reset(); m_pDevice->RestoreState(false); m_pCurrentLayer = nullptr; m_LayerIndex++; if (pPause && pPause->NeedToPauseNow()) { return; } } else { m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) return; } } }
void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CFX_FloatRect& rcWindow) { if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) { pWnd->Move(CFX_FloatRect(rcWindow), TRUE, FALSE); } }
CFX_FloatRect CPWL_Caret::GetCaretRect() const { return CFX_FloatRect(m_ptFoot.x, m_ptFoot.y, m_ptHead.x + m_fWidth, m_ptHead.y); }