FX_BOOL CFX_ImageTransformer::Start() { CFX_FloatRect unit_rect = m_pMatrix->GetUnitRect(); FX_RECT result_rect = unit_rect.GetClosestRect(); FX_RECT result_clip = result_rect; if (m_pClip) result_clip.Intersect(*m_pClip); if (result_clip.IsEmpty()) return FALSE; m_result = result_clip; if (FXSYS_fabs(m_pMatrix->a) < FXSYS_fabs(m_pMatrix->b) / 20 && FXSYS_fabs(m_pMatrix->d) < FXSYS_fabs(m_pMatrix->c) / 20 && FXSYS_fabs(m_pMatrix->a) < 0.5f && FXSYS_fabs(m_pMatrix->d) < 0.5f) { int dest_width = result_rect.Width(); int dest_height = result_rect.Height(); result_clip.Offset(-result_rect.left, -result_rect.top); result_clip = FXDIB_SwapClipBox(result_clip, dest_width, dest_height, m_pMatrix->c > 0, m_pMatrix->b < 0); m_Stretcher = WrapUnique(new CFX_ImageStretcher( &m_Storer, m_pSrc, dest_height, dest_width, result_clip, m_Flags)); m_Stretcher->Start(); m_Status = 1; return TRUE; } if (FXSYS_fabs(m_pMatrix->b) < FIX16_005 && FXSYS_fabs(m_pMatrix->c) < FIX16_005) { int dest_width = m_pMatrix->a > 0 ? (int)FXSYS_ceil(m_pMatrix->a) : (int)FXSYS_floor(m_pMatrix->a); int dest_height = m_pMatrix->d > 0 ? (int)-FXSYS_ceil(m_pMatrix->d) : (int)-FXSYS_floor(m_pMatrix->d); result_clip.Offset(-result_rect.left, -result_rect.top); m_Stretcher = WrapUnique(new CFX_ImageStretcher( &m_Storer, m_pSrc, dest_width, dest_height, result_clip, m_Flags)); m_Stretcher->Start(); m_Status = 2; return TRUE; } int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->a, m_pMatrix->b)); int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->c, m_pMatrix->d)); CFX_Matrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height)); stretch2dest.Concat( m_pMatrix->a / stretch_width, m_pMatrix->b / stretch_width, m_pMatrix->c / stretch_height, m_pMatrix->d / stretch_height, m_pMatrix->e, m_pMatrix->f); m_dest2stretch.SetReverse(stretch2dest); CFX_FloatRect clip_rect_f(result_clip); clip_rect_f.Transform(&m_dest2stretch); m_StretchClip = clip_rect_f.GetOuterRect(); m_StretchClip.Intersect(0, 0, stretch_width, stretch_height); m_Stretcher = WrapUnique(new CFX_ImageStretcher(&m_Storer, m_pSrc, stretch_width, stretch_height, m_StretchClip, m_Flags)); m_Stretcher->Start(); m_Status = 3; return TRUE; }
DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y, int rotate, int flags, IFSDK_PAUSE* pause) { if (!bitmap || !pause || pause->version != 1) return FPDF_RENDER_FAILED; CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!pPage) return FPDF_RENDER_FAILED; CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; pPage->SetRenderContext(WrapUnique(pContext)); CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; pContext->m_pDevice.reset(pDevice); CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); pDevice->Attach(pBitmap, !!(flags & FPDF_REVERSE_BYTE_ORDER), nullptr, false); IFSDK_PAUSE_Adapter IPauseAdapter(pause); FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, rotate, flags, FALSE, &IPauseAdapter); if (pContext->m_pRenderer) { return CPDF_ProgressiveRenderer::ToFPDFStatus( pContext->m_pRenderer->GetStatus()); } return FPDF_RENDER_FAILED; }
DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo) { #ifdef PDF_ENABLE_XFA const int kRequiredVersion = 2; #else // PDF_ENABLE_XFA const int kRequiredVersion = 1; #endif // PDF_ENABLE_XFA if (!formInfo || formInfo->version != kRequiredVersion) return nullptr; UnderlyingDocumentType* pDocument = UnderlyingFromFPDFDocument(document); if (!pDocument) return nullptr; #ifdef PDF_ENABLE_XFA // If the CPDFXFA_Document has a SDKDocument already then we've done this // and can just return the old Env. Otherwise, we'll end up setting a new // SDKDocument into the XFADocument and, that could get weird. if (pDocument->GetSDKDoc()) return pDocument->GetSDKDoc()->GetEnv(); #endif CPDFSDK_Environment* pEnv = new CPDFSDK_Environment(pDocument, formInfo); #ifdef PDF_ENABLE_XFA // Ownership of the SDKDocument is passed to the CPDFXFA_Document. pDocument->SetSDKDoc(WrapUnique(pEnv->GetSDKDocument())); CPDFXFA_App::GetInstance()->AddFormFillEnv(pEnv); #endif // PDF_ENABLE_XFA return pEnv; }
FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) { if (!m_pDocument || m_iPageIndex < 0 || !pageDict) return FALSE; m_pPDFPage = WrapUnique(new CPDF_Page(m_pDocument->GetPDFDoc(), pageDict, true)); m_pPDFPage->ParseContent(); return TRUE; }
uint32_t CPDF_Font::FallbackFontFromCharcode(uint32_t charcode) { if (m_FontFallbacks.empty()) { m_FontFallbacks.push_back(WrapUnique(new CFX_Font())); m_FontFallbacks[0]->LoadSubst("Arial", IsTrueTypeFont(), m_Flags, m_StemV * 5, m_ItalicAngle, 0, IsVertWriting()); } return 0; }
DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file) { CFPDF_DataAvail* pAvail = new CFPDF_DataAvail; pAvail->m_FileAvail.Set(file_avail); pAvail->m_FileRead.Set(file); pAvail->m_pDataAvail = WrapUnique( new CPDF_DataAvail(&pAvail->m_FileAvail, &pAvail->m_FileRead, TRUE)); return pAvail; }
CPDF_Document::CPDF_Document(std::unique_ptr<CPDF_Parser> pParser) : CPDF_IndirectObjectHolder(), m_pParser(std::move(pParser)), m_pRootDict(nullptr), m_pInfoDict(nullptr), m_bLinearized(false), m_iFirstPageNo(0), m_dwFirstPageObjNum(0), m_pDocPage(new CPDF_DocPageData(this)), m_pDocRender(new CPDF_DocRenderData(this)), m_pByteStringPool(WrapUnique(new CFX_ByteStringPool)) { if (pParser) SetLastObjNum(m_pParser->GetLastObjNum()); }
CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode); if (!pStream) return nullptr; auto it = m_APMap.find(pStream); if (it != m_APMap.end()) return it->second.get(); CPDF_Form* pNewForm = new CPDF_Form(m_pDocument, pPage->m_pResources, pStream); pNewForm->ParseContent(nullptr, nullptr, nullptr); m_APMap[pStream] = WrapUnique(pNewForm); return pNewForm; }
FX_BOOL CPDFXFA_Page::LoadPDFPage() { if (!m_pDocument) return FALSE; CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc(); if (!pPDFDoc) return FALSE; CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex); if (!pDict) return FALSE; if (!m_pPDFPage || m_pPDFPage->m_pFormDict != pDict) { m_pPDFPage = WrapUnique(new CPDF_Page(pPDFDoc, pDict, true)); m_pPDFPage->ParseContent(); } return TRUE; }
CFDF_Document::CFDF_Document() : CPDF_IndirectObjectHolder(), m_pRootDict(nullptr), m_pFile(nullptr), m_bOwnFile(FALSE), m_pByteStringPool(WrapUnique(new CFX_ByteStringPool)) {}