xref: /AOO41X/main/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
27 #include <svx/sdr/contact/displayinfo.hxx>
28 #include <svx/sdr/contact/viewobjectcontact.hxx>
29 #include <svx/svdpage.hxx>
30 #include <svx/svdobj.hxx>
31 #include <svx/sdr/contact/viewcontact.hxx>
32 #include <svx/svdmodel.hxx>
33 #include <drawinglayer/processor2d/vclprocessor2d.hxx>
34 #include <basegfx/matrix/b2dhommatrix.hxx>
35 #include <svx/sdr/contact/objectcontacttools.hxx>
36 #include <svx/unoapi.hxx>
37 
38 //////////////////////////////////////////////////////////////////////////////
39 
40 namespace sdr
41 {
42     namespace contact
43     {
44         ObjectContactPainter::ObjectContactPainter()
45         {
46         }
47 
48         // The destructor.
49         ObjectContactPainter::~ObjectContactPainter()
50         {
51         }
52     } // end of namespace contact
53 } // end of namespace sdr
54 
55 //////////////////////////////////////////////////////////////////////////////
56 
57 namespace sdr
58 {
59     namespace contact
60     {
61         sal_uInt32 ObjectContactOfObjListPainter::GetPaintObjectCount() const
62         {
63             return maStartObjects.size();
64         }
65 
66         ViewContact& ObjectContactOfObjListPainter::GetPaintObjectViewContact(sal_uInt32 nIndex) const
67         {
68             const SdrObject* pObj = maStartObjects[nIndex];
69             DBG_ASSERT(pObj, "ObjectContactOfObjListPainter: Corrupt SdrObjectVector (!)");
70             return pObj->GetViewContact();
71         }
72 
73         ObjectContactOfObjListPainter::ObjectContactOfObjListPainter(
74             OutputDevice& rTargetDevice,
75             const SdrObjectVector& rObjects,
76             const SdrPage* pProcessedPage)
77         :   ObjectContactPainter(),
78             mrTargetOutputDevice(rTargetDevice),
79             maStartObjects(rObjects),
80             mpProcessedPage(pProcessedPage)
81         {
82         }
83 
84         ObjectContactOfObjListPainter::~ObjectContactOfObjListPainter()
85         {
86         }
87 
88         // Process the whole displaying
89         void ObjectContactOfObjListPainter::ProcessDisplay(DisplayInfo& rDisplayInfo)
90         {
91             const sal_uInt32 nCount(GetPaintObjectCount());
92 
93             if(nCount)
94             {
95                 OutputDevice* pTargetDevice = TryToGetOutputDevice();
96 
97                 if(pTargetDevice)
98                 {
99                     // update current ViewInformation2D at the ObjectContact
100                     const GDIMetaFile* pMetaFile = pTargetDevice->GetConnectMetaFile();
101                     const bool bOutputToRecordingMetaFile(pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause());
102                     basegfx::B2DRange aViewRange;
103 
104                     // create ViewRange
105                     if(!bOutputToRecordingMetaFile)
106                     {
107                         // use visible pixels, but transform to world coordinates
108                         const Size aOutputSizePixel(pTargetDevice->GetOutputSizePixel());
109                         aViewRange = ::basegfx::B2DRange(0.0, 0.0, aOutputSizePixel.getWidth(), aOutputSizePixel.getHeight());
110                         aViewRange.transform(pTargetDevice->GetInverseViewTransformation());
111                     }
112 
113                     // upate local ViewInformation2D
114                     const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D(
115                         basegfx::B2DHomMatrix(),
116                         pTargetDevice->GetViewTransformation(),
117                         aViewRange,
118                         GetXDrawPageForSdrPage(const_cast< SdrPage* >(mpProcessedPage)),
119                         0.0,
120                         com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>());
121                     updateViewInformation2D(aNewViewInformation2D);
122 
123                     // collect primitive data in a sequence; this will already use the updated ViewInformation2D
124                     drawinglayer::primitive2d::Primitive2DSequence xPrimitiveSequence;
125 
126                     for(sal_uInt32 a(0L); a < nCount; a++)
127                     {
128                         const ViewObjectContact& rViewObjectContact = GetPaintObjectViewContact(a).GetViewObjectContact(*this);
129 
130                         drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xPrimitiveSequence,
131                             rViewObjectContact.getPrimitive2DSequenceHierarchy(rDisplayInfo));
132                     }
133 
134                     // if there is something to show, use a vclProcessor to render it
135                     if(xPrimitiveSequence.hasElements())
136                     {
137                         drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = createBaseProcessor2DFromOutputDevice(
138                             *pTargetDevice, getViewInformation2D());
139 
140                         if(pProcessor2D)
141                         {
142                             pProcessor2D->process(xPrimitiveSequence);
143                             delete pProcessor2D;
144                         }
145                     }
146                 }
147             }
148         }
149 
150         // VirtualDevice?
151         bool ObjectContactOfObjListPainter::isOutputToVirtualDevice() const
152         {
153             return (OUTDEV_VIRDEV == mrTargetOutputDevice.GetOutDevType());
154         }
155 
156         // recording MetaFile?
157         bool ObjectContactOfObjListPainter::isOutputToRecordingMetaFile() const
158         {
159             GDIMetaFile* pMetaFile = mrTargetOutputDevice.GetConnectMetaFile();
160             return (pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause());
161         }
162 
163         // pdf export?
164         bool ObjectContactOfObjListPainter::isOutputToPDFFile() const
165         {
166             return (0 != mrTargetOutputDevice.GetPDFWriter());
167         }
168 
169         OutputDevice* ObjectContactOfObjListPainter::TryToGetOutputDevice() const
170         {
171             return &mrTargetOutputDevice;
172         }
173     } // end of namespace contact
174 } // end of namespace sdr
175 
176 //////////////////////////////////////////////////////////////////////////////
177 
178 namespace sdr
179 {
180     namespace contact
181     {
182         sal_uInt32 ObjectContactOfPagePainter::GetPaintObjectCount() const
183         {
184             return (GetStartPage() ? 1L : 0L);
185         }
186 
187         ViewContact& ObjectContactOfPagePainter::GetPaintObjectViewContact(sal_uInt32 /*nIndex*/) const
188         {
189             DBG_ASSERT(GetStartPage(), "ObjectContactOfPagePainter::GetPaintObjectViewContact: no StartPage set (!)");
190             return GetStartPage()->GetViewContact();
191         }
192 
193         ObjectContactOfPagePainter::ObjectContactOfPagePainter(
194             const SdrPage* pPage,
195             ObjectContact& rOriginalObjectContact)
196         :   ObjectContactPainter(),
197             mrOriginalObjectContact(rOriginalObjectContact),
198             mxStartPage(const_cast< SdrPage* >(pPage)) // no SdrPageWeakRef available to hold a const SdrPage*
199         {
200         }
201 
202         ObjectContactOfPagePainter::~ObjectContactOfPagePainter()
203         {
204         }
205 
206         void ObjectContactOfPagePainter::SetStartPage(const SdrPage* pPage)
207         {
208             if(pPage != GetStartPage())
209             {
210                 mxStartPage.reset(const_cast< SdrPage* >(pPage)); // no SdrPageWeakRef available to hold a const SdrPage*
211             }
212         }
213 
214         OutputDevice* ObjectContactOfPagePainter::TryToGetOutputDevice() const
215         {
216             return mrOriginalObjectContact.TryToGetOutputDevice();
217         }
218     } // end of namespace contact
219 } // end of namespace sdr
220 
221 //////////////////////////////////////////////////////////////////////////////
222 // eof
223