| Index: fpdfsdk/fpdf_flatten.cpp
|
| diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
|
| index f39a50aad4b73728aff34ab281c7290ae0f24e56..1b93bb4d882b63ebb282925917af04112f94b3c9 100644
|
| --- a/fpdfsdk/fpdf_flatten.cpp
|
| +++ b/fpdfsdk/fpdf_flatten.cpp
|
| @@ -19,8 +19,6 @@
|
| #include "fpdfsdk/fsdk_define.h"
|
| #include "third_party/base/stl_util.h"
|
|
|
| -typedef CFX_ArrayTemplate<CFX_FloatRect> CPDF_RectArray;
|
| -
|
| enum FPDF_TYPE { MAX, MIN };
|
| enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM };
|
|
|
| @@ -47,7 +45,7 @@ bool IsValiableRect(CFX_FloatRect rect, CFX_FloatRect rcPage) {
|
|
|
| void GetContentsRect(CPDF_Document* pDoc,
|
| CPDF_Dictionary* pDict,
|
| - CPDF_RectArray* pRectArray) {
|
| + std::vector<CFX_FloatRect>* pRectArray) {
|
| std::unique_ptr<CPDF_Page> pPDFPage(new CPDF_Page(pDoc, pDict, false));
|
| pPDFPage->ParseContent();
|
|
|
| @@ -58,13 +56,13 @@ void GetContentsRect(CPDF_Document* pDoc,
|
| rc.bottom = pPageObject->m_Bottom;
|
| rc.top = pPageObject->m_Top;
|
| if (IsValiableRect(rc, pDict->GetRectFor("MediaBox")))
|
| - pRectArray->Add(rc);
|
| + pRectArray->push_back(rc);
|
| }
|
| }
|
|
|
| void ParserStream(CPDF_Dictionary* pPageDic,
|
| CPDF_Dictionary* pStream,
|
| - CPDF_RectArray* pRectArray,
|
| + std::vector<CFX_FloatRect>* pRectArray,
|
| std::vector<CPDF_Dictionary*>* pObjectArray) {
|
| if (!pStream)
|
| return;
|
| @@ -75,14 +73,14 @@ void ParserStream(CPDF_Dictionary* pPageDic,
|
| rect = pStream->GetRectFor("BBox");
|
|
|
| if (IsValiableRect(rect, pPageDic->GetRectFor("MediaBox")))
|
| - pRectArray->Add(rect);
|
| + pRectArray->push_back(rect);
|
|
|
| pObjectArray->push_back(pStream);
|
| }
|
|
|
| int ParserAnnots(CPDF_Document* pSourceDoc,
|
| CPDF_Dictionary* pPageDic,
|
| - CPDF_RectArray* pRectArray,
|
| + std::vector<CFX_FloatRect>* pRectArray,
|
| std::vector<CPDF_Dictionary*>* pObjectArray,
|
| int nUsage) {
|
| if (!pSourceDoc || !pPageDic)
|
| @@ -120,60 +118,48 @@ int ParserAnnots(CPDF_Document* pSourceDoc,
|
| return FLATTEN_SUCCESS;
|
| }
|
|
|
| -FX_FLOAT GetMinMaxValue(CPDF_RectArray& array,
|
| +FX_FLOAT GetMinMaxValue(const std::vector<CFX_FloatRect>& array,
|
| FPDF_TYPE type,
|
| FPDF_VALUE value) {
|
| - int nRects = array.GetSize();
|
| - FX_FLOAT fRet = 0.0f;
|
| -
|
| + size_t nRects = array.size();
|
| if (nRects <= 0)
|
| return 0.0f;
|
|
|
| - FX_FLOAT* pArray = new FX_FLOAT[nRects];
|
| + std::vector<FX_FLOAT> pArray(nRects);
|
| switch (value) {
|
| - case LEFT: {
|
| - for (int i = 0; i < nRects; i++)
|
| - pArray[i] = CFX_FloatRect(array.GetAt(i)).left;
|
| -
|
| + case LEFT:
|
| + for (size_t i = 0; i < nRects; i++)
|
| + pArray[i] = array[i].left;
|
| break;
|
| - }
|
| - case TOP: {
|
| - for (int i = 0; i < nRects; i++)
|
| - pArray[i] = CFX_FloatRect(array.GetAt(i)).top;
|
| -
|
| + case TOP:
|
| + for (size_t i = 0; i < nRects; i++)
|
| + pArray[i] = array[i].top;
|
| break;
|
| - }
|
| - case RIGHT: {
|
| - for (int i = 0; i < nRects; i++)
|
| - pArray[i] = CFX_FloatRect(array.GetAt(i)).right;
|
| -
|
| + case RIGHT:
|
| + for (size_t i = 0; i < nRects; i++)
|
| + pArray[i] = array[i].right;
|
| break;
|
| - }
|
| - case BOTTOM: {
|
| - for (int i = 0; i < nRects; i++)
|
| - pArray[i] = CFX_FloatRect(array.GetAt(i)).bottom;
|
| -
|
| + case BOTTOM:
|
| + for (size_t i = 0; i < nRects; i++)
|
| + pArray[i] = array[i].bottom;
|
| break;
|
| - }
|
| default:
|
| // Not reachable.
|
| return 0.0f;
|
| }
|
| - fRet = pArray[0];
|
| +
|
| + FX_FLOAT fRet = pArray[0];
|
| if (type == MAX) {
|
| - for (int i = 1; i < nRects; i++)
|
| - if (fRet <= pArray[i])
|
| - fRet = pArray[i];
|
| + for (size_t i = 1; i < nRects; i++)
|
| + fRet = std::max(fRet, pArray[i]);
|
| } else {
|
| - for (int i = 1; i < nRects; i++)
|
| - if (fRet >= pArray[i])
|
| - fRet = pArray[i];
|
| + for (size_t i = 1; i < nRects; i++)
|
| + fRet = std::min(fRet, pArray[i]);
|
| }
|
| - delete[] pArray;
|
| return fRet;
|
| }
|
|
|
| -CFX_FloatRect CalculateRect(CPDF_RectArray* pRectArray) {
|
| +CFX_FloatRect CalculateRect(std::vector<CFX_FloatRect>* pRectArray) {
|
| CFX_FloatRect rcRet;
|
|
|
| rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT);
|
| @@ -250,45 +236,34 @@ CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot,
|
|
|
| DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
|
| CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
|
| - if (!page) {
|
| + if (!page)
|
| return FLATTEN_FAIL;
|
| - }
|
|
|
| CPDF_Document* pDocument = pPage->m_pDocument;
|
| CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
|
| -
|
| - if (!pDocument || !pPageDict) {
|
| + if (!pDocument || !pPageDict)
|
| return FLATTEN_FAIL;
|
| - }
|
|
|
| std::vector<CPDF_Dictionary*> ObjectArray;
|
| - CPDF_RectArray RectArray;
|
| -
|
| - int iRet = FLATTEN_FAIL;
|
| - iRet = ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);
|
| + std::vector<CFX_FloatRect> RectArray;
|
| + int iRet =
|
| + ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);
|
| if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL)
|
| return iRet;
|
|
|
| CFX_FloatRect rcOriginalCB;
|
| CFX_FloatRect rcMerger = CalculateRect(&RectArray);
|
| CFX_FloatRect rcOriginalMB = pPageDict->GetRectFor("MediaBox");
|
| -
|
| if (pPageDict->KeyExist("CropBox"))
|
| rcOriginalMB = pPageDict->GetRectFor("CropBox");
|
|
|
| - if (rcOriginalMB.IsEmpty()) {
|
| + if (rcOriginalMB.IsEmpty())
|
| rcOriginalMB = CFX_FloatRect(0.0f, 0.0f, 612.0f, 792.0f);
|
| - }
|
| -
|
| - rcMerger.left =
|
| - rcMerger.left < rcOriginalMB.left ? rcOriginalMB.left : rcMerger.left;
|
| - rcMerger.right =
|
| - rcMerger.right > rcOriginalMB.right ? rcOriginalMB.right : rcMerger.right;
|
| - rcMerger.top =
|
| - rcMerger.top > rcOriginalMB.top ? rcOriginalMB.top : rcMerger.top;
|
| - rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom ? rcOriginalMB.bottom
|
| - : rcMerger.bottom;
|
|
|
| + rcMerger.left = std::max(rcMerger.left, rcOriginalMB.left);
|
| + rcMerger.right = std::min(rcMerger.right, rcOriginalMB.right);
|
| + rcMerger.bottom = std::max(rcMerger.bottom, rcOriginalMB.bottom);
|
| + rcMerger.top = std::min(rcMerger.top, rcOriginalMB.top);
|
| if (pPageDict->KeyExist("ArtBox"))
|
| rcOriginalCB = pPageDict->GetRectFor("ArtBox");
|
| else
|
| @@ -330,7 +305,6 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
|
|
|
| CFX_ByteString key = "";
|
| int nStreams = pdfium::CollectionSize<int>(ObjectArray);
|
| -
|
| if (nStreams > 0) {
|
| for (int iKey = 0; /*iKey < 100*/; iKey++) {
|
| char sExtend[5] = {};
|
| @@ -344,7 +318,6 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
|
| SetPageContents(key, pPageDict, pDocument);
|
|
|
| CPDF_Dictionary* pNewXORes = nullptr;
|
| -
|
| if (!key.IsEmpty()) {
|
| pPageXObject->SetReferenceFor(key, pDocument, dwObjNum);
|
| CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict();
|
| @@ -452,7 +425,5 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
|
| pNewXObject->SetData(sStream.raw_str(), sStream.GetLength());
|
| }
|
| pPageDict->RemoveFor("Annots");
|
| -
|
| - RectArray.RemoveAll();
|
| return FLATTEN_SUCCESS;
|
| }
|
|
|