| OLD | NEW |
| 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 "../../public/fpdf_flatten.h" | 7 #include "../../public/fpdf_flatten.h" |
| 8 #include "../include/fsdk_define.h" | 8 #include "../include/fsdk_define.h" |
| 9 | 9 |
| 10 typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray; | 10 typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray; |
| 11 typedef CFX_ArrayTemplate<CPDF_Rect> CPDF_RectArray; | 11 typedef CFX_ArrayTemplate<CPDF_Rect> CPDF_RectArray; |
| 12 | 12 |
| 13 enum FPDF_TYPE { MAX, MIN }; | 13 enum FPDF_TYPE { MAX, MIN }; |
| 14 enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; | 14 enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; |
| 15 | 15 |
| 16 FX_BOOL IsValiableRect(CPDF_Rect rect, CPDF_Rect rcPage) | 16 bool IsValiableRect(CPDF_Rect rect, CPDF_Rect rcPage) |
| 17 { | 17 { |
| 18 if ( rect.left - rect.right > 0.000001f || | 18 if ( rect.left - rect.right > 0.000001f || |
| 19 rect.bottom - rect.top > 0.000001f) | 19 rect.bottom - rect.top > 0.000001f) |
| 20 » » return FALSE; | 20 » » return false; |
| 21 | 21 |
| 22 if (rect.left == 0.0f && | 22 if (rect.left == 0.0f && |
| 23 rect.top == 0.0f && | 23 rect.top == 0.0f && |
| 24 rect.right == 0.0f && | 24 rect.right == 0.0f && |
| 25 rect.bottom == 0.0f) | 25 rect.bottom == 0.0f) |
| 26 » » return FALSE; | 26 » » return false; |
| 27 | 27 |
| 28 if (!rcPage.IsEmpty()) | 28 if (!rcPage.IsEmpty()) |
| 29 { | 29 { |
| 30 if (rect.left - rcPage.left < -10.000001f || | 30 if (rect.left - rcPage.left < -10.000001f || |
| 31 rect.right - rcPage.right > 10.000001f || | 31 rect.right - rcPage.right > 10.000001f || |
| 32 rect.top - rcPage.top > 10.000001f || | 32 rect.top - rcPage.top > 10.000001f || |
| 33 rect.bottom - rcPage.bottom < -10.000001f) | 33 rect.bottom - rcPage.bottom < -10.000001f) |
| 34 » » » return FALSE; | 34 » » » return false; |
| 35 } | 35 } |
| 36 | 36 |
| 37 » return TRUE; | 37 » return true; |
| 38 } | 38 } |
| 39 | 39 |
| 40 | 40 |
| 41 FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_Rect
Array * pRectArray ) | 41 bool GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_RectArr
ay * pRectArray ) |
| 42 { | 42 { |
| 43 CPDF_Page* pPDFPage = new CPDF_Page; | 43 CPDF_Page* pPDFPage = new CPDF_Page; |
| 44 » pPDFPage->Load( pDoc, pDict, FALSE ); | 44 » pPDFPage->Load( pDoc, pDict, false ); |
| 45 pPDFPage->ParseContent(); | 45 pPDFPage->ParseContent(); |
| 46 | 46 |
| 47 FX_POSITION pos = pPDFPage->GetFirstObjectPosition(); | 47 FX_POSITION pos = pPDFPage->GetFirstObjectPosition(); |
| 48 | 48 |
| 49 while (pos) | 49 while (pos) |
| 50 { | 50 { |
| 51 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); | 51 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); |
| 52 if (!pPageObject)continue; | 52 if (!pPageObject)continue; |
| 53 | 53 |
| 54 CPDF_Rect rc; | 54 CPDF_Rect rc; |
| 55 rc.left = pPageObject->m_Left; | 55 rc.left = pPageObject->m_Left; |
| 56 rc.right = pPageObject->m_Right; | 56 rc.right = pPageObject->m_Right; |
| 57 rc.bottom = pPageObject->m_Bottom; | 57 rc.bottom = pPageObject->m_Bottom; |
| 58 rc.top = pPageObject->m_Top; | 58 rc.top = pPageObject->m_Top; |
| 59 | 59 |
| 60 if (IsValiableRect(rc, pDict->GetRect("MediaBox"))) | 60 if (IsValiableRect(rc, pDict->GetRect("MediaBox"))) |
| 61 { | 61 { |
| 62 pRectArray->Add(rc); | 62 pRectArray->Add(rc); |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 | 65 |
| 66 delete pPDFPage; | 66 delete pPDFPage; |
| 67 » return TRUE; | 67 » return true; |
| 68 } | 68 } |
| 69 | 69 |
| 70 | 70 |
| 71 void ParserStream( CPDF_Dictionary * pPageDic, CPDF_Dictionary* pStream, CPDF_Re
ctArray * pRectArray, CPDF_ObjectArray * pObjectArray ) | 71 void ParserStream( CPDF_Dictionary * pPageDic, CPDF_Dictionary* pStream, CPDF_Re
ctArray * pRectArray, CPDF_ObjectArray * pObjectArray ) |
| 72 { | 72 { |
| 73 if (!pStream)return; | 73 if (!pStream)return; |
| 74 CPDF_Rect rect; | 74 CPDF_Rect rect; |
| 75 if (pStream->KeyExist("Rect")) | 75 if (pStream->KeyExist("Rect")) |
| 76 rect = pStream->GetRect("Rect"); | 76 rect = pStream->GetRect("Rect"); |
| 77 else if (pStream->KeyExist("BBox")) | 77 else if (pStream->KeyExist("BBox")) |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 if (!pContentsObj) | 210 if (!pContentsObj) |
| 211 { | 211 { |
| 212 //Create a new contents dictionary | 212 //Create a new contents dictionary |
| 213 if (!key.IsEmpty()) | 213 if (!key.IsEmpty()) |
| 214 { | 214 { |
| 215 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new
CPDF_Dictionary); | 215 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new
CPDF_Dictionary); |
| 216 pPage->SetAtReference("Contents", pDocument, pDocument->
AddIndirectObject(pNewContents)); | 216 pPage->SetAtReference("Contents", pDocument, pDocument->
AddIndirectObject(pNewContents)); |
| 217 | 217 |
| 218 CFX_ByteString sStream; | 218 CFX_ByteString sStream; |
| 219 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str())
; | 219 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str())
; |
| 220 » » » pNewContents->SetData((const uint8_t*)sStream, sStream.G
etLength(), FALSE, FALSE); | 220 » » » pNewContents->SetData((const uint8_t*)sStream, sStream.G
etLength(), false, false); |
| 221 } | 221 } |
| 222 return; | 222 return; |
| 223 } | 223 } |
| 224 | 224 |
| 225 int iType = pContentsObj->GetType(); | 225 int iType = pContentsObj->GetType(); |
| 226 CPDF_Array* pContentsArray = NULL; | 226 CPDF_Array* pContentsArray = NULL; |
| 227 | 227 |
| 228 switch(iType) | 228 switch(iType) |
| 229 { | 229 { |
| 230 case PDFOBJ_STREAM: | 230 case PDFOBJ_STREAM: |
| 231 { | 231 { |
| 232 pContentsArray = new CPDF_Array; | 232 pContentsArray = new CPDF_Array; |
| 233 CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj; | 233 CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj; |
| 234 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pConten
ts); | 234 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pConten
ts); |
| 235 CPDF_StreamAcc acc; | 235 CPDF_StreamAcc acc; |
| 236 acc.LoadAllData(pContents); | 236 acc.LoadAllData(pContents); |
| 237 CFX_ByteString sStream = "q\n"; | 237 CFX_ByteString sStream = "q\n"; |
| 238 CFX_ByteString sBody = CFX_ByteString((const FX_CHAR*)ac
c.GetData(), acc.GetSize()); | 238 CFX_ByteString sBody = CFX_ByteString((const FX_CHAR*)ac
c.GetData(), acc.GetSize()); |
| 239 sStream = sStream + sBody + "\nQ"; | 239 sStream = sStream + sBody + "\nQ"; |
| 240 » » » pContents->SetData((const uint8_t*)sStream, sStream.GetL
ength(), FALSE, FALSE); | 240 » » » pContents->SetData((const uint8_t*)sStream, sStream.GetL
ength(), false, false); |
| 241 pContentsArray->AddReference(pDocument, dwObjNum); | 241 pContentsArray->AddReference(pDocument, dwObjNum); |
| 242 break; | 242 break; |
| 243 } | 243 } |
| 244 | 244 |
| 245 case PDFOBJ_ARRAY: | 245 case PDFOBJ_ARRAY: |
| 246 { | 246 { |
| 247 pContentsArray = (CPDF_Array*)pContentsObj; | 247 pContentsArray = (CPDF_Array*)pContentsObj; |
| 248 break; | 248 break; |
| 249 } | 249 } |
| 250 default: | 250 default: |
| 251 break; | 251 break; |
| 252 } | 252 } |
| 253 | 253 |
| 254 if (!pContentsArray)return; | 254 if (!pContentsArray)return; |
| 255 | 255 |
| 256 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray); | 256 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray); |
| 257 pPage->SetAtReference("Contents", pDocument, dwObjNum); | 257 pPage->SetAtReference("Contents", pDocument, dwObjNum); |
| 258 | 258 |
| 259 if (!key.IsEmpty()) | 259 if (!key.IsEmpty()) |
| 260 { | 260 { |
| 261 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Di
ctionary); | 261 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Di
ctionary); |
| 262 dwObjNum = pDocument->AddIndirectObject(pNewContents); | 262 dwObjNum = pDocument->AddIndirectObject(pNewContents); |
| 263 pContentsArray->AddReference(pDocument, dwObjNum); | 263 pContentsArray->AddReference(pDocument, dwObjNum); |
| 264 | 264 |
| 265 CFX_ByteString sStream; | 265 CFX_ByteString sStream; |
| 266 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); | 266 sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); |
| 267 » » pNewContents->SetData((const uint8_t*)sStream, sStream.GetLength
(), FALSE, FALSE); | 267 » » pNewContents->SetData((const uint8_t*)sStream, sStream.GetLength
(), false, false); |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatr
ix matrix) | 271 CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatr
ix matrix) |
| 272 { | 272 { |
| 273 if(rcStream.IsEmpty()) | 273 if(rcStream.IsEmpty()) |
| 274 return CFX_AffineMatrix(); | 274 return CFX_AffineMatrix(); |
| 275 | 275 |
| 276 matrix.TransformRect(rcStream); | 276 matrix.TransformRect(rcStream); |
| 277 rcStream.Normalize(); | 277 rcStream.Normalize(); |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 matrix.c = 0.0f; | 531 matrix.c = 0.0f; |
| 532 matrix.d = 1.0f; | 532 matrix.d = 1.0f; |
| 533 matrix.e = 0.0f; | 533 matrix.e = 0.0f; |
| 534 matrix.f = 0.0f; | 534 matrix.f = 0.0f; |
| 535 } | 535 } |
| 536 | 536 |
| 537 CFX_AffineMatrix m = GetMatrix(rcAnnot, rcStream, matrix); | 537 CFX_AffineMatrix m = GetMatrix(rcAnnot, rcStream, matrix); |
| 538 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m
.f, sFormName.c_str()); | 538 sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m
.f, sFormName.c_str()); |
| 539 sStream += sTemp; | 539 sStream += sTemp; |
| 540 | 540 |
| 541 » » pNewXObject->SetData((const uint8_t*)sStream, sStream.GetLength(
), FALSE, FALSE); | 541 » » pNewXObject->SetData((const uint8_t*)sStream, sStream.GetLength(
), false, false); |
| 542 } | 542 } |
| 543 pPageDict->RemoveAt( "Annots" ); | 543 pPageDict->RemoveAt( "Annots" ); |
| 544 | 544 |
| 545 ObjectArray.RemoveAll(); | 545 ObjectArray.RemoveAll(); |
| 546 RectArray.RemoveAll(); | 546 RectArray.RemoveAll(); |
| 547 | 547 |
| 548 return FLATTEN_SUCCESS; | 548 return FLATTEN_SUCCESS; |
| 549 } | 549 } |
| OLD | NEW |