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 #pragma once
21 
22 #include <memory>
23 #include <vcl/dllapi.h>
24 #include <tools/solar.h>
25 #include <rtl/ustring.hxx>
26 #include <vcl/bitmapex.hxx>
27 #include <vcl/animate/Animation.hxx>
28 #include <vcl/gfxlink.hxx>
29 #include <com/sun/star/uno/Reference.hxx>
30 #include <vcl/vectorgraphicdata.hxx>
31 #include <basegfx/vector/b2dsize.hxx>
32 #include <vcl/GraphicExternalLink.hxx>
33 
34 enum class GraphicType
35 {
36     NONE,
37     Bitmap,
38     GdiMetafile,
39     Default
40 };
41 
42 namespace com::sun::star::graphic { class XGraphic; }
43 namespace vcl { class Font; }
44 
45 class Bitmap;
46 class GDIMetaFile;
47 class SvStream;
48 class ImpGraphic;
49 class OutputDevice;
50 class GraphicReader;
51 
52 class SAL_WARN_UNUSED VCL_DLLPUBLIC GraphicConversionParameters
53 {
54 private:
55     Size            maSizePixel;            // default is (0,0)
56 
57     bool            mbUnlimitedSize : 1;    // default is false
58     bool            mbAntiAliase : 1;       // default is false
59     bool            mbSnapHorVerLines : 1;  // default is false
60 
61 public:
GraphicConversionParameters(const Size & rSizePixel=Size (),bool bUnlimitedSize=false,bool bAntiAliase=false,bool bSnapHorVerLines=false)62     GraphicConversionParameters(
63         const Size& rSizePixel = Size(),
64         bool bUnlimitedSize = false,
65         bool bAntiAliase = false,
66         bool bSnapHorVerLines = false)
67     :   maSizePixel(rSizePixel),
68         mbUnlimitedSize(bUnlimitedSize),
69         mbAntiAliase(bAntiAliase),
70         mbSnapHorVerLines(bSnapHorVerLines)
71     {
72     }
73 
74     // data read access
getSizePixel() const75     const Size&     getSizePixel() const { return maSizePixel; }
getUnlimitedSize() const76     bool            getUnlimitedSize() const { return mbUnlimitedSize; }
getAntiAliase() const77     bool            getAntiAliase() const { return mbAntiAliase; }
getSnapHorVerLines() const78     bool            getSnapHorVerLines() const { return mbSnapHorVerLines; }
79 };
80 
81 class Image;
82 class VCL_DLLPUBLIC Graphic
83 {
84 private:
85     std::shared_ptr<ImpGraphic> mxImpGraphic;
86     SAL_DLLPRIVATE void ImplTestRefCount();
87 
88 public:
ImplGetImpGraphic() const89     SAL_DLLPRIVATE ImpGraphic* ImplGetImpGraphic() const { return mxImpGraphic.get(); }
90 
91                     Graphic();
92                     Graphic(std::shared_ptr<GfxLink> const & rGfxLink, sal_Int32 nPageIndex = 0);
93                     Graphic( const GraphicExternalLink& rGraphicLink );
94                     Graphic( const Graphic& rGraphic );
95                     Graphic( Graphic&& rGraphic ) noexcept;
96                     Graphic( const Image& rImage );
97                     Graphic( const BitmapEx& rBmpEx );
98                     Graphic( const std::shared_ptr<VectorGraphicData>& rVectorGraphicDataPtr );
99                     Graphic( const Animation& rAnimation );
100                     Graphic( const GDIMetaFile& rMtf );
101                     Graphic( const css::uno::Reference< css::graphic::XGraphic >& rxGraphic );
102 
103     Graphic&        operator=( const Graphic& rGraphic );
104     Graphic&        operator=( Graphic&& rGraphic ) noexcept;
105     bool            operator==( const Graphic& rGraphic ) const;
106     bool            operator!=( const Graphic& rGraphic ) const;
107 
108     bool            IsNone() const;
109 
110     void            Clear();
111 
112     GraphicType     GetType() const;
113     void            SetDefaultType();
114     bool            IsSupportedGraphic() const;
115 
116     bool            IsTransparent() const;
117     bool            IsAlpha() const;
118     bool            IsAnimated() const;
119     bool            IsEPS() const;
120 
121     bool isAvailable() const;
122     bool makeAvailable();
123 
124     // #i102089# Access of Bitmap potentially will have to rasterconvert the Graphic
125     // if it is a MetaFile. To be able to control this conversion it is necessary to
126     // allow giving parameters which control AntiAliasing and LineSnapping of the
127     // MetaFile when played. Defaults will use a no-AAed, not snapped conversion as
128     // before.
129     BitmapEx        GetBitmapEx(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const;
130     /// Gives direct access to the contained BitmapEx.
131     const BitmapEx& GetBitmapExRef() const;
132 
133     Animation       GetAnimation() const;
134     const GDIMetaFile& GetGDIMetaFile() const;
135 
136     css::uno::Reference< css::graphic::XGraphic > GetXGraphic() const;
137 
138     Size            GetPrefSize() const;
139     void            SetPrefSize( const Size& rPrefSize );
140 
141     MapMode         GetPrefMapMode() const;
142     void            SetPrefMapMode( const MapMode& rPrefMapMode );
143 
144     basegfx::B2DSize GetPPI() const;
145 
146     Size            GetSizePixel( const OutputDevice* pRefDevice = nullptr ) const;
147 
148     sal_uLong       GetSizeBytes() const;
149 
150     void            Draw(OutputDevice& rOutDev, const Point& rDestPt) const;
151     void            Draw(OutputDevice& rOutDev, const Point& rDestPt,
152                          const Size& rDestSize) const;
153     static void     DrawEx(OutputDevice& rOutDev, const OUString& rText,
154                            vcl::Font& rFont, const BitmapEx& rBitmap,
155                            const Point& rDestPt, const Size& rDestSize);
156 
157     void            StartAnimation(OutputDevice& rOutDev,
158                                    const Point& rDestPt,
159                                    const Size& rDestSize,
160                                    tools::Long nExtraData = 0,
161                                    OutputDevice* pFirstFrameOutDev = nullptr);
162     void            StopAnimation( const OutputDevice* pOutputDevice,
163                           tools::Long nExtraData );
164 
165     void            SetAnimationNotifyHdl( const Link<Animation*,void>& rLink );
166     Link<Animation*,void> GetAnimationNotifyHdl() const;
167 
168     sal_uInt32      GetAnimationLoopCount() const;
169 
170     BitmapChecksum  GetChecksum() const;
171 
172     OUString getOriginURL() const;
173     void setOriginURL(OUString const & rOriginURL);
174 
175     OString getUniqueID() const;
176 
177     std::shared_ptr<GraphicReader>& GetReaderContext();
178     void                            SetReaderContext( const std::shared_ptr<GraphicReader> &pReader );
179     void                            SetDummyContext(bool value);
180     bool                            IsDummyContext() const;
181 
182     void            SetGfxLink(const std::shared_ptr<GfxLink>& rGfxLink);
183     const std::shared_ptr<GfxLink> & GetSharedGfxLink() const;
184     GfxLink         GetGfxLink() const;
185     bool            IsGfxLink() const;
186 
187     const std::shared_ptr<VectorGraphicData>& getVectorGraphicData() const;
188 
189     /// Get the page number of the multi-page source this Graphic is rendered from.
190     sal_Int32 getPageNumber() const;
191 
192     static css::uno::Sequence<sal_Int8> getUnoTunnelId();
193 };
194 
195 namespace std {
196 
197 template <>
198 struct hash<Graphic>
199 {
operator ()std::hash200     std::size_t operator()(Graphic const & rGraphic) const
201     {
202         return static_cast<std::size_t>(rGraphic.GetChecksum());
203     }
204 };
205 
206 } // end namespace std
207 
208 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
209