00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 #undef CDR_DOEXTRUDES
00107
00108 #include "camtypes.h"
00109 #include "cdrfiltr.h"
00110
00111
00112
00113 #include "progress.h"
00114 #include "cdrcol.h"
00115 #include "rifffile.h"
00116 #include "cdrform.h"
00117
00118 #include "nodepath.h"
00119
00120 #include "page.h"
00121
00122 #include "nodershp.h"
00123
00124
00125 #include "ndoptmz.h"
00126 #include "collist.h"
00127 #include "layer.h"
00128 #include "sglayer.h"
00129 #include "sprdmsg.h"
00130 #include "nodebmp.h"
00131 #include "nodetxts.h"
00132
00133 #include "zoomops.h"
00134
00135 #include "nodemold.h"
00136 #include "moldshap.h"
00137 #include "ndmldpth.h"
00138 #include "nodemldr.h"
00139
00140 #include "fontman.h"
00141
00142
00143 #include "cmxifltr.h"
00144
00145 DECLARE_SOURCE("$Revision: 1282 $");
00146
00147 CC_IMPLEMENT_DYNAMIC(CDRFilter, VectorFilter)
00148 CC_IMPLEMENT_MEMDUMP(CDRAttributeStore, List)
00149 CC_IMPLEMENT_MEMDUMP(CDRAttributeStoredItem, ListItem)
00150 CC_IMPLEMENT_MEMDUMP(CDRArrowheadStore, List)
00151 CC_IMPLEMENT_MEMDUMP(CDRArrowheadStoredItem, ListItem)
00152 CC_IMPLEMENT_MEMDUMP(CDRBitmapStore, List)
00153 CC_IMPLEMENT_MEMDUMP(CDRBitmapStoredItem, ListItem)
00154 CC_IMPLEMENT_MEMDUMP(CDRVectorStore, List)
00155 CC_IMPLEMENT_MEMDUMP(CDRVectorStoredItem, ListItem)
00156 CC_IMPLEMENT_MEMDUMP(CDRFontnameStore, List)
00157 CC_IMPLEMENT_MEMDUMP(CDRFontnameStoredItem, ListItem)
00158 CC_IMPLEMENT_MEMDUMP(CDRLayerList, List)
00159 CC_IMPLEMENT_MEMDUMP(CDRLayerListItem, ListItem)
00160 CC_IMPLEMENT_MEMDUMP(CDRPageList, List)
00161 CC_IMPLEMENT_MEMDUMP(CDRPageListItem, ListItem)
00162 CC_IMPLEMENT_MEMDUMP(CDRActionList, List)
00163 CC_IMPLEMENT_DYNAMIC(CDRActionListItem, ListItem)
00164 CC_IMPLEMENT_DYNAMIC(CDRActionTransform, CDRActionListItem)
00165 CC_IMPLEMENT_DYNAMIC(CDRActionGroupEnd, CDRActionListItem)
00166 CC_IMPLEMENT_MEMDUMP(CDRTransformConvertor, CC_CLASS_MEMDUMP)
00167 CC_IMPLEMENT_MEMDUMP(CDRTransformConvertor5, CDRTransformConvertor)
00168 CC_IMPLEMENT_MEMDUMP(CDRTransformConvertor4, CDRTransformConvertor)
00169 CC_IMPLEMENT_MEMDUMP(CDRTransformConvertor3, CDRTransformConvertor)
00170 CC_IMPLEMENT_MEMDUMP(CDRTextOnPathLink, ListItem)
00171
00172
00173 #define new CAM_DEBUG_NEW
00174
00175 #define PROGRESSUPDATE_MASK 0x7f
00176
00177 INT32 CDRFilter::BitmapNumber = 0;
00178 INT32 CDRFilter::PatternNumber = 0;
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 BOOL CDRFilter::UpdateProgress(BOOL Now)
00195 {
00196 BOOL Result = TRUE;
00197
00198 if(Now)
00199 {
00200 Result = ContinueSlowJob(RIFF->ProgressNow());
00201 ProgressCount = 0;
00202 }
00203 else
00204 {
00205 if((ProgressCount & PROGRESSUPDATE_MASK) == 0) {
00206 Result = ContinueSlowJob(RIFF->ProgressNow());
00207 }
00208
00209 ProgressCount++;
00210 }
00211
00212 if(!Result)
00213 {
00214 Error::ClearError();
00215 Error::SetError(_R(IDN_USER_CANCELLED));
00216 }
00217
00218 return Result;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 CDRFilter::CDRFilter(void)
00235 {
00236
00237 FilterName.Load(_R(IDT_CDRFILTER_FILTERNAME));
00238 FilterInfo.Load(_R(IDT_CDRFILTER_FILTERINFO));
00239 FilterID = FILTERID_CDR;
00240
00241 Flags.CanImport = TRUE;
00242 Flags.CanExport = FALSE;
00243
00244 Version = CDRVERSION_NULL;
00245 }
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 BOOL CDRFilter::Init(void)
00262 {
00263
00264 pOILFilter = new CDROILFilter(this);
00265 if (pOILFilter == NULL)
00266 return FALSE;
00267
00268
00269 Version = CDRVERSION_NULL;
00270
00271
00272 return TRUE;
00273 }
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 INT32 CDRFilter::HowCompatible(PathName& Filename, ADDR HeaderStart,
00290 UINT32 HeaderSize, UINT32 FileSize)
00291 {
00292 PORTNOTE("byteorder", "TODO: Check byte ordering")
00293 BOOL ExtensionMatches = pOILFilter->DoesExtensionOfPathNameMatch(&Filename);
00294
00295
00296 if (ExtensionMatches)
00297 {
00298 if(camStrncmp((char *)HeaderStart, "WL", 2) == 0)
00299 return 10;
00300 }
00301
00302
00303 FOURCC FormType;
00304
00305 FormType = RIFFFile::CheckRIFFHeader(HeaderStart, FileSize);
00306
00307 Version = CDRVERSION_NULL;
00308
00309 switch (FormType)
00310 {
00311 case cdrT_CDR:
00312 Version = CDRVERSION_3;
00313 break;
00314
00315 case cdrT_CDR4:
00316 case cdrT_CDST:
00317 Version = CDRVERSION_4;
00318 break;
00319
00320 case cdrT_CDR5:
00321 case cdrT_CDT5:
00322 Version = CDRVERSION_5;
00323 break;
00324
00325 case cdrT_CDR6:
00326 case cdrT_CDT6:
00327 Version = CDRVERSION_6;
00328 break;
00329
00330 default:
00331 break;
00332 }
00333
00334 INT32 HowMuchWeLikedThisFile = 0;
00335
00336 if(Version != CDRVERSION_NULL)
00337 {
00338 HowMuchWeLikedThisFile = 10;
00339
00340
00341 if(HasCDRFileGotCMXFile(&Filename))
00342 {
00343 HowMuchWeLikedThisFile = 5;
00344 }
00345 }
00346
00347 return HowMuchWeLikedThisFile;
00348 }
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 #define CDRFILTER_DI_RETURNERROR {Success = FALSE; return ClearUp();}
00366
00367 BOOL CDRFilter::DoImport(SelOperation *Op, CCLexFile *pDiskFile, Document *DestDoc,
00368 BOOL AutoChosen, ImportPosition *Pos,
00369 KernelBitmap** ppImportedBitmap, DocCoord* pPosTranslate, String_256* URL)
00370 {
00371
00372 if(!AutoChosen && HasCDRFileGotCMXFile(NULL, pDiskFile))
00373 {
00374 TRACEUSER( "Ben", _T(">>> loading CDR file with new CMXImportFilter\n"));
00375
00376
00377 CMXImportFilter *pFilter = new CMXImportFilter;
00378
00379 if(pFilter == NULL)
00380 return FALSE;
00381
00382 BOOL ok = pFilter->DoImport(Op, pDiskFile, DestDoc, AutoChosen, Pos);
00383
00384 delete pFilter;
00385 pFilter = NULL;
00386
00387 return ok;
00388 }
00389
00390
00391 BOOL ExtensionMatches = pOILFilter->DoesExtensionOfFileMatch(pDiskFile);
00392
00393 RIFFFile RIFFo;
00394
00395 TRACEUSER( "Ben", _T("In CDRFilter::DoImport\n"));
00396
00397
00398
00399 ERROR3IF(Fills.IsEmpty() == FALSE, "Fills store not empty");
00400 ERROR3IF(Outlines.IsEmpty() == FALSE, "Outlines store not empty");
00401 ERROR3IF(Styles.IsEmpty() == FALSE, "Styles store not empty");
00402 ERROR3IF(Fonts.IsEmpty() == FALSE, "Fonts store not empty");
00403 ERROR3IF(Arrowheads.IsEmpty() == FALSE, "Arrowheads store not empty");
00404 ERROR3IF(Patterns.IsEmpty() == FALSE, "Patterns store not empty");
00405 ERROR3IF(Bitmaps.IsEmpty() == FALSE, "Bitmap store not empty");
00406 ERROR3IF(Vectors.IsEmpty() == FALSE, "Vector store not empty");
00407 ERROR3IF(TextBBoxes.IsEmpty() == FALSE, "TextBBoxes list not empty");
00408 ERROR3IF(TextV4.IsEmpty() == FALSE, "TextV4 store not empty");
00409 ERROR3IF(TextOnPathLinks.IsEmpty() == FALSE, "TextOnPathLinks not empty");
00410
00411
00412 Fills.DeleteAll();
00413 Outlines.DeleteAll();
00414 Styles.DeleteAll();
00415 Fonts.DeleteAll();
00416 Arrowheads.DeleteAll();
00417 Patterns.DeleteAll();
00418 Bitmaps.DeleteAll();
00419 Vectors.DeleteAll();
00420 TextV4.DeleteAll();
00421 Pages.DeleteAll();
00422 Actions.DeleteAll();
00423 TextBBoxes.DeleteAll();
00424 TextOnPathLinks.DeleteAll();
00425
00426
00427 pDocument = DestDoc;
00428 Success = TRUE;
00429 SlowJobStarted = FALSE;
00430 TranslateByX = 0;
00431 TranslateByY = 0;
00432 PageX = 0;
00433 PageY = 0;
00434 pLevelNodeList = 0;
00435 DoneDoc = FALSE;
00436 DoneMasterPage = FALSE;
00437 InMasterPage = FALSE;
00438 ThisPage = 0;
00439 ThisLayer = 0;
00440 pMadeNode = 0;
00441 ObjectsConverted = 0;
00442 ObjectsFormatWrong = 0;
00443 ObjectsUnknown = 0;
00444 EnvelopesApproximated = 0;
00445 ObjDataBlock = 0;
00446 ObjDataBlockSize = 0;
00447 AttrsAlreadyApplied = FALSE;
00448 TransformChunk = 0;
00449 FontTableV3 = 0;
00450 FontStylesV3 = 0;
00451 LinkTable = 0;
00452 ThisOp = Op;
00453 LinkTransformsExist = FALSE;
00454 TheDocument = DestDoc;
00455
00456
00457 if(ExtensionMatches)
00458 {
00459
00460 TCHAR FirstBit[8];
00461
00462 if(pDiskFile->read((void *)FirstBit, sizeof(FirstBit)).bad())
00463 return FALSE;
00464
00465 ERROR1IF(camStrncmp((char *)FirstBit, "WL", 2) == 0, FALSE, _R(IDT_CDRFILTER_ISAV2FILE));
00466
00467
00468 if(pDiskFile->seek(0).bad())
00469 return FALSE;
00470 }
00471
00472
00473 RIFF = &RIFFo;
00474
00475 FOURCC FormType = RIFF->Init(pDiskFile);
00476
00477 if(FormType == 1)
00478 {
00479 CDRFILTER_DI_RETURNERROR;
00480 }
00481
00482
00483 switch(FormType)
00484 {
00485 case cdrT_CDR:
00486 Version = CDRVERSION_3;
00487 break;
00488
00489 case cdrT_CDR4:
00490 case cdrT_CDST:
00491 Version = CDRVERSION_4;
00492 break;
00493
00494 case cdrT_CDR5:
00495 case cdrT_CDT5:
00496 Version = CDRVERSION_5;
00497 break;
00498
00499 case cdrT_CDR6:
00500 case cdrT_CDT6:
00501
00502 ERROR1(FALSE, _R(IDE_CDRFILTER_CDR6));
00503 break;
00504
00505 default:
00506 TRACEUSER( "Ben", _T("Attempted to load something which wasn't a CDR file. I don't think so..."));
00507 ERROR1(FALSE, _R(IDE_CDRFILTER_NOTCDR));
00508 break;
00509 }
00510
00511
00512 ColList = DestDoc->GetIndexedColours();
00513
00514
00515 UseLayers = FALSE;
00516 #ifdef WEBSTER
00517
00518
00519 if (
00520 (!DestDoc->IsImporting() && Filter::OpenWithLayers) ||
00521 (DestDoc->IsImporting() && Filter::ImportWithLayers)
00522 )
00523 UseLayers = TRUE;
00524 #else
00525
00526
00527
00528 if (DestDoc->IsImporting())
00529 {
00530 Spread * pTheSpread = DestDoc->GetSelectedSpread();
00531 Layer * pFrame = NULL;
00532 if (pTheSpread != NULL)
00533 pFrame = pTheSpread->FindFirstFrameLayer();
00534 if (pFrame != NULL)
00535 UseLayers = FALSE;
00536 else
00537 UseLayers = Filter::ImportWithLayers;
00538 }
00539 else
00540 {
00541 UseLayers = Filter::OpenWithLayers;
00542 }
00543 #endif
00544
00545
00546 if(UseLayers == FALSE)
00547 {
00548 if (!MakeSureLayerExists(DestDoc))
00549 {
00550
00551 CDRFILTER_DI_RETURNERROR;
00552 }
00553 }
00554
00555
00556 pSpread = DestDoc->GetSelectedSpread();
00557 pPage = (Page *) pSpread->FindFirstPageInSpread();
00558
00559
00560 DocRect PageRect = pPage->GetPageRect();
00561 Origin = PageRect.lo;
00562
00563
00564
00565
00566 if (!SetUpCurrentAttrs())
00567 return FALSE;
00568
00569
00570 UINT32 id;
00571 switch(Version)
00572 {
00573 case CDRVERSION_4: id = _R(IDT_IMPORTMSG_CDR4); break;
00574 case CDRVERSION_5: id = _R(IDT_IMPORTMSG_CDR5); break;
00575 default: id = _R(IDT_IMPORTMSG_CDR3); break;
00576 }
00577 if(!DestDoc->IsImporting())
00578 id += _R(IDT_OPENMSG_CDR3) - _R(IDT_IMPORTMSG_CDR3);
00579
00580 String_64 ImportMessage = GetImportProgressString(pDiskFile, id);
00581
00582
00583
00584
00585 BeginSlowJob(RIFF->ProgressLimit(), FALSE, &ImportMessage);
00586 SlowJobStarted = TRUE;
00587
00588
00589 do
00590 {
00591
00592 if(!RIFF->NextObject())
00593 CDRFILTER_DI_RETURNERROR;
00594
00595 if(RIFF->GetObjType() == RIFFOBJECTTYPE_LISTSTART)
00596 {
00597 switch(RIFF->GetObjChunkType())
00598 {
00599 case cdrT_doc:
00600 if(!ProcessDoc())
00601 {
00602 TRACEUSER( "Ben", _T("ProcessDoc returned FALSE\n"));
00603 CDRFILTER_DI_RETURNERROR;
00604 }
00605 break;
00606
00607 case cdrT_page:
00608 if(!ProcessPage())
00609 {
00610 TRACEUSER( "Ben", _T("ProcessPage returned FALSE\n"));
00611 CDRFILTER_DI_RETURNERROR;
00612 }
00613 break;
00614
00615 default:
00616
00617 if(!RIFF->SkipToListEnd(RIFF->GetObjLevel()))
00618 CDRFILTER_DI_RETURNERROR;
00619 break;
00620 }
00621 }
00622
00623 if(!UpdateProgress())
00624 return FALSE;
00625 } while(RIFF->GetObjType() != RIFFOBJECTTYPE_FILEEND);
00626
00627
00628 ContinueSlowJob(RIFF->ProgressLimit());
00629
00630
00631 if(!AttachTextToPaths())
00632 return FALSE;
00633
00634
00635 if(ObjectsConverted > 0)
00636 {
00637
00638
00639 if(Pages.GetCount() < 1)
00640 {
00641 TRACEUSER( "Ben", _T("not enough pages in file\n"));
00642 CDRFILTER_DI_RETURNERROR;
00643 }
00644
00645
00646 CDRLayerList *MasterLayers;
00647 CDRPageListItem *En = (CDRPageListItem *)Pages.GetHead();
00648
00649 if(En == 0)
00650 CDRFILTER_DI_RETURNERROR;
00651
00652 MasterLayers = &En->Layers;
00653
00654
00655 CDRLayerList *PageLayers;
00656 En = (CDRPageListItem *)Pages.GetNext(En);
00657
00658 if(Version != CDRVERSION_3)
00659 {
00660 if(En == 0)
00661 CDRFILTER_DI_RETURNERROR;
00662
00663 PageLayers = &En->Layers;
00664
00665
00666 if(MasterLayers->GetCount() != PageLayers->GetCount())
00667 {
00668 TRACEUSER( "Ben", _T("not the same number of layers on master page and on page\n"));
00669 CDRFILTER_DI_RETURNERROR;
00670 }
00671 } else
00672 {
00673 PageLayers = 0;
00674 }
00675
00676 if(MasterLayers->GetCount() <= 0)
00677 CDRFILTER_DI_RETURNERROR;
00678
00679
00680 if(Version == CDRVERSION_3)
00681 {
00682
00683 if(!DestDoc->IsImporting() && PageX > 0 && PageY > 0)
00684 {
00685
00686
00687
00688 INT32 ms = (PageX > PageY)?PageX:PageY;
00689
00690
00691 if (pSpread)
00692 {
00693 BOOL ok = pSpread->SetPageSize(PageX, PageY, ms, 0, FALSE, TRUE);
00694
00695
00696
00697 DocRect PagesRect;
00698 NodeGrid* pGrid = pSpread->FindFirstDefaultGridInSpread();
00699 ok = ok && pSpread->GetPagesRect(&PagesRect);
00700 if (pGrid)
00701 pGrid->SetOrigin(PagesRect.lox, PagesRect.loy);
00702
00703 if (!ok)
00704 CDRFILTER_DI_RETURNERROR;
00705 }
00706 }
00707
00708 DocRect PageRect = pPage->GetPageRect();
00709 Origin = PageRect.lo;
00710
00711 TranslateByX = Origin.x + (PageX / 2);
00712 TranslateByY = Origin.y + (PageY / 2);
00713 }
00714
00715
00716 CDRLayerListItem *MasterEn = (CDRLayerListItem *)MasterLayers->GetTail();
00717 CDRLayerListItem *PageEn = 0;
00718 if(PageLayers != 0)
00719 PageEn = (CDRLayerListItem *)PageLayers->GetTail();
00720
00721 EndSlowJob();
00722 BeginSlowJob();
00723
00724
00725 if(UseLayers)
00726 {
00727
00728 while(MasterEn != 0)
00729 {
00730
00731 if(MasterEn->Objects != 0 || (PageEn != 0 && PageEn->Objects != 0))
00732 {
00733
00734 Layer *pLayer = new Layer();
00735
00736 if(pLayer == 0)
00737 CDRFILTER_DI_RETURNERROR;
00738
00739
00740 pLayer->SetLayerID(MasterEn->Name);
00741 pLayer->SetVisible(MasterEn->IsVisible);
00742 pLayer->SetLocked(MasterEn->IsLocked);
00743 pLayer->SetActive(FALSE);
00744 pLayer->SetPrintable(TRUE);
00745 pLayer->SetBackground(FALSE);
00746 pLayer->SetOutline(FALSE);
00747
00748
00749 Node *Objects = 0;
00750
00751 if(MasterEn->Objects != 0)
00752 {
00753 Objects = MasterEn->Objects;
00754 MasterEn->LayerInDocument = TRUE;
00755 }
00756 else
00757 {
00758 Objects = PageEn->Objects;
00759 PageEn->LayerInDocument = TRUE;
00760 }
00761
00762 ERROR3IF(Objects == 0, "Er, tried to make a layer for objects which didn't exist");
00763
00764
00765 Objects->InsertChainSimple(pLayer, FIRSTCHILD);
00766
00767
00768 if(Version == CDRVERSION_3)
00769 {
00770 Trans2DMatrix Trans(TranslateByX, TranslateByY);
00771 pLayer->Transform(Trans);
00772 }
00773
00774
00775 if (!Op->DoInsertNewNode(pLayer, (Node *)pSpread, LASTCHILD, TRUE))
00776 {
00777
00778 pLayer->CascadeDelete();
00779 delete pLayer;
00780 pLayer = NULL;
00781 CDRFILTER_DI_RETURNERROR;
00782 }
00783
00784
00785 pLayer->EnsureUniqueLayerID();
00786
00787
00788 if(!pLayer->OptimiseAttributes())
00789 CDRFILTER_DI_RETURNERROR;
00790 }
00791
00792
00793 MasterEn = (CDRLayerListItem *)MasterLayers->GetPrev(MasterEn);
00794 if(PageEn != 0)
00795 PageEn = (CDRLayerListItem *)PageLayers->GetPrev(PageEn);
00796 }
00797
00798
00799 DestDoc->ResetInsertionPosition();
00800 }
00801 else
00802 {
00803
00804 NodeGroup *pGroup = new NodeGroup;
00805 if(pGroup == 0)
00806 CDRFILTER_DI_RETURNERROR;
00807
00808
00809 while(MasterEn != 0)
00810 {
00811 TRACEUSER( "Ben", _T("Putting layer '%s' into document\n"), (TCHAR *)MasterEn->Name);
00812
00813
00814 if(MasterEn->Objects != 0)
00815 {
00816 MasterEn->Objects->InsertChainSimple(pGroup, LASTCHILD);
00817
00818 MasterEn->LayerInDocument = TRUE;
00819 }
00820
00821
00822 if(PageEn != 0 && PageEn->Objects != 0)
00823 {
00824 PageEn->Objects->InsertChainSimple(pGroup, LASTCHILD);
00825
00826 PageEn->LayerInDocument = TRUE;
00827 }
00828
00829
00830
00831 MasterEn = (CDRLayerListItem *)MasterLayers->GetPrev(MasterEn);
00832 if(PageEn != 0)
00833 PageEn = (CDRLayerListItem *)PageLayers->GetPrev(PageEn);
00834 }
00835
00836
00837 if(Version == CDRVERSION_3)
00838 {
00839 Trans2DMatrix Trans(TranslateByX, TranslateByY);
00840 pGroup->Transform(Trans);
00841 }
00842
00843
00844
00845
00846 NodeRenderableBounded *InsertNode = pGroup;
00847
00848 NodeRenderableBounded *FirstChild = (NodeRenderableBounded *)pGroup->FindFirstChild();
00849
00850 if(FirstChild != 0)
00851 {
00852
00853
00854 if(FirstChild->FindNext() == 0)
00855 InsertNode = FirstChild;
00856 }
00857
00858
00859 if (!Op->DoInsertNewNode(InsertNode, pSpread, TRUE))
00860 {
00861
00862 pGroup->CascadeDelete();
00863 delete pGroup;
00864 pGroup = NULL;
00865 CDRFILTER_DI_RETURNERROR;
00866 }
00867
00868 if(InsertNode != pGroup)
00869 delete pGroup;
00870
00871
00872 if(!InsertNode->OptimiseAttributes())
00873 CDRFILTER_DI_RETURNERROR;
00874 }
00875 }
00876 else
00877 {
00878
00879 if(!DestDoc->IsImporting())
00880 {
00881 if (!MakeSureLayerExists(DestDoc))
00882 CDRFILTER_DI_RETURNERROR;
00883
00884 DestDoc->ResetInsertionPosition();
00885 }
00886 }
00887
00888
00889 if(!AddStandardColourSet(pDocument))
00890 CDRFILTER_DI_RETURNERROR;
00891
00892
00893 DestDoc->PostImport();
00894
00895
00896 INT32 ObjNotConv = ObjectsFormatWrong + ObjectsUnknown;
00897
00898 if(ObjNotConv > 0)
00899 {
00900
00901 String_256 WarnMsg;
00902 WarnMsg.MakeMsg((ObjNotConv == 1)?_R(IDT_CDRFILTER_OBJWARNING1):_R(IDT_CDRFILTER_OBJWARNING), ObjNotConv);
00903 Error::SetError(0, WarnMsg, 0);
00904 InformWarning();
00905 Error::ClearError();
00906 }
00907
00908 if(EnvelopesApproximated > 0)
00909 {
00910
00911 String_256 WarnMsg;
00912 WarnMsg.MakeMsg((EnvelopesApproximated == 1)?_R(IDT_CDRFILTER_ENVAPPROXWARNING1):_R(IDT_CDRFILTER_ENVAPPROXWARNING), EnvelopesApproximated);
00913 Error::SetError(0, WarnMsg, 0);
00914 InformWarning();
00915 Error::ClearError();
00916 }
00917
00918 TRACEUSER( "Ben", _T("Do import finished\n"));
00919 return ClearUp();
00920 }
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 BOOL CDRFilter::ProcessDoc(void)
00936 {
00937 BOOL InFillTable = FALSE;
00938 BOOL InOutlineTable = FALSE;
00939 BOOL InStyleTable = FALSE;
00940 BOOL InFontTable = FALSE;
00941 BOOL InArrowheadTable = FALSE;
00942 BOOL InPatternTable = FALSE;
00943 BOOL InBitmapTable = FALSE;
00944 BOOL GotPageInfo = FALSE;
00945
00946 ADDR VectorListContents = 0;
00947 INT32 VectorListContentsSize;
00948
00949 TRACEUSER( "Ben", _T("In ProcessDoc\n"));
00950
00951
00952 UINT32 StartLevel = RIFF->GetObjLevel();
00953
00954 do
00955 {
00956 switch(RIFF->GetObjType())
00957 {
00958 case RIFFOBJECTTYPE_LISTSTART:
00959
00960 switch(RIFF->GetObjChunkType())
00961 {
00962 case cdrT_filt: InFillTable = TRUE; break;
00963 case cdrT_otlt: InOutlineTable = TRUE; break;
00964 case cdrT_stlt: InStyleTable = TRUE; break;
00965 case cdrT_fntt: InFontTable = TRUE; break;
00966 case cdrT_arrt: InArrowheadTable = TRUE; break;
00967 case cdrT_bpft: InPatternTable = TRUE; break;
00968 case cdrT_bmpt: InBitmapTable = TRUE; break;
00969 default: break;
00970
00971 case cdrT_vect:
00972
00973 if(!RIFF->GetListContents(&VectorListContents, &VectorListContentsSize))
00974 return FALSE;
00975
00976
00977 if(!RIFF->SkipToListEnd(RIFF->GetObjLevel()))
00978 return FALSE;
00979 break;
00980
00981 case cdrT_btxt:
00982 if(Version == CDRVERSION_4)
00983 {
00984
00985 if(!ProcessTextList4())
00986 return FALSE;
00987 }
00988 break;
00989 }
00990 break;
00991
00992 case RIFFOBJECTTYPE_LISTEND:
00993 switch(RIFF->GetObjChunkType())
00994 {
00995 case cdrT_filt: InFillTable = FALSE; break;
00996 case cdrT_otlt: InOutlineTable = FALSE; break;
00997 case cdrT_stlt: InStyleTable = FALSE; break;
00998 case cdrT_fntt: InFontTable = FALSE; break;
00999 case cdrT_arrt: InArrowheadTable = FALSE; break;
01000 case cdrT_bpft: InPatternTable = FALSE; break;
01001 case cdrT_bmpt: InBitmapTable = FALSE; break;
01002 default: break;
01003 }
01004 break;
01005
01006 case RIFFOBJECTTYPE_CHUNK:
01007
01008 switch(RIFF->GetObjChunkType())
01009 {
01010 case cdrT_fill:
01011 if(InFillTable)
01012 Fills.AddChunkToStore(RIFF);
01013 break;
01014
01015 case cdrT_outl:
01016 if(InOutlineTable)
01017 Outlines.AddChunkToStore(RIFF);
01018 break;
01019
01020 case cdrT_styd:
01021 if(InStyleTable)
01022 Styles.AddChunkToStore(RIFF);
01023 break;
01024
01025 case cdrT_font:
01026 if(InFontTable)
01027 Fonts.AddChunkToStore(RIFF, Version);
01028 break;
01029
01030 case cdrT_arrw:
01031 if(InArrowheadTable)
01032 Arrowheads.AddChunkToStore(RIFF);
01033 break;
01034
01035 case cdrT_bmpf:
01036 if(InPatternTable)
01037 Patterns.AddChunkToStore(RIFF, TRUE, this);
01038
01039 UpdateProgress(TRUE);
01040 break;
01041
01042 case cdrT_bmp:
01043
01044
01045 UpdateProgress(TRUE);
01046
01047 if(InBitmapTable)
01048 Bitmaps.AddChunkToStore(RIFF, FALSE, this);
01049
01050 UpdateProgress(TRUE);
01051 break;
01052
01053 case cdrT_mcfg:
01054 {
01055 if(GotPageInfo)
01056 {
01057 TRACEUSER( "Ben", _T("mcfg chunk encountered twice in doc list\n"));
01058 ERROR1(FALSE, _R(IDE_CDRFILTER_FORMATERROR));
01059 }
01060
01061 if(!RIFF->AquireChunkData())
01062 return FALSE;
01063
01064 cdrfPageInfo *i = (cdrfPageInfo *)RIFF->GetAquiredData();
01065
01066 ERROR3IF(i == 0, "No aquired data returned from RIFF chunk");
01067
01068 PageX = CDRDATA_WORD(i->PageX) * CDRCOORDS_TO_MILLIPOINTS;
01069 PageY = CDRDATA_WORD(i->PageY) * CDRCOORDS_TO_MILLIPOINTS;
01070 Landscape = (CDRDATA_WORD(i->Orientation) == cdrf_ORIENTATION_LANDSCAPE)?TRUE:FALSE;
01071
01072 GotPageInfo = TRUE;
01073 }
01074 break;
01075
01076 case cdrT_tspc:
01077 if(Version == CDRVERSION_3)
01078 {
01079
01080 if((FontStylesV3 = (ADDR)CCMalloc(RIFF->GetObjSize())) == 0)
01081 return FALSE;
01082
01083 if(!RIFF->GetChunkData(FontStylesV3, RIFF->GetObjSize()))
01084 return FALSE;
01085 }
01086 break;
01087
01088 case cdrT_ftbl:
01089 if(Version == CDRVERSION_3)
01090 {
01091
01092 if((FontTableV3 = (ADDR)CCMalloc(RIFF->GetObjSize())) == 0)
01093 return FALSE;
01094
01095 if(!RIFF->GetChunkData(FontTableV3, RIFF->GetObjSize()))
01096 return FALSE;
01097
01098
01099 FontTableEntriesV3 = RIFF->GetObjSize() / sizeof(cdrfFontTableEntryV3);
01100
01101
01102 cdrfFontTableEntryV3 *FT = (cdrfFontTableEntryV3 *)FontTableV3;
01103 for(INT32 l = 0; l < FontTableEntriesV3; l++)
01104 {
01105 if(FT[l].Name[0] != '\0' && FT[l].Name[0] != ' ')
01106 {
01107