示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
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;
}
示例#7
0
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());
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#10
0
CFDF_Document::CFDF_Document()
    : CPDF_IndirectObjectHolder(),
      m_pRootDict(nullptr),
      m_pFile(nullptr),
      m_bOwnFile(FALSE),
      m_pByteStringPool(WrapUnique(new CFX_ByteStringPool)) {}