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