xref: /AOO41X/main/svx/source/sdr/contact/objectcontactofobjlistpainter.cxx (revision 47148b3bc50811ceb41802e4cc50a5db21535900)
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 <basegfx/matrix/b2dhommatrix.hxx>
34 #include <drawinglayer/processor2d/processor2dtools.hxx>
35 #include <svx/unoapi.hxx>
36 
37 //////////////////////////////////////////////////////////////////////////////
38 
39 namespace sdr
40 {
41     namespace contact
42     {
ObjectContactPainter()43         ObjectContactPainter::ObjectContactPainter()
44         {
45         }
46 
47         // The destructor.
~ObjectContactPainter()48         ObjectContactPainter::~ObjectContactPainter()
49         {
50         }
51     } // end of namespace contact
52 } // end of namespace sdr
53 
54 //////////////////////////////////////////////////////////////////////////////
55 
56 namespace sdr
57 {
58     namespace contact
59     {
GetPaintObjectCount() const60         sal_uInt32 ObjectContactOfObjListPainter::GetPaintObjectCount() const
61         {
62             return maStartObjects.size();
63         }
64 
GetPaintObjectViewContact(sal_uInt32 nIndex) const65         ViewContact& ObjectContactOfObjListPainter::GetPaintObjectViewContact(sal_uInt32 nIndex) const
66         {
67             const SdrObject* pObj = maStartObjects[nIndex];
68             DBG_ASSERT(pObj, "ObjectContactOfObjListPainter: Corrupt SdrObjectVector (!)");
69             return pObj->GetViewContact();
70         }
71 
ObjectContactOfObjListPainter(OutputDevice & rTargetDevice,const SdrObjectVector & rObjects,const SdrPage * pProcessedPage)72         ObjectContactOfObjListPainter::ObjectContactOfObjListPainter(
73             OutputDevice& rTargetDevice,
74             const SdrObjectVector& rObjects,
75             const SdrPage* pProcessedPage)
76         :   ObjectContactPainter(),
77             mrTargetOutputDevice(rTargetDevice),
78             maStartObjects(rObjects),
79             mpProcessedPage(pProcessedPage)
80         {
81         }
82 
~ObjectContactOfObjListPainter()83         ObjectContactOfObjListPainter::~ObjectContactOfObjListPainter()
84         {
85         }
86 
87         // Process the whole displaying
ProcessDisplay(DisplayInfo & rDisplayInfo)88         void ObjectContactOfObjListPainter::ProcessDisplay(DisplayInfo& rDisplayInfo)
89         {
90             const sal_uInt32 nCount(GetPaintObjectCount());
91 
92             if(nCount)
93             {
94                 OutputDevice* pTargetDevice = TryToGetOutputDevice();
95 
96                 if(pTargetDevice)
97                 {
98                     // update current ViewInformation2D at the ObjectContact
99                     const GDIMetaFile* pMetaFile = pTargetDevice->GetConnectMetaFile();
100                     const bool bOutputToRecordingMetaFile(pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause());
101                     basegfx::B2DRange aViewRange;
102 
103                     // create ViewRange
104                     if(!bOutputToRecordingMetaFile)
105                     {
106                         // use visible pixels, but transform to world coordinates
107                         const Size aOutputSizePixel(pTargetDevice->GetOutputSizePixel());
108                         aViewRange = ::basegfx::B2DRange(0.0, 0.0, aOutputSizePixel.getWidth(), aOutputSizePixel.getHeight());
109                         aViewRange.transform(pTargetDevice->GetInverseViewTransformation());
110                     }
111 
112                     // upate local ViewInformation2D
113                     const drawinglayer::geometry::ViewInformation2D aNewViewInformation2D(
114                         basegfx::B2DHomMatrix(),
115                         pTargetDevice->GetViewTransformation(),
116                         aViewRange,
117                         GetXDrawPageForSdrPage(const_cast< SdrPage* >(mpProcessedPage)),
118                         0.0,
119                         com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>());
120                     updateViewInformation2D(aNewViewInformation2D);
121 
122                     // collect primitive data in a sequence; this will already use the updated ViewInformation2D
123                     drawinglayer::primitive2d::Primitive2DSequence xPrimitiveSequence;
124 
125                     for(sal_uInt32 a(0L); a < nCount; a++)
126                     {
127                         const ViewObjectContact& rViewObjectContact = GetPaintObjectViewContact(a).GetViewObjectContact(*this);
128 
129                         drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence(xPrimitiveSequence,
130                             rViewObjectContact.getPrimitive2DSequenceHierarchy(rDisplayInfo));
131                     }
132 
133                     // if there is something to show, use a vclProcessor to render it
134                     if(xPrimitiveSequence.hasElements())
135                     {
136                         drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = drawinglayer::processor2d::createProcessor2DFromOutputDevice(
137                             *pTargetDevice,
138                             getViewInformation2D());
139 
140                         if(pProcessor2D)
141                         {
142                             pProcessor2D->process(xPrimitiveSequence);
143                             delete pProcessor2D;
144                         }
145                     }
146                 }
147             }
148         }
149 
150         // VirtualDevice?
isOutputToVirtualDevice() const151         bool ObjectContactOfObjListPainter::isOutputToVirtualDevice() const
152         {
153             return (OUTDEV_VIRDEV == mrTargetOutputDevice.GetOutDevType());
154         }
155 
156         // recording MetaFile?
isOutputToRecordingMetaFile() const157         bool ObjectContactOfObjListPainter::isOutputToRecordingMetaFile() const
158         {
159             GDIMetaFile* pMetaFile = mrTargetOutputDevice.GetConnectMetaFile();
160             return (pMetaFile && pMetaFile->IsRecord() && !pMetaFile->IsPause());
161         }
162 
163         // pdf export?
isOutputToPDFFile() const164         bool ObjectContactOfObjListPainter::isOutputToPDFFile() const
165         {
166             return (0 != mrTargetOutputDevice.GetPDFWriter());
167         }
168 
TryToGetOutputDevice() const169         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     {
GetPaintObjectCount() const182         sal_uInt32 ObjectContactOfPagePainter::GetPaintObjectCount() const
183         {
184             return (GetStartPage() ? 1L : 0L);
185         }
186 
GetPaintObjectViewContact(sal_uInt32) const187         ViewContact& ObjectContactOfPagePainter::GetPaintObjectViewContact(sal_uInt32 /*nIndex*/) const
188         {
189             DBG_ASSERT(GetStartPage(), "ObjectContactOfPagePainter::GetPaintObjectViewContact: no StartPage set (!)");
190             return GetStartPage()->GetViewContact();
191         }
192 
ObjectContactOfPagePainter(const SdrPage * pPage,ObjectContact & rOriginalObjectContact)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 
~ObjectContactOfPagePainter()202         ObjectContactOfPagePainter::~ObjectContactOfPagePainter()
203         {
204         }
205 
SetStartPage(const SdrPage * pPage)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 
TryToGetOutputDevice() const214         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