xref: /AOO41X/main/drawinglayer/source/primitive2d/graphicprimitive2d.cxx (revision 1193d70da336d3c29892d6465fc19e1bdd59f51e)
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_drawinglayer.hxx"
26 
27 #include <drawinglayer/primitive2d/graphicprimitive2d.hxx>
28 #include <drawinglayer/primitive2d/cropprimitive2d.hxx>
29 #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
30 #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
31 #include <drawinglayer/primitive2d/graphicprimitivehelper2d.hxx>
32 #include <basegfx/matrix/b2dhommatrixtools.hxx>
33 #include <vcl/svapp.hxx>
34 #include <vcl/outdev.hxx>
35 
36 //////////////////////////////////////////////////////////////////////////////
37 
38 namespace drawinglayer
39 {
40     namespace primitive2d
41     {
42         Primitive2DSequence GraphicPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D&
43 #ifdef USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
44             rViewInformation
45 #else
46             /*rViewInformation*/
47 #endif // USE_DEBUG_CODE_TO_TEST_METAFILE_DECOMPOSE
48             ) const
49         {
50             Primitive2DSequence aRetval;
51 
52             if(255L != getGraphicAttr().GetTransparency())
53             {
54                 // do not apply mirroring from GraphicAttr to the Metafile by calling
55                 // GetTransformedGraphic, this will try to mirror the Metafile using Scale()
56                 // at the Metafile. This again calls Scale at the single MetaFile actions,
57                 // but this implementation never worked. I reworked that implementations,
58                 // but for security reasons i will try not to use it.
59                 basegfx::B2DHomMatrix aTransform(getTransform());
60 
61                 if(getGraphicAttr().IsMirrored())
62                 {
63                     // content needs mirroring
64                     const bool bHMirr(getGraphicAttr().GetMirrorFlags() & BMP_MIRROR_HORZ);
65                     const bool bVMirr(getGraphicAttr().GetMirrorFlags() & BMP_MIRROR_VERT);
66 
67                     // mirror by applying negative scale to the unit primitive and
68                     // applying the object transformation on it.
69                     aTransform = basegfx::tools::createScaleB2DHomMatrix(
70                         bHMirr ? -1.0 : 1.0,
71                         bVMirr ? -1.0 : 1.0);
72                     aTransform.translate(
73                         bHMirr ? 1.0 : 0.0,
74                         bVMirr ? 1.0 : 0.0);
75                     aTransform = getTransform() * aTransform;
76                 }
77 
78                 // Get transformed graphic. Suppress rotation and cropping, only filtering is needed
79                 // here (and may be replaced later on). Cropping is handled below as mask primitive (if set).
80                 // Also need to suppress mirroring, it is part of the transformation now (see above).
81                 GraphicAttr aSuppressGraphicAttr(getGraphicAttr());
82                 aSuppressGraphicAttr.SetCrop(0, 0, 0, 0);
83                 aSuppressGraphicAttr.SetRotation(0);
84                 aSuppressGraphicAttr.SetMirrorFlags(0);
85 
86                 const GraphicObject& rGraphicObject = getGraphicObject();
87                 const Graphic aTransformedGraphic(rGraphicObject.GetTransformedGraphic(&aSuppressGraphicAttr));
88 
89                 aRetval = create2DDecompositionOfGraphic(
90                     aTransformedGraphic,
91                     aTransform);
92 
93                 if(aRetval.getLength())
94                 {
95                     // check for cropping
96                     if(getGraphicAttr().IsCropped())
97                     {
98                         // calculate scalings between real image size and logic object size. This
99                         // is necessary since the crop values are relative to original bitmap size
100                         const basegfx::B2DVector aObjectScale(aTransform * basegfx::B2DVector(1.0, 1.0));
101                         const basegfx::B2DVector aCropScaleFactor(
102                             rGraphicObject.calculateCropScaling(
103                                 aObjectScale.getX(),
104                                 aObjectScale.getY(),
105                                 getGraphicAttr().GetLeftCrop(),
106                                 getGraphicAttr().GetTopCrop(),
107                                 getGraphicAttr().GetRightCrop(),
108                                 getGraphicAttr().GetBottomCrop()));
109 
110                         // embed content in cropPrimitive
111                         Primitive2DReference xPrimitive(
112                             new CropPrimitive2D(
113                                 aRetval,
114                                 aTransform,
115                                 getGraphicAttr().GetLeftCrop() * aCropScaleFactor.getX(),
116                                 getGraphicAttr().GetTopCrop() * aCropScaleFactor.getY(),
117                                 getGraphicAttr().GetRightCrop() * aCropScaleFactor.getX(),
118                                 getGraphicAttr().GetBottomCrop() * aCropScaleFactor.getY()));
119 
120                         aRetval = Primitive2DSequence(&xPrimitive, 1);
121                     }
122                 }
123             }
124 
125             return aRetval;
126         }
127 
128         GraphicPrimitive2D::GraphicPrimitive2D(
129             const basegfx::B2DHomMatrix& rTransform,
130             const GraphicObject& rGraphicObject,
131             const GraphicAttr& rGraphicAttr)
132         :   BufferedDecompositionPrimitive2D(),
133             maTransform(rTransform),
134             maGraphicObject(rGraphicObject),
135             maGraphicAttr(rGraphicAttr)
136         {
137         }
138 
139         GraphicPrimitive2D::GraphicPrimitive2D(
140             const basegfx::B2DHomMatrix& rTransform,
141             const GraphicObject& rGraphicObject)
142         :   BufferedDecompositionPrimitive2D(),
143             maTransform(rTransform),
144             maGraphicObject(rGraphicObject),
145             maGraphicAttr()
146         {
147         }
148 
149         bool GraphicPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
150         {
151             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
152             {
153                 const GraphicPrimitive2D& rCompare = (GraphicPrimitive2D&)rPrimitive;
154 
155                 return (getTransform() == rCompare.getTransform()
156                     && getGraphicObject() == rCompare.getGraphicObject()
157                     && getGraphicAttr() == rCompare.getGraphicAttr());
158             }
159 
160             return false;
161         }
162 
163         basegfx::B2DRange GraphicPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
164         {
165             basegfx::B2DRange aRetval(0.0, 0.0, 1.0, 1.0);
166             aRetval.transform(getTransform());
167             return aRetval;
168         }
169 
170         // provide unique ID
171         ImplPrimitrive2DIDBlock(GraphicPrimitive2D, PRIMITIVE2D_ID_GRAPHICPRIMITIVE2D)
172 
173     } // end of namespace primitive2d
174 } // end of namespace drawinglayer
175 
176 //////////////////////////////////////////////////////////////////////////////
177 // eof
178