blob: eb692426f650905cb454a5f5a3bafca917eca803 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_PDFI_HELPER_HXX
#define INCLUDED_PDFI_HELPER_HXX
#include "contentsink.hxx"
#include <rtl/ustring.hxx>
#include <rtl/math.h>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>
#include <com/sun/star/rendering/XColorSpace.hpp>
#include <vector>
#include <hash_map>
// virtual resolution of the PDF OutputDev in dpi
#define PDFI_OUTDEV_RESOLUTION 7200
namespace com { namespace sun { namespace star { namespace task
{ class XInteractionHandler; }}}}
namespace pdfi
{
typedef std::hash_map< rtl::OUString, rtl::OUString, rtl::OUStringHash > PropertyMap;
typedef sal_Int32 ImageId;
/// What to do with a polygon. values can be ORed together
enum PolygonAction { PATH_STROKE=1, PATH_FILL=2, PATH_EOFILL=4 };
rtl::OUString unitMMString( double fMM );
rtl::OUString convertPixelToUnitString( double fPix );
inline double convPx2mm( double fPix )
{
const double px2mm = 25.4/PDFI_OUTDEV_RESOLUTION;
fPix *= px2mm;
return fPix;
}
inline double convmm2Px( double fMM )
{
const double mm2px = PDFI_OUTDEV_RESOLUTION/25.4;
fMM *= mm2px;
return fMM;
}
inline double convPx2mmPrec2( double fPix )
{
return rtl_math_round( convPx2mm( fPix ), 2, rtl_math_RoundingMode_Floor );
}
/// Convert color to "#FEFEFE" color notation
rtl::OUString getColorString( const ::com::sun::star::rendering::ARGBColor& );
struct FontAttrHash
{
size_t operator()(const FontAttributes& rFont ) const
{
return (size_t)rFont.familyName.hashCode()
^ size_t(rFont.isBold ? 0xd47be593 : 0)
^ size_t(rFont.isItalic ? 0x1efd51a1 : 0)
^ size_t(rFont.isUnderline ? 0xf6bd325a : 0)
^ size_t(rFont.isOutline ? 0x12345678 : 0)
^ size_t(rFont.size)
;
}
};
struct GraphicsContext
{
::com::sun::star::rendering::ARGBColor LineColor;
::com::sun::star::rendering::ARGBColor FillColor;
sal_Int8 LineJoin;
sal_Int8 LineCap;
sal_Int8 BlendMode;
double Flatness;
double LineWidth;
double MiterLimit;
std::vector<double> DashArray;
sal_Int32 FontId;
sal_Int32 TextRenderMode;
basegfx::B2DHomMatrix Transformation;
basegfx::B2DPolyPolygon Clip;
GraphicsContext() :
LineColor(),
FillColor(),
LineJoin(0),
LineCap(0),
BlendMode(0),
Flatness(0.0),
LineWidth(1.0),
MiterLimit(10.0),
DashArray(),
FontId(0),
TextRenderMode(0),
Transformation(),
Clip()
{}
bool operator==(const GraphicsContext& rRight ) const
{
return LineColor.Red == rRight.LineColor.Red &&
LineColor.Green == rRight.LineColor.Green &&
LineColor.Blue == rRight.LineColor.Blue &&
LineColor.Alpha == rRight.LineColor.Alpha &&
FillColor.Red == rRight.FillColor.Red &&
FillColor.Green == rRight.FillColor.Green &&
FillColor.Blue == rRight.FillColor.Blue &&
FillColor.Alpha == rRight.FillColor.Alpha &&
LineJoin == rRight.LineJoin &&
LineCap == rRight.LineCap &&
BlendMode == rRight.BlendMode &&
LineWidth == rRight.LineWidth &&
Flatness == rRight.Flatness &&
MiterLimit == rRight.MiterLimit &&
DashArray == rRight.DashArray &&
FontId == rRight.FontId &&
TextRenderMode == rRight.TextRenderMode &&
Transformation == rRight.Transformation &&
Clip == rRight.Clip;
}
bool isRotatedOrSkewed() const
{ return Transformation.get( 0, 1 ) != 0.0 ||
Transformation.get( 1, 0 ) != 0.0; }
};
struct GraphicsContextHash
{
size_t operator()(const GraphicsContext& rGC ) const
{
return size_t(rGC.LineColor.Red)
^ size_t(rGC.LineColor.Green)
^ size_t(rGC.LineColor.Blue)
^ size_t(rGC.LineColor.Alpha)
^ size_t(rGC.FillColor.Red)
^ size_t(rGC.FillColor.Green)
^ size_t(rGC.FillColor.Blue)
^ size_t(rGC.FillColor.Alpha)
^ size_t(rGC.LineJoin)
^ size_t(rGC.LineCap)
^ size_t(rGC.BlendMode)
^ size_t(rGC.LineWidth)
^ size_t(rGC.Flatness)
^ size_t(rGC.MiterLimit)
^ rGC.DashArray.size()
^ size_t(rGC.FontId)
^ size_t(rGC.TextRenderMode)
^ size_t(rGC.Transformation.get( 0, 0 ))
^ size_t(rGC.Transformation.get( 1, 0 ))
^ size_t(rGC.Transformation.get( 0, 1 ))
^ size_t(rGC.Transformation.get( 1, 1 ))
^ size_t(rGC.Transformation.get( 0, 2 ))
^ size_t(rGC.Transformation.get( 1, 2 ))
^ size_t(rGC.Clip.count() ? rGC.Clip.getB2DPolygon(0).count() : 0)
;
}
};
/** retrieve password from user
*/
bool getPassword( const ::com::sun::star::uno::Reference<
::com::sun::star::task::XInteractionHandler >& xHandler,
rtl::OUString& rOutPwd,
bool bFirstTry,
const rtl::OUString& rDocName
);
}
#define USTR(x) rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( x ) )
#endif