| Index: fpdfsdk/src/fpdf_transformpage.cpp
|
| diff --git a/fpdfsdk/src/fpdf_transformpage.cpp b/fpdfsdk/src/fpdf_transformpage.cpp
|
| deleted file mode 100644
|
| index f3c2576dd5a024ce63aa5b3e5a352145f652dfcb..0000000000000000000000000000000000000000
|
| --- 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));
|
| - }
|
| - }
|
| - }
|
| -}
|
|
|