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 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); | 47 CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos); |
48 if (!pPageObject) | 48 if (!pPageObject) |
49 continue; | 49 continue; |
50 | 50 |
51 CPDF_Rect rc; | 51 CPDF_Rect rc; |
52 rc.left = pPageObject->m_Left; | 52 rc.left = pPageObject->m_Left; |
53 rc.right = pPageObject->m_Right; | 53 rc.right = pPageObject->m_Right; |
54 rc.bottom = pPageObject->m_Bottom; | 54 rc.bottom = pPageObject->m_Bottom; |
55 rc.top = pPageObject->m_Top; | 55 rc.top = pPageObject->m_Top; |
56 | 56 |
57 if (IsValiableRect(rc, pDict->GetRect("MediaBox"))) { | 57 if (IsValiableRect(rc, pDict->GetRectBy("MediaBox"))) { |
58 pRectArray->Add(rc); | 58 pRectArray->Add(rc); |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 delete pPDFPage; | 62 delete pPDFPage; |
63 return TRUE; | 63 return TRUE; |
64 } | 64 } |
65 | 65 |
66 void ParserStream(CPDF_Dictionary* pPageDic, | 66 void ParserStream(CPDF_Dictionary* pPageDic, |
67 CPDF_Dictionary* pStream, | 67 CPDF_Dictionary* pStream, |
68 CPDF_RectArray* pRectArray, | 68 CPDF_RectArray* pRectArray, |
69 CPDF_ObjectArray* pObjectArray) { | 69 CPDF_ObjectArray* pObjectArray) { |
70 if (!pStream) | 70 if (!pStream) |
71 return; | 71 return; |
72 CPDF_Rect rect; | 72 CPDF_Rect rect; |
73 if (pStream->KeyExist("Rect")) | 73 if (pStream->KeyExist("Rect")) |
74 rect = pStream->GetRect("Rect"); | 74 rect = pStream->GetRectBy("Rect"); |
75 else if (pStream->KeyExist("BBox")) | 75 else if (pStream->KeyExist("BBox")) |
76 rect = pStream->GetRect("BBox"); | 76 rect = pStream->GetRectBy("BBox"); |
77 | 77 |
78 if (IsValiableRect(rect, pPageDic->GetRect("MediaBox"))) | 78 if (IsValiableRect(rect, pPageDic->GetRectBy("MediaBox"))) |
79 pRectArray->Add(rect); | 79 pRectArray->Add(rect); |
80 | 80 |
81 pObjectArray->Add(pStream); | 81 pObjectArray->Add(pStream); |
82 } | 82 } |
83 | 83 |
84 int ParserAnnots(CPDF_Document* pSourceDoc, | 84 int ParserAnnots(CPDF_Document* pSourceDoc, |
85 CPDF_Dictionary* pPageDic, | 85 CPDF_Dictionary* pPageDic, |
86 CPDF_RectArray* pRectArray, | 86 CPDF_RectArray* pRectArray, |
87 CPDF_ObjectArray* pObjectArray, | 87 CPDF_ObjectArray* pObjectArray, |
88 int nUsage) { | 88 int nUsage) { |
89 if (!pSourceDoc || !pPageDic) | 89 if (!pSourceDoc || !pPageDic) |
90 return FLATTEN_FAIL; | 90 return FLATTEN_FAIL; |
91 | 91 |
92 GetContentsRect(pSourceDoc, pPageDic, pRectArray); | 92 GetContentsRect(pSourceDoc, pPageDic, pRectArray); |
93 CPDF_Array* pAnnots = pPageDic->GetArray("Annots"); | 93 CPDF_Array* pAnnots = pPageDic->GetArrayBy("Annots"); |
94 if (!pAnnots) | 94 if (!pAnnots) |
95 return FLATTEN_NOTHINGTODO; | 95 return FLATTEN_NOTHINGTODO; |
96 | 96 |
97 FX_DWORD dwSize = pAnnots->GetCount(); | 97 FX_DWORD dwSize = pAnnots->GetCount(); |
98 for (int i = 0; i < (int)dwSize; i++) { | 98 for (int i = 0; i < (int)dwSize; i++) { |
99 CPDF_Dictionary* pAnnotDic = ToDictionary(pAnnots->GetElementValue(i)); | 99 CPDF_Dictionary* pAnnotDic = ToDictionary(pAnnots->GetElementValue(i)); |
100 if (!pAnnotDic) | 100 if (!pAnnotDic) |
101 continue; | 101 continue; |
102 | 102 |
103 CFX_ByteString sSubtype = pAnnotDic->GetString("Subtype"); | 103 CFX_ByteString sSubtype = pAnnotDic->GetStringBy("Subtype"); |
104 if (sSubtype == "Popup") | 104 if (sSubtype == "Popup") |
105 continue; | 105 continue; |
106 | 106 |
107 int nAnnotFlag = pAnnotDic->GetInteger("F"); | 107 int nAnnotFlag = pAnnotDic->GetIntegerBy("F"); |
108 if (nAnnotFlag & ANNOTFLAG_HIDDEN) | 108 if (nAnnotFlag & ANNOTFLAG_HIDDEN) |
109 continue; | 109 continue; |
110 | 110 |
111 if (nUsage == FLAT_NORMALDISPLAY) { | 111 if (nUsage == FLAT_NORMALDISPLAY) { |
112 if (nAnnotFlag & ANNOTFLAG_INVISIBLE) | 112 if (nAnnotFlag & ANNOTFLAG_INVISIBLE) |
113 continue; | 113 continue; |
114 | 114 |
115 ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); | 115 ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); |
116 } else { | 116 } else { |
117 if (nAnnotFlag & ANNOTFLAG_PRINT) | 117 if (nAnnotFlag & ANNOTFLAG_PRINT) |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); | 180 rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); |
181 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); | 181 rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); |
182 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); | 182 rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); |
183 | 183 |
184 return rcRet; | 184 return rcRet; |
185 } | 185 } |
186 | 186 |
187 void SetPageContents(CFX_ByteString key, | 187 void SetPageContents(CFX_ByteString key, |
188 CPDF_Dictionary* pPage, | 188 CPDF_Dictionary* pPage, |
189 CPDF_Document* pDocument) { | 189 CPDF_Document* pDocument) { |
190 CPDF_Object* pContentsObj = pPage->GetStream("Contents"); | 190 CPDF_Object* pContentsObj = pPage->GetStreamBy("Contents"); |
191 if (!pContentsObj) { | 191 if (!pContentsObj) { |
192 pContentsObj = pPage->GetArray("Contents"); | 192 pContentsObj = pPage->GetArrayBy("Contents"); |
193 } | 193 } |
194 | 194 |
195 if (!pContentsObj) { | 195 if (!pContentsObj) { |
196 // Create a new contents dictionary | 196 // Create a new contents dictionary |
197 if (!key.IsEmpty()) { | 197 if (!key.IsEmpty()) { |
198 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); | 198 CPDF_Stream* pNewContents = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); |
199 pPage->SetAtReference("Contents", pDocument, | 199 pPage->SetAtReference("Contents", pDocument, |
200 pDocument->AddIndirectObject(pNewContents)); | 200 pDocument->AddIndirectObject(pNewContents)); |
201 | 201 |
202 CFX_ByteString sStream; | 202 CFX_ByteString sStream; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 CPDF_ObjectArray ObjectArray; | 325 CPDF_ObjectArray ObjectArray; |
326 CPDF_RectArray RectArray; | 326 CPDF_RectArray RectArray; |
327 | 327 |
328 int iRet = FLATTEN_FAIL; | 328 int iRet = FLATTEN_FAIL; |
329 iRet = ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag); | 329 iRet = ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag); |
330 if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL) | 330 if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL) |
331 return iRet; | 331 return iRet; |
332 | 332 |
333 CPDF_Rect rcOriginalCB; | 333 CPDF_Rect rcOriginalCB; |
334 CPDF_Rect rcMerger = CalculateRect(&RectArray); | 334 CPDF_Rect rcMerger = CalculateRect(&RectArray); |
335 CPDF_Rect rcOriginalMB = pPageDict->GetRect("MediaBox"); | 335 CPDF_Rect rcOriginalMB = pPageDict->GetRectBy("MediaBox"); |
336 | 336 |
337 if (pPageDict->KeyExist("CropBox")) | 337 if (pPageDict->KeyExist("CropBox")) |
338 rcOriginalMB = pPageDict->GetRect("CropBox"); | 338 rcOriginalMB = pPageDict->GetRectBy("CropBox"); |
339 | 339 |
340 if (rcOriginalMB.IsEmpty()) { | 340 if (rcOriginalMB.IsEmpty()) { |
341 rcOriginalMB = CPDF_Rect(0.0f, 0.0f, 612.0f, 792.0f); | 341 rcOriginalMB = CPDF_Rect(0.0f, 0.0f, 612.0f, 792.0f); |
342 } | 342 } |
343 | 343 |
344 rcMerger.left = | 344 rcMerger.left = |
345 rcMerger.left < rcOriginalMB.left ? rcOriginalMB.left : rcMerger.left; | 345 rcMerger.left < rcOriginalMB.left ? rcOriginalMB.left : rcMerger.left; |
346 rcMerger.right = | 346 rcMerger.right = |
347 rcMerger.right > rcOriginalMB.right ? rcOriginalMB.right : rcMerger.right; | 347 rcMerger.right > rcOriginalMB.right ? rcOriginalMB.right : rcMerger.right; |
348 rcMerger.top = | 348 rcMerger.top = |
349 rcMerger.top > rcOriginalMB.top ? rcOriginalMB.top : rcMerger.top; | 349 rcMerger.top > rcOriginalMB.top ? rcOriginalMB.top : rcMerger.top; |
350 rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom ? rcOriginalMB.bottom | 350 rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom ? rcOriginalMB.bottom |
351 : rcMerger.bottom; | 351 : rcMerger.bottom; |
352 | 352 |
353 if (pPageDict->KeyExist("ArtBox")) | 353 if (pPageDict->KeyExist("ArtBox")) |
354 rcOriginalCB = pPageDict->GetRect("ArtBox"); | 354 rcOriginalCB = pPageDict->GetRectBy("ArtBox"); |
355 else | 355 else |
356 rcOriginalCB = rcOriginalMB; | 356 rcOriginalCB = rcOriginalMB; |
357 | 357 |
358 if (!rcOriginalMB.IsEmpty()) { | 358 if (!rcOriginalMB.IsEmpty()) { |
359 CPDF_Array* pMediaBox = new CPDF_Array(); | 359 CPDF_Array* pMediaBox = new CPDF_Array(); |
360 pMediaBox->Add(new CPDF_Number(rcOriginalMB.left)); | 360 pMediaBox->Add(new CPDF_Number(rcOriginalMB.left)); |
361 pMediaBox->Add(new CPDF_Number(rcOriginalMB.bottom)); | 361 pMediaBox->Add(new CPDF_Number(rcOriginalMB.bottom)); |
362 pMediaBox->Add(new CPDF_Number(rcOriginalMB.right)); | 362 pMediaBox->Add(new CPDF_Number(rcOriginalMB.right)); |
363 pMediaBox->Add(new CPDF_Number(rcOriginalMB.top)); | 363 pMediaBox->Add(new CPDF_Number(rcOriginalMB.top)); |
364 pPageDict->SetAt("MediaBox", pMediaBox); | 364 pPageDict->SetAt("MediaBox", pMediaBox); |
365 } | 365 } |
366 | 366 |
367 if (!rcOriginalCB.IsEmpty()) { | 367 if (!rcOriginalCB.IsEmpty()) { |
368 CPDF_Array* pCropBox = new CPDF_Array(); | 368 CPDF_Array* pCropBox = new CPDF_Array(); |
369 pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); | 369 pCropBox->Add(new CPDF_Number(rcOriginalCB.left)); |
370 pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); | 370 pCropBox->Add(new CPDF_Number(rcOriginalCB.bottom)); |
371 pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); | 371 pCropBox->Add(new CPDF_Number(rcOriginalCB.right)); |
372 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); | 372 pCropBox->Add(new CPDF_Number(rcOriginalCB.top)); |
373 pPageDict->SetAt("ArtBox", pCropBox); | 373 pPageDict->SetAt("ArtBox", pCropBox); |
374 } | 374 } |
375 | 375 |
376 CPDF_Dictionary* pRes = pPageDict->GetDict("Resources"); | 376 CPDF_Dictionary* pRes = pPageDict->GetDictBy("Resources"); |
377 if (!pRes) { | 377 if (!pRes) { |
378 pRes = new CPDF_Dictionary; | 378 pRes = new CPDF_Dictionary; |
379 pPageDict->SetAt("Resources", pRes); | 379 pPageDict->SetAt("Resources", pRes); |
380 } | 380 } |
381 | 381 |
382 CPDF_Stream* pNewXObject = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); | 382 CPDF_Stream* pNewXObject = new CPDF_Stream(NULL, 0, new CPDF_Dictionary); |
383 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject); | 383 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject); |
384 CPDF_Dictionary* pPageXObject = pRes->GetDict("XObject"); | 384 CPDF_Dictionary* pPageXObject = pRes->GetDictBy("XObject"); |
385 if (!pPageXObject) { | 385 if (!pPageXObject) { |
386 pPageXObject = new CPDF_Dictionary; | 386 pPageXObject = new CPDF_Dictionary; |
387 pRes->SetAt("XObject", pPageXObject); | 387 pRes->SetAt("XObject", pPageXObject); |
388 } | 388 } |
389 | 389 |
390 CFX_ByteString key = ""; | 390 CFX_ByteString key = ""; |
391 int nStreams = ObjectArray.GetSize(); | 391 int nStreams = ObjectArray.GetSize(); |
392 | 392 |
393 if (nStreams > 0) { | 393 if (nStreams > 0) { |
394 for (int iKey = 0; /*iKey < 100*/; iKey++) { | 394 for (int iKey = 0; /*iKey < 100*/; iKey++) { |
(...skipping 12 matching lines...) Expand all Loading... |
407 | 407 |
408 if (!key.IsEmpty()) { | 408 if (!key.IsEmpty()) { |
409 pPageXObject->SetAtReference(key, pDocument, dwObjNum); | 409 pPageXObject->SetAtReference(key, pDocument, dwObjNum); |
410 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); | 410 CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); |
411 pNewXORes = new CPDF_Dictionary; | 411 pNewXORes = new CPDF_Dictionary; |
412 pNewOXbjectDic->SetAt("Resources", pNewXORes); | 412 pNewOXbjectDic->SetAt("Resources", pNewXORes); |
413 pNewOXbjectDic->SetAtName("Type", "XObject"); | 413 pNewOXbjectDic->SetAtName("Type", "XObject"); |
414 pNewOXbjectDic->SetAtName("Subtype", "Form"); | 414 pNewOXbjectDic->SetAtName("Subtype", "Form"); |
415 pNewOXbjectDic->SetAtInteger("FormType", 1); | 415 pNewOXbjectDic->SetAtInteger("FormType", 1); |
416 pNewOXbjectDic->SetAtName("Name", "FRM"); | 416 pNewOXbjectDic->SetAtName("Name", "FRM"); |
417 CPDF_Rect rcBBox = pPageDict->GetRect("ArtBox"); | 417 CPDF_Rect rcBBox = pPageDict->GetRectBy("ArtBox"); |
418 pNewOXbjectDic->SetAtRect("BBox", rcBBox); | 418 pNewOXbjectDic->SetAtRect("BBox", rcBBox); |
419 } | 419 } |
420 | 420 |
421 for (int i = 0; i < nStreams; i++) { | 421 for (int i = 0; i < nStreams; i++) { |
422 CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i); | 422 CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i); |
423 if (!pAnnotDic) | 423 if (!pAnnotDic) |
424 continue; | 424 continue; |
425 | 425 |
426 CPDF_Rect rcAnnot = pAnnotDic->GetRect("Rect"); | 426 CPDF_Rect rcAnnot = pAnnotDic->GetRectBy("Rect"); |
427 rcAnnot.Normalize(); | 427 rcAnnot.Normalize(); |
428 | 428 |
429 CFX_ByteString sAnnotState = pAnnotDic->GetString("AS"); | 429 CFX_ByteString sAnnotState = pAnnotDic->GetStringBy("AS"); |
430 CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict("AP"); | 430 CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDictBy("AP"); |
431 if (!pAnnotAP) | 431 if (!pAnnotAP) |
432 continue; | 432 continue; |
433 | 433 |
434 CPDF_Stream* pAPStream = pAnnotAP->GetStream("N"); | 434 CPDF_Stream* pAPStream = pAnnotAP->GetStreamBy("N"); |
435 if (!pAPStream) { | 435 if (!pAPStream) { |
436 CPDF_Dictionary* pAPDic = pAnnotAP->GetDict("N"); | 436 CPDF_Dictionary* pAPDic = pAnnotAP->GetDictBy("N"); |
437 if (!pAPDic) | 437 if (!pAPDic) |
438 continue; | 438 continue; |
439 | 439 |
440 if (!sAnnotState.IsEmpty()) { | 440 if (!sAnnotState.IsEmpty()) { |
441 pAPStream = pAPDic->GetStream(sAnnotState); | 441 pAPStream = pAPDic->GetStreamBy(sAnnotState); |
442 } else { | 442 } else { |
443 auto it = pAPDic->begin(); | 443 auto it = pAPDic->begin(); |
444 if (it != pAPDic->end()) { | 444 if (it != pAPDic->end()) { |
445 CPDF_Object* pFirstObj = it->second; | 445 CPDF_Object* pFirstObj = it->second; |
446 if (pFirstObj) { | 446 if (pFirstObj) { |
447 if (pFirstObj->IsReference()) | 447 if (pFirstObj->IsReference()) |
448 pFirstObj = pFirstObj->GetDirect(); | 448 pFirstObj = pFirstObj->GetDirect(); |
449 if (!pFirstObj->IsStream()) | 449 if (!pFirstObj->IsStream()) |
450 continue; | 450 continue; |
451 pAPStream = pFirstObj->AsStream(); | 451 pAPStream = pFirstObj->AsStream(); |
452 } | 452 } |
453 } | 453 } |
454 } | 454 } |
455 } | 455 } |
456 if (!pAPStream) | 456 if (!pAPStream) |
457 continue; | 457 continue; |
458 | 458 |
459 CPDF_Dictionary* pAPDic = pAPStream->GetDict(); | 459 CPDF_Dictionary* pAPDic = pAPStream->GetDict(); |
460 CFX_Matrix matrix = pAPDic->GetMatrix("Matrix"); | 460 CFX_Matrix matrix = pAPDic->GetMatrixBy("Matrix"); |
461 | 461 |
462 CPDF_Rect rcStream; | 462 CPDF_Rect rcStream; |
463 if (pAPDic->KeyExist("Rect")) | 463 if (pAPDic->KeyExist("Rect")) |
464 rcStream = pAPDic->GetRect("Rect"); | 464 rcStream = pAPDic->GetRectBy("Rect"); |
465 else if (pAPDic->KeyExist("BBox")) | 465 else if (pAPDic->KeyExist("BBox")) |
466 rcStream = pAPDic->GetRect("BBox"); | 466 rcStream = pAPDic->GetRectBy("BBox"); |
467 | 467 |
468 if (rcStream.IsEmpty()) | 468 if (rcStream.IsEmpty()) |
469 continue; | 469 continue; |
470 | 470 |
471 CPDF_Object* pObj = pAPStream; | 471 CPDF_Object* pObj = pAPStream; |
472 | 472 |
473 if (pObj) { | 473 if (pObj) { |
474 CPDF_Dictionary* pObjDic = pObj->GetDict(); | 474 CPDF_Dictionary* pObjDic = pObj->GetDict(); |
475 if (pObjDic) { | 475 if (pObjDic) { |
476 pObjDic->SetAtName("Type", "XObject"); | 476 pObjDic->SetAtName("Type", "XObject"); |
477 pObjDic->SetAtName("Subtype", "Form"); | 477 pObjDic->SetAtName("Subtype", "Form"); |
478 } | 478 } |
479 } | 479 } |
480 | 480 |
481 CPDF_Dictionary* pXObject = pNewXORes->GetDict("XObject"); | 481 CPDF_Dictionary* pXObject = pNewXORes->GetDictBy("XObject"); |
482 if (!pXObject) { | 482 if (!pXObject) { |
483 pXObject = new CPDF_Dictionary; | 483 pXObject = new CPDF_Dictionary; |
484 pNewXORes->SetAt("XObject", pXObject); | 484 pNewXORes->SetAt("XObject", pXObject); |
485 } | 485 } |
486 | 486 |
487 CFX_ByteString sFormName; | 487 CFX_ByteString sFormName; |
488 sFormName.Format("F%d", i); | 488 sFormName.Format("F%d", i); |
489 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj); | 489 FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj); |
490 pXObject->SetAtReference(sFormName, pDocument, dwObjNum); | 490 pXObject->SetAtReference(sFormName, pDocument, dwObjNum); |
491 | 491 |
(...skipping 21 matching lines...) Expand all Loading... |
513 pNewXObject->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, | 513 pNewXObject->SetData((const uint8_t*)sStream, sStream.GetLength(), FALSE, |
514 FALSE); | 514 FALSE); |
515 } | 515 } |
516 pPageDict->RemoveAt("Annots"); | 516 pPageDict->RemoveAt("Annots"); |
517 | 517 |
518 ObjectArray.RemoveAll(); | 518 ObjectArray.RemoveAll(); |
519 RectArray.RemoveAll(); | 519 RectArray.RemoveAll(); |
520 | 520 |
521 return FLATTEN_SUCCESS; | 521 return FLATTEN_SUCCESS; |
522 } | 522 } |
OLD | NEW |