Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Side by Side Diff: fpdfsdk/src/fpdf_transformpage.cpp

Issue 453133004: clang-format all code (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/fsdk_define.h" 7 #include "../include/fsdk_define.h"
8 #include "../include/fpdf_transformpage.h" 8 #include "../include/fpdf_transformpage.h"
9 9
10 DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bo ttom, float right, float top) 10 DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page,
11 { 11 float left,
12 if(!page) 12 float bottom,
13 return; 13 float right,
14 CPDF_Page* pPage = (CPDF_Page*)page; 14 float top) {
15 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 15 if (!page)
16 CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array; 16 return;
17 pMediaBoxArray->Add(FX_NEW CPDF_Number(left)); 17 CPDF_Page* pPage = (CPDF_Page*)page;
18 pMediaBoxArray->Add(FX_NEW CPDF_Number(bottom)); 18 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
19 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right))); 19 CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
20 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top))); 20 pMediaBoxArray->Add(FX_NEW CPDF_Number(left));
21 21 pMediaBoxArray->Add(FX_NEW CPDF_Number(bottom));
22 pPageDict->SetAt("MediaBox", pMediaBoxArray); 22 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
23 } 23 pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
24 24
25 25 pPageDict->SetAt("MediaBox", pMediaBoxArray);
26 DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bot tom, float right, float top) 26 }
27 { 27
28 if(!page) 28 DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page,
29 return; 29 float left,
30 CPDF_Page* pPage = (CPDF_Page*)page; 30 float bottom,
31 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 31 float right,
32 CPDF_Array* pCropBoxArray = FX_NEW CPDF_Array; 32 float top) {
33 pCropBoxArray->Add(FX_NEW CPDF_Number(left)); 33 if (!page)
34 pCropBoxArray->Add(FX_NEW CPDF_Number(bottom)); 34 return;
35 pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right))); 35 CPDF_Page* pPage = (CPDF_Page*)page;
36 pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top))); 36 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
37 37 CPDF_Array* pCropBoxArray = FX_NEW CPDF_Array;
38 38 pCropBoxArray->Add(FX_NEW CPDF_Number(left));
39 pPageDict->SetAt("CropBox", pCropBoxArray); 39 pCropBoxArray->Add(FX_NEW CPDF_Number(bottom));
40 } 40 pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
41 41 pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
42 42
43 DLLEXPORT FX_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, floa t* bottom, float* right, float* top) 43 pPageDict->SetAt("CropBox", pCropBoxArray);
44 { 44 }
45 if(!page) 45
46 return FALSE; 46 DLLEXPORT FX_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page,
47 CPDF_Page* pPage = (CPDF_Page*)page; 47 float* left,
48 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 48 float* bottom,
49 CPDF_Array* pArray = pPageDict->GetArray("MediaBox"); 49 float* right,
50 if(pArray) 50 float* top) {
51 { 51 if (!page)
52 *left = pArray->GetFloat(0); 52 return FALSE;
53 *bottom = pArray->GetFloat(1); 53 CPDF_Page* pPage = (CPDF_Page*)page;
54 *right = pArray->GetFloat(2); 54 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
55 *top = pArray->GetFloat(3); 55 CPDF_Array* pArray = pPageDict->GetArray("MediaBox");
56 return TRUE; 56 if (pArray) {
57 } 57 *left = pArray->GetFloat(0);
58 return FALSE; 58 *bottom = pArray->GetFloat(1);
59 } 59 *right = pArray->GetFloat(2);
60 60 *top = pArray->GetFloat(3);
61 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, flo at* bottom, float* right, float* top) 61 return TRUE;
62 { 62 }
63 if(!page) 63 return FALSE;
64 return FALSE; 64 }
65 CPDF_Page* pPage = (CPDF_Page*)page; 65
66 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 66 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page,
67 CPDF_Array* pArray = pPageDict->GetArray("CropBox"); 67 float* left,
68 if(pArray) 68 float* bottom,
69 { 69 float* right,
70 *left = pArray->GetFloat(0); 70 float* top) {
71 *bottom = pArray->GetFloat(1); 71 if (!page)
72 *right = pArray->GetFloat(2); 72 return FALSE;
73 *top = pArray->GetFloat(3); 73 CPDF_Page* pPage = (CPDF_Page*)page;
74 return TRUE; 74 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
75 } 75 CPDF_Array* pArray = pPageDict->GetArray("CropBox");
76 return FALSE; 76 if (pArray) {
77 } 77 *left = pArray->GetFloat(0);
78 78 *bottom = pArray->GetFloat(1);
79 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX * matrix, FS_RECTF* clipRect) 79 *right = pArray->GetFloat(2);
80 { 80 *top = pArray->GetFloat(3);
81 if(!page) 81 return TRUE;
82 return FALSE; 82 }
83 83 return FALSE;
84 CFX_ByteTextBuf textBuf; 84 }
85 textBuf<<"q "; 85
86 CFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, cl ipRect->top); 86 DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page,
87 rect.Normalize(); 87 FS_MATRIX* matrix,
88 CFX_ByteString bsClipping; 88 FS_RECTF* clipRect) {
89 bsClipping.Format("%f %f %f %f re W* n ", rect.left, rect.bottom, rect.W idth(), rect.Height()); 89 if (!page)
90 textBuf<<bsClipping; 90 return FALSE;
91 91
92 CFX_ByteString bsMatix; 92 CFX_ByteTextBuf textBuf;
93 bsMatix.Format("%f %f %f %f %f %f cm ", matrix->a, matrix->b,matrix->c,m atrix->d,matrix->e,matrix->f); 93 textBuf << "q ";
94 textBuf<<bsMatix; 94 CFX_FloatRect rect(
95 95 clipRect->left, clipRect->bottom, clipRect->right, clipRect->top);
96 96 rect.Normalize();
97 CPDF_Page* pPage = (CPDF_Page*)page; 97 CFX_ByteString bsClipping;
98 CPDF_Dictionary* pPageDic = pPage->m_pFormDict; 98 bsClipping.Format("%f %f %f %f re W* n ",
99 CPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement("Contents") : NULL; 99 rect.left,
100 if(!pContentObj) 100 rect.bottom,
101 pContentObj = pPageDic ? pPageDic->GetArray("Contents") : NULL; 101 rect.Width(),
102 if(!pContentObj) 102 rect.Height());
103 return FALSE; 103 textBuf << bsClipping;
104 104
105 CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary; 105 CFX_ByteString bsMatix;
106 CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic); 106 bsMatix.Format("%f %f %f %f %f %f cm ",
107 pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE); 107 matrix->a,
108 CPDF_Document* pDoc = pPage->m_pDocument; 108 matrix->b,
109 if(!pDoc) 109 matrix->c,
110 return FALSE; 110 matrix->d,
111 pDoc->AddIndirectObject(pStream); 111 matrix->e,
112 112 matrix->f);
113 pDic = FX_NEW CPDF_Dictionary; 113 textBuf << bsMatix;
114 CPDF_Stream* pEndStream = FX_NEW CPDF_Stream(NULL,0, pDic); 114
115 pEndStream->SetData((FX_LPCBYTE)" Q", 2, FALSE, FALSE); 115 CPDF_Page* pPage = (CPDF_Page*)page;
116 pDoc->AddIndirectObject(pEndStream); 116 CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
117 117 CPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement("Contents") : NULL;
118 CPDF_Array* pContentArray = NULL; 118 if (!pContentObj)
119 if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY) 119 pContentObj = pPageDic ? pPageDic->GetArray("Contents") : NULL;
120 { 120 if (!pContentObj)
121 pContentArray = (CPDF_Array*)pContentObj; 121 return FALSE;
122 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetO bjNum()); 122
123 pContentArray->InsertAt(0, pRef); 123 CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;
124 pContentArray->AddReference(pDoc,pEndStream); 124 CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, pDic);
125 125 pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE);
126 } 126 CPDF_Document* pDoc = pPage->m_pDocument;
127 else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) 127 if (!pDoc)
128 { 128 return FALSE;
129 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj; 129 pDoc->AddIndirectObject(pStream);
130 CPDF_Object* pDirectObj = pReference->GetDirect(); 130
131 if(pDirectObj != NULL) 131 pDic = FX_NEW CPDF_Dictionary;
132 { 132 CPDF_Stream* pEndStream = FX_NEW CPDF_Stream(NULL, 0, pDic);
133 if(pDirectObj->GetType() == PDFOBJ_ARRAY) 133 pEndStream->SetData((FX_LPCBYTE) " Q", 2, FALSE, FALSE);
134 { 134 pDoc->AddIndirectObject(pEndStream);
135 pContentArray = (CPDF_Array*)pDirectObj; 135
136 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDo c, pStream->GetObjNum()); 136 CPDF_Array* pContentArray = NULL;
137 pContentArray->InsertAt(0, pRef); 137 if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY) {
138 pContentArray->AddReference(pDoc,pEndStream); 138 pContentArray = (CPDF_Array*)pContentObj;
139 139 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
140 } 140 pContentArray->InsertAt(0, pRef);
141 else if(pDirectObj->GetType() == PDFOBJ_STREAM) 141 pContentArray->AddReference(pDoc, pEndStream);
142 { 142
143 pContentArray = FX_NEW CPDF_Array(); 143 } else if (pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) {
144 pContentArray->AddReference(pDoc,pStream->GetObj Num()); 144 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
145 pContentArray->AddReference(pDoc,pDirectObj->Get ObjNum()); 145 CPDF_Object* pDirectObj = pReference->GetDirect();
146 pContentArray->AddReference(pDoc, pEndStream); 146 if (pDirectObj != NULL) {
147 pPageDic->SetAtReference("Contents", pDoc, pDoc- >AddIndirectObject(pContentArray)); 147 if (pDirectObj->GetType() == PDFOBJ_ARRAY) {
148 } 148 pContentArray = (CPDF_Array*)pDirectObj;
149 } 149 CPDF_Reference* pRef =
150 } 150 FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
151 151 pContentArray->InsertAt(0, pRef);
152 //Need to transform the patterns as well. 152 pContentArray->AddReference(pDoc, pEndStream);
153 CPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC("Resources")); 153
154 if(pRes) 154 } else if (pDirectObj->GetType() == PDFOBJ_STREAM) {
155 { 155 pContentArray = FX_NEW CPDF_Array();
156 CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern") ); 156 pContentArray->AddReference(pDoc, pStream->GetObjNum());
157 if(pPattenDict) 157 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum());
158 { 158 pContentArray->AddReference(pDoc, pEndStream);
159 FX_POSITION pos = pPattenDict->GetStartPos(); 159 pPageDic->SetAtReference(
160 while(pos) 160 "Contents", pDoc, pDoc->AddIndirectObject(pContentArray));
161 { 161 }
162 CPDF_Dictionary* pDict = NULL; 162 }
163 CFX_ByteString key; 163 }
164 CPDF_Object* pObj = pPattenDict->GetNextElement( pos, key); 164
165 if(pObj->GetType() == PDFOBJ_REFERENCE) 165 // Need to transform the patterns as well.
166 pObj = pObj->GetDirect(); 166 CPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC("Resources"));
167 if(pObj->GetType() == PDFOBJ_DICTIONARY) 167 if (pRes) {
168 { 168 CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern"));
169 pDict = (CPDF_Dictionary*)pObj; 169 if (pPattenDict) {
170 } 170 FX_POSITION pos = pPattenDict->GetStartPos();
171 else if(pObj->GetType() == PDFOBJ_STREAM) 171 while (pos) {
172 { 172 CPDF_Dictionary* pDict = NULL;
173 pDict = ((CPDF_Stream*)pObj)->GetDict(); 173 CFX_ByteString key;
174 } 174 CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key);
175 else 175 if (pObj->GetType() == PDFOBJ_REFERENCE)
176 continue; 176 pObj = pObj->GetDirect();
177 177 if (pObj->GetType() == PDFOBJ_DICTIONARY) {
178 CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC(" Matrix")); 178 pDict = (CPDF_Dictionary*)pObj;
179 CFX_AffineMatrix t = *(CFX_AffineMatrix*)matrix; 179 } else if (pObj->GetType() == PDFOBJ_STREAM) {
180 m.Concat(t); 180 pDict = ((CPDF_Stream*)pObj)->GetDict();
181 pDict->SetAtMatrix(FX_BSTRC("Matrix"), m); 181 } else
182 } 182 continue;
183 } 183
184 } 184 CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC("Matrix"));
185 185 CFX_AffineMatrix t = *(CFX_AffineMatrix*)matrix;
186 return TRUE; 186 m.Concat(t);
187 } 187 pDict->SetAtMatrix(FX_BSTRC("Matrix"), m);
188 188 }
189 DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object ,double a, double b, double c, double d, double e, double f) 189 }
190 { 190 }
191 CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; 191
192 if(pPageObj == NULL) 192 return TRUE;
193 return; 193 }
194 CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d, (FX_FLOAT)e,(FX_FLOAT)f); 194
195 195 DLLEXPORT void STDCALL
196 //Special treatment to shading object, because the ClipPath for shading object is already transformed. 196 FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,
197 if(pPageObj->m_Type != PDFPAGE_SHADING) 197 double a,
198 pPageObj->TransformClipPath(matrix); 198 double b,
199 pPageObj->TransformGeneralState(matrix); 199 double c,
200 } 200 double d,
201 201 double e,
202 202 double f) {
203 DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, fl oat right, float top) 203 CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
204 { 204 if (pPageObj == NULL)
205 CPDF_ClipPath* pNewClipPath = FX_NEW CPDF_ClipPath(); 205 return;
206 pNewClipPath->GetModify(); 206 CFX_AffineMatrix matrix((FX_FLOAT)a,
207 CPDF_Path Path; 207 (FX_FLOAT)b,
208 Path.GetModify(); 208 (FX_FLOAT)c,
209 Path.AppendRect(left, bottom, right, top); 209 (FX_FLOAT)d,
210 pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE); 210 (FX_FLOAT)e,
211 return pNewClipPath; 211 (FX_FLOAT)f);
212 } 212
213 213 // Special treatment to shading object, because the ClipPath for shading
214 DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath) 214 // object is already transformed.
215 { 215 if (pPageObj->m_Type != PDFPAGE_SHADING)
216 if(clipPath) 216 pPageObj->TransformClipPath(matrix);
217 delete (CPDF_ClipPath*)clipPath; 217 pPageObj->TransformGeneralState(matrix);
218 } 218 }
219 219
220 void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path) 220 DLLEXPORT FPDF_CLIPPATH STDCALL
221 { 221 FPDF_CreateClipPath(float left, float bottom, float right, float top) {
222 const CFX_PathData* pPathData = path; 222 CPDF_ClipPath* pNewClipPath = FX_NEW CPDF_ClipPath();
223 if (pPathData == NULL) return; 223 pNewClipPath->GetModify();
224 224 CPDF_Path Path;
225 FX_PATHPOINT* pPoints = pPathData->GetPoints(); 225 Path.GetModify();
226 226 Path.AppendRect(left, bottom, right, top);
227 if (path.IsRect()) { 227 pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);
228 buf << (pPoints[0].m_PointX) << " " << (pPoints[0].m_PointY) << " " 228 return pNewClipPath;
229 << (pPoints[2].m_PointX - pPoints[0].m_PointX) << " " 229 }
230 << (pPoints[2].m_PointY - pPoints[0].m_PointY) << " re\n "; 230
231 return; 231 DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath) {
232 } 232 if (clipPath)
233 233 delete (CPDF_ClipPath*)clipPath;
234 CFX_ByteString temp; 234 }
235 for (int i = 0; i < pPathData->GetPointCount(); i ++) { 235
236 buf << (pPoints[i].m_PointX) << " " << (pPoints[i].m_PointY); 236 void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path) {
237 int point_type = pPoints[i].m_Flag & FXPT_TYPE; 237 const CFX_PathData* pPathData = path;
238 if (point_type == FXPT_MOVETO) 238 if (pPathData == NULL)
239 buf << " m\n"; 239 return;
240 else if (point_type == FXPT_BEZIERTO) { 240
241 buf << " " << (pPoints[i+1].m_PointX) << " " << (pPoints [i+1].m_PointY) << " " << 241 FX_PATHPOINT* pPoints = pPathData->GetPoints();
242 (pPoints[i+2].m_PointX) << " " << (pPoints[i+2]. m_PointY); 242
243 if (pPoints[i+2].m_Flag & FXPT_CLOSEFIGURE) 243 if (path.IsRect()) {
244 buf << " c h\n"; 244 buf << (pPoints[0].m_PointX) << " " << (pPoints[0].m_PointY) << " "
245 else 245 << (pPoints[2].m_PointX - pPoints[0].m_PointX) << " "
246 buf << " c\n"; 246 << (pPoints[2].m_PointY - pPoints[0].m_PointY) << " re\n";
247 i += 2; 247 return;
248 } else if (point_type == FXPT_LINETO) { 248 }
249 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) 249
250 buf << " l h\n"; 250 CFX_ByteString temp;
251 else 251 for (int i = 0; i < pPathData->GetPointCount(); i++) {
252 buf << " l\n"; 252 buf << (pPoints[i].m_PointX) << " " << (pPoints[i].m_PointY);
253 } 253 int point_type = pPoints[i].m_Flag & FXPT_TYPE;
254 } 254 if (point_type == FXPT_MOVETO)
255 } 255 buf << " m\n";
256 256 else if (point_type == FXPT_BEZIERTO) {
257 DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clip Path) 257 buf << " " << (pPoints[i + 1].m_PointX) << " "
258 { 258 << (pPoints[i + 1].m_PointY) << " " << (pPoints[i + 2].m_PointX)
259 if(!page) 259 << " " << (pPoints[i + 2].m_PointY);
260 return; 260 if (pPoints[i + 2].m_Flag & FXPT_CLOSEFIGURE)
261 CPDF_Page* pPage = (CPDF_Page*)page; 261 buf << " c h\n";
262 CPDF_Dictionary* pPageDic = pPage->m_pFormDict; 262 else
263 CPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement("Contents") : NULL; 263 buf << " c\n";
264 if(!pContentObj) 264 i += 2;
265 pContentObj = pPageDic ? pPageDic->GetArray("Contents") : NULL; 265 } else if (point_type == FXPT_LINETO) {
266 if(!pContentObj) 266 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE)
267 return; 267 buf << " l h\n";
268 268 else
269 CFX_ByteTextBuf strClip; 269 buf << " l\n";
270 CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath; 270 }
271 FX_DWORD i; 271 }
272 for (i = 0; i < pClipPath->GetPathCount(); i ++) { 272 }
273 CPDF_Path path = pClipPath->GetPath(i); 273
274 int iClipType = pClipPath->GetClipType(i); 274 DLLEXPORT void STDCALL
275 if (path.GetPointCount() == 0) { 275 FPDFPage_InsertClipPath(FPDF_PAGE page, FPDF_CLIPPATH clipPath) {
276 // Empty clipping (totally clipped out) 276 if (!page)
277 strClip << "0 0 m W n "; 277 return;
278 } else { 278 CPDF_Page* pPage = (CPDF_Page*)page;
279 OutputPath(strClip, path); 279 CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
280 if (iClipType == FXFILL_WINDING) 280 CPDF_Object* pContentObj = pPageDic ? pPageDic->GetElement("Contents") : NULL;
281 strClip << "W n\n"; 281 if (!pContentObj)
282 else 282 pContentObj = pPageDic ? pPageDic->GetArray("Contents") : NULL;
283 strClip << "W* n\n"; 283 if (!pContentObj)
284 } 284 return;
285 } 285
286 CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary; 286 CFX_ByteTextBuf strClip;
287 CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic); 287 CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath;
288 pStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE); 288 FX_DWORD i;
289 CPDF_Document* pDoc = pPage->m_pDocument; 289 for (i = 0; i < pClipPath->GetPathCount(); i++) {
290 if(!pDoc) 290 CPDF_Path path = pClipPath->GetPath(i);
291 return; 291 int iClipType = pClipPath->GetClipType(i);
292 pDoc->AddIndirectObject(pStream); 292 if (path.GetPointCount() == 0) {
293 293 // Empty clipping (totally clipped out)
294 CPDF_Array* pContentArray = NULL; 294 strClip << "0 0 m W n ";
295 if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY) 295 } else {
296 { 296 OutputPath(strClip, path);
297 pContentArray = (CPDF_Array*)pContentObj; 297 if (iClipType == FXFILL_WINDING)
298 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetO bjNum()); 298 strClip << "W n\n";
299 pContentArray->InsertAt(0, pRef); 299 else
300 300 strClip << "W* n\n";
301 } 301 }
302 else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) 302 }
303 { 303 CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;
304 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj; 304 CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, pDic);
305 CPDF_Object* pDirectObj = pReference->GetDirect(); 305 pStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE);
306 if(pDirectObj != NULL) 306 CPDF_Document* pDoc = pPage->m_pDocument;
307 { 307 if (!pDoc)
308 if(pDirectObj->GetType() == PDFOBJ_ARRAY) 308 return;
309 { 309 pDoc->AddIndirectObject(pStream);
310 pContentArray = (CPDF_Array*)pDirectObj; 310
311 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDo c, pStream->GetObjNum()); 311 CPDF_Array* pContentArray = NULL;
312 pContentArray->InsertAt(0, pRef); 312 if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY) {
313 313 pContentArray = (CPDF_Array*)pContentObj;
314 } 314 CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
315 else if(pDirectObj->GetType() == PDFOBJ_STREAM) 315 pContentArray->InsertAt(0, pRef);
316 { 316
317 pContentArray = FX_NEW CPDF_Array(); 317 } else if (pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE) {
318 pContentArray->AddReference(pDoc,pStream->GetObj Num()); 318 CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
319 pContentArray->AddReference(pDoc,pDirectObj->Get ObjNum()); 319 CPDF_Object* pDirectObj = pReference->GetDirect();
320 pPageDic->SetAtReference("Contents", pDoc, pDoc- >AddIndirectObject(pContentArray)); 320 if (pDirectObj != NULL) {
321 } 321 if (pDirectObj->GetType() == PDFOBJ_ARRAY) {
322 } 322 pContentArray = (CPDF_Array*)pDirectObj;
323 } 323 CPDF_Reference* pRef =
324 } 324 FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
325 325 pContentArray->InsertAt(0, pRef);
326
327 } else if (pDirectObj->GetType() == PDFOBJ_STREAM) {
328 pContentArray = FX_NEW CPDF_Array();
329 pContentArray->AddReference(pDoc, pStream->GetObjNum());
330 pContentArray->AddReference(pDoc, pDirectObj->GetObjNum());
331 pPageDic->SetAtReference(
332 "Contents", pDoc, pDoc->AddIndirectObject(pContentArray));
333 }
334 }
335 }
336 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698