1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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>
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>
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
; }}}}
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
;
61 inline double convmm2Px( double fMM
)
63 const double mm2px
= PDFI_OUTDEV_RESOLUTION
/25.4;
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
);
82 size_t operator()(const FontAttributes
& rFont
) const
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
);
95 struct GraphicsContext
97 css::rendering::ARGBColor LineColor
;
98 css::rendering::ARGBColor FillColor
;
105 std::vector
<double> DashArray
;
107 sal_Int32 TextRenderMode
;
108 basegfx::B2DHomMatrix Transformation
;
109 basegfx::B2DPolyPolygon 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
&&
150 OUString
GetLineJoinString() const
155 case css::rendering::PathJoinType::MITER
:
157 case css::rendering::PathJoinType::ROUND
:
159 case css::rendering::PathJoinType::BEVEL
:
164 OUString
GetLineCapString() const
169 case css::rendering::PathCapType::BUTT
:
171 case css::rendering::PathCapType::ROUND
:
173 case css::rendering::PathCapType::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);
216 /** retrieve password from user
218 bool getPassword( const css::uno::Reference
<
219 css::task::XInteractionHandler
>& xHandler
,
222 const OUString
& rDocName
225 void reportUnsupportedEncryptionFormat(
227 css::task::XInteractionHandler
> const & handler
);
232 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */