1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_SVX_SOURCE_SVDRAW_SVDFMTF_HXX
21 #define INCLUDED_SVX_SOURCE_SVDRAW_SVDFMTF_HXX
22 
23 #include <sal/config.h>
24 
25 #include <memory>
26 
27 #include <tools/contnr.hxx>
28 #include <tools/fract.hxx>
29 #include <vcl/metaact.hxx>
30 #include <vcl/virdev.hxx>
31 #include <svx/svdobj.hxx>
32 #include <svx/xdash.hxx>
33 
34 // Forward Declarations
35 
36 
37 class SfxItemSet;
38 class SdrObjList;
39 class SdrModel;
40 class SdrPage;
41 class SdrObject;
42 class SvdProgressInfo;
43 
44 
45 // Helper Class ImpSdrGDIMetaFileImport
46 class ImpSdrGDIMetaFileImport final
47 {
48     ::std::vector< SdrObject* > maTmpList;
49     ScopedVclPtr<VirtualDevice> mpVD;
50     tools::Rectangle const      maScaleRect;
51     size_t                      mnMapScalingOfs; // from here on, not edited with MapScaling
52     std::unique_ptr<SfxItemSet> mpLineAttr;
53     std::unique_ptr<SfxItemSet> mpFillAttr;
54     std::unique_ptr<SfxItemSet> mpTextAttr;
55     SdrModel*                   mpModel;
56     SdrLayerID const            mnLayer;
57     Color                       maOldLineColor;
58     sal_Int32                   mnLineWidth;
59     basegfx::B2DLineJoin        maLineJoin;
60     css::drawing::LineCap       maLineCap;
61     XDash                       maDash;
62 
63     bool                        mbMov;
64     bool                        mbSize;
65     Point                       maOfs;
66     double                      mfScaleX;
67     double                      mfScaleY;
68     Fraction                    maScaleX;
69     Fraction                    maScaleY;
70 
71     bool                        mbFntDirty;
72 
73     // to optimize (PenNULL,Brush,DrawPoly),(Pen,BrushNULL,DrawPoly) -> two-in-one
74     bool                        mbLastObjWasPolyWithoutLine;
75     bool                        mbNoLine;
76     bool                        mbNoFill;
77 
78     // to optimize multiple lines into a Polyline
79     bool                        mbLastObjWasLine;
80 
81     // clipregion
82     basegfx::B2DPolyPolygon     maClip;
83 
84     // check for clip and evtl. fill maClip
85     void checkClip();
86     bool isClip() const;
87 
88     // actions
89     void DoAction(MetaLineAction const      & rAct);
90     void DoAction(MetaRectAction const      & rAct);
91     void DoAction(MetaRoundRectAction const & rAct);
92     void DoAction(MetaEllipseAction const   & rAct);
93     void DoAction(MetaArcAction const       & rAct);
94     void DoAction(MetaPieAction const       & rAct);
95     void DoAction(MetaChordAction const     & rAct);
96     void DoAction(MetaPolyLineAction const  & rAct);
97     void DoAction(MetaPolygonAction const   & rAct);
98     void DoAction(MetaPolyPolygonAction const & rAct);
99     void DoAction(MetaTextAction const      & rAct);
100     void DoAction(MetaTextArrayAction const & rAct);
101     void DoAction(MetaStretchTextAction const & rAct);
102     void DoAction(MetaBmpAction const       & rAct);
103     void DoAction(MetaBmpScaleAction const  & rAct);
104     void DoAction(MetaBmpExAction const     & rAct);
105     void DoAction(MetaBmpExScaleAction const & rAct);
106     void DoAction(MetaHatchAction const     & rAct);
107     void DoAction(MetaLineColorAction       & rAct);
108     void DoAction(MetaMapModeAction         & rAct);
DoAction(MetaFillColorAction & rAct)109     void DoAction(MetaFillColorAction       & rAct) { rAct.Execute(mpVD); }
DoAction(MetaTextColorAction & rAct)110     void DoAction(MetaTextColorAction       & rAct) { rAct.Execute(mpVD); }
DoAction(MetaTextFillColorAction & rAct)111     void DoAction(MetaTextFillColorAction   & rAct) { rAct.Execute(mpVD); }
DoAction(MetaFontAction & rAct)112     void DoAction(MetaFontAction            & rAct) { rAct.Execute(mpVD); mbFntDirty = true; }
DoAction(MetaTextAlignAction & rAct)113     void DoAction(MetaTextAlignAction       & rAct) { rAct.Execute(mpVD); mbFntDirty = true; }
DoAction(MetaClipRegionAction & rAct)114     void DoAction(MetaClipRegionAction      & rAct) { rAct.Execute(mpVD); checkClip(); }
DoAction(MetaRasterOpAction & rAct)115     void DoAction(MetaRasterOpAction        & rAct) { rAct.Execute(mpVD); }
DoAction(MetaPushAction & rAct)116     void DoAction(MetaPushAction            & rAct) { rAct.Execute(mpVD); checkClip(); }
DoAction(MetaPopAction & rAct)117     void DoAction(MetaPopAction             & rAct) { rAct.Execute(mpVD); mbFntDirty = true; checkClip(); }
DoAction(MetaMoveClipRegionAction & rAct)118     void DoAction(MetaMoveClipRegionAction  & rAct) { rAct.Execute(mpVD); checkClip(); }
DoAction(MetaISectRectClipRegionAction & rAct)119     void DoAction(MetaISectRectClipRegionAction& rAct) { rAct.Execute(mpVD); checkClip(); }
DoAction(MetaISectRegionClipRegionAction & rAct)120     void DoAction(MetaISectRegionClipRegionAction& rAct) { rAct.Execute(mpVD); checkClip(); }
121 
122     // #i125211# The MetaCommentAction needs to advance (if used), thus
123     // give current metafile and index which may be changed
124     void DoAction(MetaCommentAction const & rAct, GDIMetaFile const & rMtf, sal_uLong& a);
125 
126     // missing actions added
127     void DoAction(MetaTextRectAction const & rAct);
128     void DoAction(MetaBmpScalePartAction const & rAct);
129     void DoAction(MetaBmpExScalePartAction const & rAct);
130     void DoAction(MetaMaskAction const & rAct);
131     void DoAction(MetaMaskScaleAction const & rAct);
132     void DoAction(MetaMaskScalePartAction const & rAct);
133     void DoAction(MetaGradientAction const & rAct);
134     void DoAction(MetaTransparentAction const & rAct);
DoAction(MetaRefPointAction & rAct)135     void DoAction(MetaRefPointAction& rAct)  { rAct.Execute(mpVD); }
DoAction(MetaTextLineColorAction & rAct)136     void DoAction(MetaTextLineColorAction& rAct)  { rAct.Execute(mpVD); mbFntDirty = true; }
137     void DoAction(MetaFloatTransparentAction const & rAct);
138     void DoAction(MetaGradientExAction const & rAct);
DoAction(MetaLayoutModeAction & rAct)139     void DoAction(MetaLayoutModeAction& rAct)  { rAct.Execute(mpVD); mbFntDirty = true; }
DoAction(MetaTextLanguageAction & rAct)140     void DoAction(MetaTextLanguageAction& rAct)  { rAct.Execute(mpVD); mbFntDirty = true; }
DoAction(MetaOverlineColorAction & rAct)141     void DoAction(MetaOverlineColorAction& rAct)  { rAct.Execute(mpVD); mbFntDirty = true; }
142 
143     void ImportText(const Point& rPos, const OUString& rStr, const MetaAction& rAct);
144     void SetAttributes(SdrObject* pObj, bool bForceTextAttr = false);
145     void InsertObj(SdrObject* pObj, bool bScale = true);
146     void MapScaling();
147 
148     // #i73407# reformulation to use new B2DPolygon classes
149     bool CheckLastLineMerge(const basegfx::B2DPolygon& rSrcPoly);
150     bool CheckLastPolyLineAndFillMerge(const basegfx::B2DPolyPolygon& rPolyPolygon);
151 
152     void DoLoopActions(GDIMetaFile const & rMtf, SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport);
153 
154     // Copy assignment is forbidden and not implemented.
155     ImpSdrGDIMetaFileImport (const ImpSdrGDIMetaFileImport &) = delete;
156     ImpSdrGDIMetaFileImport & operator= (const ImpSdrGDIMetaFileImport &) = delete;
157 
158 public:
159     ImpSdrGDIMetaFileImport(
160         SdrModel& rModel,
161         SdrLayerID nLay,
162         const tools::Rectangle& rRect);
163 
164     size_t DoImport(
165         const GDIMetaFile& rMtf,
166         SdrObjList& rDestList,
167         size_t nInsPos,
168         SvdProgressInfo* pProgrInfo = nullptr);
169 };
170 
171 #endif // INCLUDED_SVX_SOURCE_SVDRAW_SVDFMTF_HXX
172 
173 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
174