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/XColorSpace.hpp>
31 #include "com/sun/star/rendering/PathCapType.hpp"
32 #include "com/sun/star/rendering/PathJoinType.hpp"
34 #include <unordered_map>
36 #include <boost/functional/hash.hpp>
38 // virtual resolution of the PDF OutputDev in dpi
39 #define PDFI_OUTDEV_RESOLUTION 7200
41 namespace com
{ namespace sun
{ namespace star
{ namespace task
42 { class XInteractionHandler
; }}}}
46 typedef std::unordered_map
< OUString
, OUString
, OUStringHash
> PropertyMap
;
47 typedef sal_Int32 ImageId
;
49 /// What to do with a polygon. values can be ORed together
50 enum PolygonAction
{ PATH_STROKE
=1, PATH_FILL
=2, PATH_EOFILL
=4 };
52 OUString
unitMMString( double fMM
);
53 OUString
convertPixelToUnitString( double fPix
);
55 inline double convPx2mm( double fPix
)
57 const double px2mm
= 25.4/PDFI_OUTDEV_RESOLUTION
;
62 inline double convmm2Px( double fMM
)
64 const double mm2px
= PDFI_OUTDEV_RESOLUTION
/25.4;
69 inline double convPx2mmPrec2( double fPix
)
71 return rtl_math_round( convPx2mm( fPix
), 2, rtl_math_RoundingMode_Floor
);
74 /// Convert color to "#FEFEFE" color notation
75 OUString
getColorString( const css::rendering::ARGBColor
& );
76 OUString
getPercentString(double value
);
78 double GetAverageTransformationScale(const basegfx::B2DHomMatrix
& matrix
);
79 void FillDashStyleProps(PropertyMap
& props
, const std::vector
<double>& dashArray
, double scale
);
83 size_t operator()(const FontAttributes
& rFont
) const
85 return (size_t)rFont
.familyName
.hashCode()
86 ^ size_t(rFont
.isBold
? 0xd47be593 : 0)
87 ^ size_t(rFont
.isItalic
? 0x1efd51a1 : 0)
88 ^ size_t(rFont
.isUnderline
? 0xf6bd325a : 0)
89 ^ size_t(rFont
.isOutline
? 0x12345678 : 0)
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
:
156 return OUString("miter");
157 case css::rendering::PathJoinType::ROUND
:
158 return OUString("round");
159 case css::rendering::PathJoinType::BEVEL
:
160 return OUString("bevel");
164 OUString
GetLineCapString() const
169 case css::rendering::PathCapType::BUTT
:
170 return OUString("butt");
171 case css::rendering::PathCapType::ROUND
:
172 return OUString("round");
173 case css::rendering::PathCapType::SQUARE
:
174 return OUString("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 return boost::hash_value(rGC
.LineColor
.Red
)
188 ^ boost::hash_value(rGC
.LineColor
.Green
)
189 ^ boost::hash_value(rGC
.LineColor
.Blue
)
190 ^ boost::hash_value(rGC
.LineColor
.Alpha
)
191 ^ boost::hash_value(rGC
.FillColor
.Red
)
192 ^ boost::hash_value(rGC
.FillColor
.Green
)
193 ^ boost::hash_value(rGC
.FillColor
.Blue
)
194 ^ boost::hash_value(rGC
.FillColor
.Alpha
)
195 ^ boost::hash_value(rGC
.LineJoin
)
196 ^ boost::hash_value(rGC
.LineCap
)
197 ^ boost::hash_value(rGC
.BlendMode
)
198 ^ boost::hash_value(rGC
.LineWidth
)
199 ^ boost::hash_value(rGC
.Flatness
)
200 ^ boost::hash_value(rGC
.MiterLimit
)
201 ^ rGC
.DashArray
.size()
202 ^ boost::hash_value(rGC
.FontId
)
203 ^ boost::hash_value(rGC
.TextRenderMode
)
204 ^ boost::hash_value(rGC
.Transformation
.get( 0, 0 ))
205 ^ boost::hash_value(rGC
.Transformation
.get( 1, 0 ))
206 ^ boost::hash_value(rGC
.Transformation
.get( 0, 1 ))
207 ^ boost::hash_value(rGC
.Transformation
.get( 1, 1 ))
208 ^ boost::hash_value(rGC
.Transformation
.get( 0, 2 ))
209 ^ boost::hash_value(rGC
.Transformation
.get( 1, 2 ))
210 ^ boost::hash_value(rGC
.Clip
.count() ? rGC
.Clip
.getB2DPolygon(0).count() : 0)
215 /** retrieve password from user
217 bool getPassword( const css::uno::Reference
<
218 css::task::XInteractionHandler
>& xHandler
,
221 const OUString
& rDocName
224 void reportUnsupportedEncryptionFormat(
226 css::task::XInteractionHandler
> const & handler
);
231 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */