1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// #include "x:/pdf/fpdfapi5/include/fpdfapi.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fsdk_define.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdfedit.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FX_OS_ == _FX_ANDROID_
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "time.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <ctime>
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = FX_NEW CPDF_Document;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pDoc)
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pDoc->CreateNewDoc();
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	time_t currentTime;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteString DateStr;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if ( -1 != time( &currentTime ) )
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			tm * pTM = localtime( &currentTime );
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if ( pTM )
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				DateStr.Format(	"D:%04d%02d%02d%02d%02d%02d", pTM->tm_year+1900, pTM->tm_mon+1,
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					pTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec );
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pInfoDict = NULL;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pInfoDict = pDoc->GetInfo();
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pInfoDict)
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FOXIT_CHROME_BUILD
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Google"));
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Foxit PDF SDK DLL 2.0 - Foxit Software"));
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pDoc;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (pDoc == NULL)
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (page_index < 0 || page_index >= pDoc->GetPageCount())
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pDoc->DeletePage(page_index);
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height)
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!document)
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	CPDF_Parser* pParser = (CPDF_Parser*)document;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)document;
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(page_index < 0)
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		page_index = 0;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pDoc->GetPageCount()<page_index)
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		page_index = pDoc->GetPageCount();
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	if (page_index < 0 || page_index >= pDoc->GetPageCount())
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//		return NULL;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pPageDict)
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPageDict->SetAt("MediaBox", pMediaBoxArray);
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPageDict->SetAt("Rotate", FX_NEW CPDF_Number(0));
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPageDict->SetAt("Resources", FX_NEW CPDF_Dictionary);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = FX_NEW CPDF_Page;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->Load(pDoc,pPageDict);
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->ParseContent();
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPage;
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		|| pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pDict = pPage->m_pFormDict;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int rotate = 0;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pDict != NULL)
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pDict->KeyExist("Rotate"))
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			rotate = pDict->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if(pDict->KeyExist("Parent"))
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				while(pPages)
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					if(pPages->KeyExist("Rotate"))
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					{
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						rotate = pPages->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						break;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					}
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					else if(pPages->KeyExist("Parent"))
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						pPages = (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					else break;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return rotate;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		|| pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pPageObj == NULL)
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_POSITION LastPersition = pPage->GetLastObjectPosition();
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPage->InsertObject(LastPersition, pPageObj);
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch(pPageObj->m_Type)
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_PAGEOBJ_PATH:
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pPathObj->CalcBoundingBox();
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_PAGEOBJ_TEXT:
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			//	CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			//	pPathObj->CalcBoundingBox();
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_PAGEOBJ_IMAGE:
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pImageObj->CalcBoundingBox();
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_PAGEOBJ_SHADING:
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pShadingObj->CalcBoundingBox();
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FPDF_PAGEOBJ_FORM:
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			pFormObj->CalcBoundingBox();
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	default:
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//	pPage->ParseContent();
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//pPage->GenerateContent();
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		|| pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return -1;
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPage->CountObjects();
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	return 0;
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		|| pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPage->GetObjectByIndex(index);
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//	return NULL;
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!page) return FALSE;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pPage->BackgroundAlphaNeeded();
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject)
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(!pageObject) return FALSE;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (blend_type != FXDIB_BLEND_NORMAL) return TRUE;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pSMaskDict) return TRUE;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return TRUE;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pPageObj->m_Type == PDFPAGE_PATH)
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return TRUE;
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pPageObj->m_Type == PDFPAGE_FORM)
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pFormObj->m_pForm && (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED))
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return TRUE;
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if(pFormObj->m_pForm && (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP)))
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			return TRUE;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page)
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		|| pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return FALSE;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_PageContentGenerate CG(pPage);
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CG.GenerateContent();
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			 double a, double b, double c, double d, double e, double f)
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(pPageObj == NULL)
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pPageObj->Transform(matrix);
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov											   double a, double b, double c, double d, double e, double f)
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if(page == NULL)
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return;
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Page* pPage = (CPDF_Page*)page;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_AnnotList AnnotList(pPage);
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	for (int i=0; i<AnnotList.Count();i++)
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Annot* pAnnot = AnnotList.GetAt(i);
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		// transformAnnots Rectangle
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rect;
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pAnnot->GetRect(rect);
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		rect.Transform(&matrix);
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Array *pRectArray = NULL;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pRectArray = pAnnot->m_pAnnotDict->GetArray("Rect");
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (!pRectArray) pRectArray=CPDF_Array::Create();
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pRectArray->SetAt(0,FX_NEW CPDF_Number(rect.left));
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pRectArray->SetAt(1,FX_NEW CPDF_Number(rect.bottom));
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pRectArray->SetAt(2,FX_NEW CPDF_Number(rect.right));
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pRectArray->SetAt(3,FX_NEW CPDF_Number(rect.top));
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		pAnnot->m_pAnnotDict->SetAt("Rect",pRectArray);
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		//Transform AP's rectangle
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		//To Do
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
317