| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../../include/fpdfapi/fpdf_page.h" | 7 #include "../../../include/fpdfapi/fpdf_page.h" |
| 8 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
| 9 #include "pageint.h" | 9 #include "pageint.h" |
| 10 CPDF_PageObject* CPDF_PageObject::Create(int type) | 10 CPDF_PageObject* CPDF_PageObject::Create(int type) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 if (m_Type != pSrc->m_Type) { | 37 if (m_Type != pSrc->m_Type) { |
| 38 return; | 38 return; |
| 39 } | 39 } |
| 40 CopyData(pSrc); | 40 CopyData(pSrc); |
| 41 CopyStates(*pSrc); | 41 CopyStates(*pSrc); |
| 42 m_Left = pSrc->m_Left; | 42 m_Left = pSrc->m_Left; |
| 43 m_Right = pSrc->m_Right; | 43 m_Right = pSrc->m_Right; |
| 44 m_Top = pSrc->m_Top; | 44 m_Top = pSrc->m_Top; |
| 45 m_Bottom = pSrc->m_Bottom; | 45 m_Bottom = pSrc->m_Bottom; |
| 46 } | 46 } |
| 47 void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerg
e) | 47 void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, bool bAutoMerge) |
| 48 { | 48 { |
| 49 m_ClipPath.AppendPath(path, type, bAutoMerge); | 49 m_ClipPath.AppendPath(path, type, bAutoMerge); |
| 50 } | 50 } |
| 51 void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj) | 51 void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj) |
| 52 { | 52 { |
| 53 m_ClipPath = pObj->m_ClipPath; | 53 m_ClipPath = pObj->m_ClipPath; |
| 54 } | 54 } |
| 55 void CPDF_PageObject::RemoveClipPath() | 55 void CPDF_PageObject::RemoveClipPath() |
| 56 { | 56 { |
| 57 m_ClipPath.SetNull(); | 57 m_ClipPath.SetNull(); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 } else { | 346 } else { |
| 347 m_pCharCodes = (FX_DWORD*)(uintptr_t)pCharCodes[0]; | 347 m_pCharCodes = (FX_DWORD*)(uintptr_t)pCharCodes[0]; |
| 348 } | 348 } |
| 349 RecalcPositionData(); | 349 RecalcPositionData(); |
| 350 } | 350 } |
| 351 | 351 |
| 352 FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const | 352 FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const |
| 353 { | 353 { |
| 354 FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; | 354 FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; |
| 355 CPDF_Font* pFont = m_TextState.GetFont(); | 355 CPDF_Font* pFont = m_TextState.GetFont(); |
| 356 FX_BOOL bVertWriting = FALSE; | 356 bool bVertWriting = false; |
| 357 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); | 357 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); |
| 358 if (pCIDFont) { | 358 if (pCIDFont) { |
| 359 bVertWriting = pCIDFont->IsVertWriting(); | 359 bVertWriting = pCIDFont->IsVertWriting(); |
| 360 } | 360 } |
| 361 if (!bVertWriting) | 361 if (!bVertWriting) |
| 362 return pFont->GetCharWidthF(charcode, 0) * fontsize; | 362 return pFont->GetCharWidthF(charcode, 0) * fontsize; |
| 363 | 363 |
| 364 FX_WORD CID = pCIDFont->CIDFromCharCode(charcode); | 364 FX_WORD CID = pCIDFont->CIDFromCharCode(charcode); |
| 365 return pCIDFont->GetVertWidth(CID) * fontsize; | 365 return pCIDFont->GetVertWidth(CID) * fontsize; |
| 366 } | 366 } |
| 367 | 367 |
| 368 FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const | 368 FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const |
| 369 { | 369 { |
| 370 CPDF_Font* pFont = m_TextState.GetFont(); | 370 CPDF_Font* pFont = m_TextState.GetFont(); |
| 371 FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32); | 371 FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32); |
| 372 if (charCode != (FX_DWORD) - 1) { | 372 if (charCode != (FX_DWORD) - 1) { |
| 373 return GetCharWidth(charCode); | 373 return GetCharWidth(charCode); |
| 374 } | 374 } |
| 375 FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f; | 375 FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f; |
| 376 FX_BOOL bVertWriting = FALSE; | 376 bool bVertWriting = false; |
| 377 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); | 377 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); |
| 378 if (pCIDFont) { | 378 if (pCIDFont) { |
| 379 bVertWriting = pCIDFont->IsVertWriting(); | 379 bVertWriting = pCIDFont->IsVertWriting(); |
| 380 } | 380 } |
| 381 FX_RECT fontRect; | 381 FX_RECT fontRect; |
| 382 pFont->GetFontBBox(fontRect); | 382 pFont->GetFontBBox(fontRect); |
| 383 fontSize *= bVertWriting ? | 383 fontSize *= bVertWriting ? |
| 384 (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width(); | 384 (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width(); |
| 385 return fontSize; | 385 return fontSize; |
| 386 } | 386 } |
| 387 | 387 |
| 388 void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const | 388 void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const |
| 389 { | 389 { |
| 390 CPDF_Font* pFont = m_TextState.GetFont(); | 390 CPDF_Font* pFont = m_TextState.GetFont(); |
| 391 FX_BOOL bVertWriting = FALSE; | 391 bool bVertWriting = false; |
| 392 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); | 392 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); |
| 393 if (pCIDFont) { | 393 if (pCIDFont) { |
| 394 bVertWriting = pCIDFont->IsVertWriting(); | 394 bVertWriting = pCIDFont->IsVertWriting(); |
| 395 } | 395 } |
| 396 FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; | 396 FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; |
| 397 int count = 0; | 397 int count = 0; |
| 398 for (int i = 0; i < m_nChars; ++i) { | 398 for (int i = 0; i < m_nChars; ++i) { |
| 399 FX_DWORD charcode = m_nChars == 1 ? | 399 FX_DWORD charcode = m_nChars == 1 ? |
| 400 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; | 400 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; |
| 401 if (charcode == (FX_DWORD) - 1) { | 401 if (charcode == (FX_DWORD) - 1) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 FX_FLOAT* pTextAdvanceY, | 434 FX_FLOAT* pTextAdvanceY, |
| 435 FX_FLOAT horz_scale, | 435 FX_FLOAT horz_scale, |
| 436 int level) | 436 int level) |
| 437 { | 437 { |
| 438 FX_FLOAT curpos = 0; | 438 FX_FLOAT curpos = 0; |
| 439 FX_FLOAT min_x = 10000 * 1.0f; | 439 FX_FLOAT min_x = 10000 * 1.0f; |
| 440 FX_FLOAT max_x = -10000 * 1.0f; | 440 FX_FLOAT max_x = -10000 * 1.0f; |
| 441 FX_FLOAT min_y = 10000 * 1.0f; | 441 FX_FLOAT min_y = 10000 * 1.0f; |
| 442 FX_FLOAT max_y = -10000 * 1.0f; | 442 FX_FLOAT max_y = -10000 * 1.0f; |
| 443 CPDF_Font* pFont = m_TextState.GetFont(); | 443 CPDF_Font* pFont = m_TextState.GetFont(); |
| 444 FX_BOOL bVertWriting = FALSE; | 444 bool bVertWriting = false; |
| 445 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); | 445 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); |
| 446 if (pCIDFont) { | 446 if (pCIDFont) { |
| 447 bVertWriting = pCIDFont->IsVertWriting(); | 447 bVertWriting = pCIDFont->IsVertWriting(); |
| 448 } | 448 } |
| 449 FX_FLOAT fontsize = m_TextState.GetFontSize(); | 449 FX_FLOAT fontsize = m_TextState.GetFontSize(); |
| 450 for (int i = 0; i < m_nChars; ++i) { | 450 for (int i = 0; i < m_nChars; ++i) { |
| 451 FX_DWORD charcode = m_nChars == 1 ? | 451 FX_DWORD charcode = m_nChars == 1 ? |
| 452 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; | 452 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; |
| 453 if (charcode == (FX_DWORD) - 1) { | 453 if (charcode == (FX_DWORD) - 1) { |
| 454 curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000; | 454 curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 m_Left -= half_width; | 563 m_Left -= half_width; |
| 564 m_Right += half_width; | 564 m_Right += half_width; |
| 565 m_Top += half_width; | 565 m_Top += half_width; |
| 566 m_Bottom -= half_width; | 566 m_Bottom -= half_width; |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 | 569 |
| 570 void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const | 570 void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const |
| 571 { | 571 { |
| 572 CPDF_Font* pFont = m_TextState.GetFont(); | 572 CPDF_Font* pFont = m_TextState.GetFont(); |
| 573 FX_BOOL bVertWriting = FALSE; | 573 bool bVertWriting = false; |
| 574 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); | 574 CPDF_CIDFont* pCIDFont = pFont->GetCIDFont(); |
| 575 if (pCIDFont) { | 575 if (pCIDFont) { |
| 576 bVertWriting = pCIDFont->IsVertWriting(); | 576 bVertWriting = pCIDFont->IsVertWriting(); |
| 577 } | 577 } |
| 578 FX_FLOAT fontsize = m_TextState.GetFontSize(); | 578 FX_FLOAT fontsize = m_TextState.GetFontSize(); |
| 579 for (int i = 0, index = 0; i < m_nChars; ++i) { | 579 for (int i = 0, index = 0; i < m_nChars; ++i) { |
| 580 FX_DWORD charcode = m_nChars == 1 ? | 580 FX_DWORD charcode = m_nChars == 1 ? |
| 581 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; | 581 (FX_DWORD)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; |
| 582 if (charcode == (FX_DWORD) - 1) { | 582 if (charcode == (FX_DWORD) - 1) { |
| 583 continue; | 583 continue; |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 } | 713 } |
| 714 void CPDF_FormObject::CalcBoundingBox() | 714 void CPDF_FormObject::CalcBoundingBox() |
| 715 { | 715 { |
| 716 CFX_FloatRect form_rect = m_pForm->CalcBoundingBox(); | 716 CFX_FloatRect form_rect = m_pForm->CalcBoundingBox(); |
| 717 form_rect.Transform(&m_FormMatrix); | 717 form_rect.Transform(&m_FormMatrix); |
| 718 m_Left = form_rect.left; | 718 m_Left = form_rect.left; |
| 719 m_Bottom = form_rect.bottom; | 719 m_Bottom = form_rect.bottom; |
| 720 m_Right = form_rect.right; | 720 m_Right = form_rect.right; |
| 721 m_Top = form_rect.top; | 721 m_Top = form_rect.top; |
| 722 } | 722 } |
| 723 CPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128) | 723 CPDF_PageObjects::CPDF_PageObjects(bool bReleaseMembers) : m_ObjectList(128) |
| 724 { | 724 { |
| 725 m_bBackgroundAlphaNeeded = FALSE; | 725 m_bBackgroundAlphaNeeded = false; |
| 726 m_bReleaseMembers = bReleaseMembers; | 726 m_bReleaseMembers = bReleaseMembers; |
| 727 m_ParseState = PDF_CONTENT_NOT_PARSED; | 727 m_ParseState = PDF_CONTENT_NOT_PARSED; |
| 728 m_pParser = NULL; | 728 m_pParser = NULL; |
| 729 m_pFormStream = NULL; | 729 m_pFormStream = NULL; |
| 730 m_pResources = NULL; | 730 m_pResources = NULL; |
| 731 } | 731 } |
| 732 CPDF_PageObjects::~CPDF_PageObjects() | 732 CPDF_PageObjects::~CPDF_PageObjects() |
| 733 { | 733 { |
| 734 delete m_pParser; | 734 delete m_pParser; |
| 735 if (!m_bReleaseMembers) { | 735 if (!m_bReleaseMembers) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 852 while (pos) { | 852 while (pos) { |
| 853 delete (CPDF_PageObject*)m_ObjectList.GetNext(pos); | 853 delete (CPDF_PageObject*)m_ObjectList.GetNext(pos); |
| 854 } | 854 } |
| 855 } | 855 } |
| 856 m_ObjectList.RemoveAll(); | 856 m_ObjectList.RemoveAll(); |
| 857 } | 857 } |
| 858 CPDF_Page::CPDF_Page() | 858 CPDF_Page::CPDF_Page() |
| 859 { | 859 { |
| 860 m_pPageRender = NULL; | 860 m_pPageRender = NULL; |
| 861 } | 861 } |
| 862 void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BO
OL bPageCache) | 862 void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, bool
bPageCache) |
| 863 { | 863 { |
| 864 m_pDocument = (CPDF_Document*)pDocument; | 864 m_pDocument = (CPDF_Document*)pDocument; |
| 865 m_pFormDict = pPageDict; | 865 m_pFormDict = pPageDict; |
| 866 if (bPageCache) { | 866 if (bPageCache) { |
| 867 m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCach
e(this); | 867 m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCach
e(this); |
| 868 } | 868 } |
| 869 if (pPageDict == NULL) { | 869 if (pPageDict == NULL) { |
| 870 m_PageWidth = m_PageHeight = 100 * 1.0f; | 870 m_PageWidth = m_PageHeight = 100 * 1.0f; |
| 871 m_pPageResources = m_pResources = NULL; | 871 m_pPageResources = m_pResources = NULL; |
| 872 return; | 872 return; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 case 2: | 919 case 2: |
| 920 m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top); | 920 m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top); |
| 921 break; | 921 break; |
| 922 case 3: | 922 case 3: |
| 923 m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left); | 923 m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left); |
| 924 break; | 924 break; |
| 925 } | 925 } |
| 926 m_Transparency = PDFTRANS_ISOLATED; | 926 m_Transparency = PDFTRANS_ISOLATED; |
| 927 LoadTransInfo(); | 927 LoadTransInfo(); |
| 928 } | 928 } |
| 929 void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse) | 929 void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, bool bReParse) |
| 930 { | 930 { |
| 931 if (bReParse) { | 931 if (bReParse) { |
| 932 ClearCacheObjects(); | 932 ClearCacheObjects(); |
| 933 } | 933 } |
| 934 if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSIN
G) { | 934 if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSIN
G) { |
| 935 return; | 935 return; |
| 936 } | 936 } |
| 937 m_pParser = new CPDF_ContentParser; | 937 m_pParser = new CPDF_ContentParser; |
| 938 m_pParser->Start(this, pOptions); | 938 m_pParser->Start(this, pOptions); |
| 939 m_ParseState = PDF_CONTENT_PARSING; | 939 m_ParseState = PDF_CONTENT_PARSING; |
| 940 } | 940 } |
| 941 void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse) | 941 void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, bool bReParse) |
| 942 { | 942 { |
| 943 StartParse(pOptions, bReParse); | 943 StartParse(pOptions, bReParse); |
| 944 ContinueParse(NULL); | 944 ContinueParse(NULL); |
| 945 } | 945 } |
| 946 CPDF_Page::~CPDF_Page() | 946 CPDF_Page::~CPDF_Page() |
| 947 { | 947 { |
| 948 if (m_pPageRender) { | 948 if (m_pPageRender) { |
| 949 IPDF_RenderModule* pModule = CPDF_ModuleMgr::Get()->GetRenderModule(); | 949 IPDF_RenderModule* pModule = CPDF_ModuleMgr::Get()->GetRenderModule(); |
| 950 pModule->DestroyPageCache(m_pPageRender); | 950 pModule->DestroyPageCache(m_pPageRender); |
| 951 } | 951 } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth), | 1064 display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth), |
| 1065 FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth), | 1065 FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth), |
| 1066 FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight), | 1066 FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight), |
| 1067 FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight), | 1067 FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight), |
| 1068 (FX_FLOAT)x0, (FX_FLOAT)y0); | 1068 (FX_FLOAT)x0, (FX_FLOAT)y0); |
| 1069 matrix = m_PageMatrix; | 1069 matrix = m_PageMatrix; |
| 1070 matrix.Concat(display_matrix); | 1070 matrix.Concat(display_matrix); |
| 1071 } | 1071 } |
| 1072 CPDF_ParseOptions::CPDF_ParseOptions() | 1072 CPDF_ParseOptions::CPDF_ParseOptions() |
| 1073 { | 1073 { |
| 1074 m_bTextOnly = FALSE; | 1074 m_bTextOnly = false; |
| 1075 m_bMarkedContent = TRUE; | 1075 m_bMarkedContent = true; |
| 1076 m_bSeparateForm = TRUE; | 1076 m_bSeparateForm = true; |
| 1077 m_bDecodeInlineImage = FALSE; | 1077 m_bDecodeInlineImage = false; |
| 1078 } | 1078 } |
| OLD | NEW |