diff options
Diffstat (limited to 'fpdfsdk/src/fpdf_transformpage.cpp')
-rw-r--r-- | fpdfsdk/src/fpdf_transformpage.cpp | 327 |
1 files changed, 0 insertions, 327 deletions
diff --git a/fpdfsdk/src/fpdf_transformpage.cpp b/fpdfsdk/src/fpdf_transformpage.cpp deleted file mode 100644 index f3c2576dd5..0000000000 --- a/fpdfsdk/src/fpdf_transformpage.cpp +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "public/fpdf_transformpage.h" - -#include "core/include/fpdfapi/cpdf_array.h" -#include "core/include/fpdfapi/cpdf_document.h" -#include "core/include/fpdfapi/cpdf_number.h" -#include "core/include/fpdfapi/cpdf_reference.h" -#include "fpdfsdk/include/fsdk_define.h" - -namespace { - -void SetBoundingBox(CPDF_Page* page, - const CFX_ByteStringC& key, - float left, - float bottom, - float right, - float top) { - CPDF_Dictionary* pPageDict = page->m_pFormDict; - CPDF_Array* pBoundingBoxArray = new CPDF_Array; - pBoundingBoxArray->Add(new CPDF_Number(left)); - pBoundingBoxArray->Add(new CPDF_Number(bottom)); - pBoundingBoxArray->Add(new CPDF_Number(right)); - pBoundingBoxArray->Add(new CPDF_Number(top)); - pPageDict->SetAt(key, pBoundingBoxArray); -} - -FPDF_BOOL GetBoundingBox(CPDF_Page* page, - const CFX_ByteStringC& key, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Dictionary* pPageDict = page->m_pFormDict; - CPDF_Array* pArray = pPageDict->GetArrayBy(key); - if (!pArray) - return FALSE; - - *left = pArray->GetFloatAt(0); - *bottom = pArray->GetFloatAt(1); - *right = pArray->GetFloatAt(2); - *top = pArray->GetFloatAt(3); - return TRUE; -} - -} // namespace - -DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, - float left, - float bottom, - float right, - float top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - SetBoundingBox(pPage, "MediaBox", left, bottom, right, top); -} - -DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, - float left, - float bottom, - float right, - float top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - SetBoundingBox(pPage, "CropBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - return pPage && GetBoundingBox(pPage, "MediaBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, - float* left, - float* bottom, - float* right, - float* top) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - return pPage && GetBoundingBox(pPage, "CropBox", left, bottom, right, top); -} - -DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, - FS_MATRIX* matrix, - FS_RECTF* clipRect) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return FALSE; - - CFX_ByteTextBuf textBuf; - textBuf << "q "; - CFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, - clipRect->top); - rect.Normalize(); - CFX_ByteString bsClipping; - bsClipping.Format("%f %f %f %f re W* n ", rect.left, rect.bottom, - rect.Width(), rect.Height()); - textBuf << bsClipping; - - CFX_ByteString bsMatix; - bsMatix.Format("%f %f %f %f %f %f cm ", matrix->a, matrix->b, matrix->c, - matrix->d, matrix->e, matrix->f); - textBuf << bsMatix; - - CPDF_Dictionary* pPageDic = pPage->m_pFormDict; - CPDF_Object* pContentObj = - pPageDic ? pPageDic->GetElement("Contents") : nullptr; - if (!pContentObj) - pContentObj = pPageDic ? pPageDic->GetArrayBy("Contents") : nullptr; - if (!pContentObj) - return FALSE; - - CPDF_Dictionary* pDic = new CPDF_Dictionary; - CPDF_Stream* pStream = new CPDF_Stream(nullptr, 0, pDic); - pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE); - CPDF_Document* pDoc = pPage->m_pDocument; - if (!pDoc) - return FALSE; - pDoc->AddIndirectObject(pStream); - - pDic = new CPDF_Dictionary; - CPDF_Stream* pEndStream = new CPDF_Stream(nullptr, 0, pDic); - pEndStream->SetData((const uint8_t*)" Q", 2, FALSE, FALSE); - pDoc->AddIndirectObject(pEndStream); - - CPDF_Array* pContentArray = nullptr; - if (CPDF_Array* pArray = ToArray(pContentObj)) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - pContentArray->AddReference(pDoc, pEndStream); - } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { - CPDF_Object* pDirectObj = pReference->GetDirect(); - if (pDirectObj) { - if (CPDF_Array* pArray = pDirectObj->AsArray()) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - pContentArray->AddReference(pDoc, pEndStream); - } else if (pDirectObj->IsStream()) { - pContentArray = new CPDF_Array(); - pContentArray->AddReference(pDoc, pStream->GetObjNum()); - pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); - pContentArray->AddReference(pDoc, pEndStream); - pPageDic->SetAtReference("Contents", pDoc, - pDoc->AddIndirectObject(pContentArray)); - } - } - } - - // Need to transform the patterns as well. - CPDF_Dictionary* pRes = pPageDic->GetDictBy("Resources"); - if (pRes) { - CPDF_Dictionary* pPattenDict = pRes->GetDictBy("Pattern"); - if (pPattenDict) { - for (const auto& it : *pPattenDict) { - CPDF_Object* pObj = it.second; - if (pObj->IsReference()) - pObj = pObj->GetDirect(); - - CPDF_Dictionary* pDict = nullptr; - if (pObj->IsDictionary()) - pDict = pObj->AsDictionary(); - else if (CPDF_Stream* pStream = pObj->AsStream()) - pDict = pStream->GetDict(); - else - continue; - - CFX_Matrix m = pDict->GetMatrixBy("Matrix"); - CFX_Matrix t = *(CFX_Matrix*)matrix; - m.Concat(t); - pDict->SetAtMatrix("Matrix", m); - } - } - } - - return TRUE; -} - -DLLEXPORT void STDCALL -FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object, - double a, - double b, - double c, - double d, - double e, - double f) { - CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; - if (!pPageObj) - return; - CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, - (FX_FLOAT)e, (FX_FLOAT)f); - - // Special treatment to shading object, because the ClipPath for shading - // object is already transformed. - if (!pPageObj->IsShading()) - pPageObj->TransformClipPath(matrix); - pPageObj->TransformGeneralState(matrix); -} - -DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, - float bottom, - float right, - float top) { - CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath(); - pNewClipPath->GetModify(); - CPDF_Path Path; - Path.GetModify(); - Path.AppendRect(left, bottom, right, top); - pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE); - return pNewClipPath; -} - -DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath) { - delete (CPDF_ClipPath*)clipPath; -} - -void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path) { - const CFX_PathData* pPathData = path; - if (!pPathData) - return; - - FX_PATHPOINT* pPoints = pPathData->GetPoints(); - - if (path.IsRect()) { - buf << (pPoints[0].m_PointX) << " " << (pPoints[0].m_PointY) << " " - << (pPoints[2].m_PointX - pPoints[0].m_PointX) << " " - << (pPoints[2].m_PointY - pPoints[0].m_PointY) << " re\n"; - return; - } - - CFX_ByteString temp; - for (int i = 0; i < pPathData->GetPointCount(); i++) { - buf << (pPoints[i].m_PointX) << " " << (pPoints[i].m_PointY); - int point_type = pPoints[i].m_Flag & FXPT_TYPE; - if (point_type == FXPT_MOVETO) { - buf << " m\n"; - } else if (point_type == FXPT_BEZIERTO) { - buf << " " << (pPoints[i + 1].m_PointX) << " " - << (pPoints[i + 1].m_PointY) << " " << (pPoints[i + 2].m_PointX) - << " " << (pPoints[i + 2].m_PointY); - if (pPoints[i + 2].m_Flag & FXPT_CLOSEFIGURE) - buf << " c h\n"; - else - buf << " c\n"; - i += 2; - } else if (point_type == FXPT_LINETO) { - if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) - buf << " l h\n"; - else - buf << " l\n"; - } - } -} - -DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page, - FPDF_CLIPPATH clipPath) { - CPDF_Page* pPage = CPDFPageFromFPDFPage(page); - if (!pPage) - return; - - CPDF_Dictionary* pPageDic = pPage->m_pFormDict; - CPDF_Object* pContentObj = - pPageDic ? pPageDic->GetElement("Contents") : nullptr; - if (!pContentObj) - pContentObj = pPageDic ? pPageDic->GetArrayBy("Contents") : nullptr; - if (!pContentObj) - return; - - CFX_ByteTextBuf strClip; - CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath; - FX_DWORD i; - for (i = 0; i < pClipPath->GetPathCount(); i++) { - CPDF_Path path = pClipPath->GetPath(i); - int iClipType = pClipPath->GetClipType(i); - if (path.GetPointCount() == 0) { - // Empty clipping (totally clipped out) - strClip << "0 0 m W n "; - } else { - OutputPath(strClip, path); - if (iClipType == FXFILL_WINDING) - strClip << "W n\n"; - else - strClip << "W* n\n"; - } - } - CPDF_Dictionary* pDic = new CPDF_Dictionary; - CPDF_Stream* pStream = new CPDF_Stream(nullptr, 0, pDic); - pStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE); - CPDF_Document* pDoc = pPage->m_pDocument; - if (!pDoc) - return; - pDoc->AddIndirectObject(pStream); - - CPDF_Array* pContentArray = nullptr; - if (CPDF_Array* pArray = ToArray(pContentObj)) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { - CPDF_Object* pDirectObj = pReference->GetDirect(); - if (pDirectObj) { - if (CPDF_Array* pArray = pDirectObj->AsArray()) { - pContentArray = pArray; - CPDF_Reference* pRef = new CPDF_Reference(pDoc, pStream->GetObjNum()); - pContentArray->InsertAt(0, pRef); - } else if (pDirectObj->IsStream()) { - pContentArray = new CPDF_Array(); - pContentArray->AddReference(pDoc, pStream->GetObjNum()); - pContentArray->AddReference(pDoc, pDirectObj->GetObjNum()); - pPageDic->SetAtReference("Contents", pDoc, - pDoc->AddIndirectObject(pContentArray)); - } - } - } -} |