vcl: allow for overriding the default PDF rendering resolution
[LibreOffice.git] / sdext / source / pdfimport / inc / pdfihelper.hxx
blobb32d439c42d4f9504b2404f3ecc0e20afa3a35ed
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_PDFIHELPER_HXX
21 #define INCLUDED_SDEXT_SOURCE_PDFIMPORT_INC_PDFIHELPER_HXX
23 #include "contentsink.hxx"
25 #include <rtl/ustring.hxx>
26 #include <rtl/math.h>
27 #include <basegfx/matrix/b2dhommatrix.hxx>
28 #include <basegfx/polygon/b2dpolypolygon.hxx>
29 #include <basegfx/polygon/b2dpolygon.hxx>
30 #include <com/sun/star/rendering/PathCapType.hpp>
31 #include <com/sun/star/rendering/PathJoinType.hpp>
33 #include <unordered_map>
34 #include <vector>
35 #include <boost/functional/hash.hpp>
37 // virtual resolution of the PDF OutputDev in dpi
38 #define PDFI_OUTDEV_RESOLUTION 7200
40 namespace com { namespace sun { namespace star { namespace task
41 { class XInteractionHandler; }}}}
43 namespace pdfi
45 typedef std::unordered_map< OUString, OUString > PropertyMap;
46 typedef sal_Int32 ImageId;
48 /// What to do with a polygon. values can be ORed together
49 enum PolygonAction { PATH_STROKE=1, PATH_FILL=2, PATH_EOFILL=4 };
51 OUString unitMMString( double fMM );
52 OUString convertPixelToUnitString( double fPix );
54 inline double convPx2mm( double fPix )
56 const double px2mm = 25.4/PDFI_OUTDEV_RESOLUTION;
57 fPix *= px2mm;
58 return fPix;
61 inline double convmm2Px( double fMM )
63 const double mm2px = PDFI_OUTDEV_RESOLUTION/25.4;
64 fMM *= mm2px;
65 return fMM;
68 inline double convPx2mmPrec2( double fPix )
70 return rtl_math_round( convPx2mm( fPix ), 2, rtl_math_RoundingMode_Floor );
73 /// Convert color to "#FEFEFE" color notation
74 OUString getColorString( const css::rendering::ARGBColor& );
75 OUString getPercentString(double value);
77 double GetAverageTransformationScale(const basegfx::B2DHomMatrix& matrix);
78 void FillDashStyleProps(PropertyMap& props, const std::vector<double>& dashArray, double scale);
80 struct FontAttrHash
82 size_t operator()(const FontAttributes& rFont ) const
84 std::size_t seed = 0;
85 boost::hash_combine(seed, rFont.familyName.hashCode());
86 boost::hash_combine(seed, rFont.isBold);
87 boost::hash_combine(seed, rFont.isItalic);
88 boost::hash_combine(seed, rFont.isUnderline);
89 boost::hash_combine(seed, rFont.isOutline);
90 boost::hash_combine(seed, rFont.size);
91 return seed;
95 struct GraphicsContext
97 css::rendering::ARGBColor LineColor;
98 css::rendering::ARGBColor FillColor;
99 sal_Int8 LineJoin;
100 sal_Int8 LineCap;
101 sal_Int8 BlendMode;
102 double Flatness;
103 double LineWidth;
104 double MiterLimit;
105 std::vector<double> DashArray;
106 sal_Int32 FontId;
107 sal_Int32 TextRenderMode;
108 basegfx::B2DHomMatrix Transformation;
109 basegfx::B2DPolyPolygon Clip;
111 GraphicsContext() :
112 LineColor(),
113 FillColor(),
114 LineJoin(0),
115 LineCap(0),
116 BlendMode(0),
117 Flatness(0.0),
118 LineWidth(1.0),
119 MiterLimit(10.0),
120 DashArray(),
121 FontId(0),
122 TextRenderMode(0),
123 Transformation(),
124 Clip()
127 bool operator==(const GraphicsContext& rRight ) const
129 return LineColor.Red == rRight.LineColor.Red &&
130 LineColor.Green == rRight.LineColor.Green &&
131 LineColor.Blue == rRight.LineColor.Blue &&
132 LineColor.Alpha == rRight.LineColor.Alpha &&
133 FillColor.Red == rRight.FillColor.Red &&
134 FillColor.Green == rRight.FillColor.Green &&
135 FillColor.Blue == rRight.FillColor.Blue &&
136 FillColor.Alpha == rRight.FillColor.Alpha &&
137 LineJoin == rRight.LineJoin &&
138 LineCap == rRight.LineCap &&
139 BlendMode == rRight.BlendMode &&
140 LineWidth == rRight.LineWidth &&
141 Flatness == rRight.Flatness &&
142 MiterLimit == rRight.MiterLimit &&
143 DashArray == rRight.DashArray &&
144 FontId == rRight.FontId &&
145 TextRenderMode == rRight.TextRenderMode &&
146 Transformation == rRight.Transformation &&
147 Clip == rRight.Clip;
150 OUString GetLineJoinString() const
152 switch (LineJoin)
154 default:
155 case css::rendering::PathJoinType::MITER:
156 return "miter";
157 case css::rendering::PathJoinType::ROUND:
158 return "round";
159 case css::rendering::PathJoinType::BEVEL:
160 return "bevel";
164 OUString GetLineCapString() const
166 switch (LineCap)
168 default:
169 case css::rendering::PathCapType::BUTT:
170 return "butt";
171 case css::rendering::PathCapType::ROUND:
172 return "round";
173 case css::rendering::PathCapType::SQUARE:
174 return "square";
178 bool isRotatedOrSkewed() const
179 { return Transformation.get( 0, 1 ) != 0.0 ||
180 Transformation.get( 1, 0 ) != 0.0; }
183 struct GraphicsContextHash
185 size_t operator()(const GraphicsContext& rGC ) const
187 std::size_t seed = 0;
188 boost::hash_combine(seed, rGC.LineColor.Red);
189 boost::hash_combine(seed, rGC.LineColor.Green);
190 boost::hash_combine(seed, rGC.LineColor.Blue);
191 boost::hash_combine(seed, rGC.LineColor.Alpha);
192 boost::hash_combine(seed, rGC.FillColor.Red);
193 boost::hash_combine(seed, rGC.FillColor.Green);
194 boost::hash_combine(seed, rGC.FillColor.Blue);
195 boost::hash_combine(seed, rGC.FillColor.Alpha);
196 boost::hash_combine(seed, rGC.LineJoin);
197 boost::hash_combine(seed, rGC.LineCap);
198 boost::hash_combine(seed, rGC.BlendMode);
199 boost::hash_combine(seed, rGC.LineWidth);
200 boost::hash_combine(seed, rGC.Flatness);
201 boost::hash_combine(seed, rGC.MiterLimit);
202 boost::hash_combine(seed, rGC.DashArray.size());
203 boost::hash_combine(seed, rGC.FontId);
204 boost::hash_combine(seed, rGC.TextRenderMode);
205 boost::hash_combine(seed, rGC.Transformation.get( 0, 0 ));
206 boost::hash_combine(seed, rGC.Transformation.get( 1, 0 ));
207 boost::hash_combine(seed, rGC.Transformation.get( 0, 1 ));
208 boost::hash_combine(seed, rGC.Transformation.get( 1, 1 ));
209 boost::hash_combine(seed, rGC.Transformation.get( 0, 2 ));
210 boost::hash_combine(seed, rGC.Transformation.get( 1, 2 ));
211 boost::hash_combine(seed, rGC.Clip.count() ? rGC.Clip.getB2DPolygon(0).count() : 0);
212 return seed;
216 /** retrieve password from user
218 bool getPassword( const css::uno::Reference<
219 css::task::XInteractionHandler >& xHandler,
220 OUString& rOutPwd,
221 bool bFirstTry,
222 const OUString& rDocName
225 void reportUnsupportedEncryptionFormat(
226 css::uno::Reference<
227 css::task::XInteractionHandler > const & handler);
230 #endif
232 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */