1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef _CPPCANVAS_RENDERER_MTFTOOLS_HXX 25*b1cdbd2cSJim Jagielski #define _CPPCANVAS_RENDERER_MTFTOOLS_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <action.hxx> 28*b1cdbd2cSJim Jagielski #include <cppcanvas/canvas.hxx> 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski class VirtualDevice; 32*b1cdbd2cSJim Jagielski class Point; 33*b1cdbd2cSJim Jagielski class Size; 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski namespace basegfx 36*b1cdbd2cSJim Jagielski { 37*b1cdbd2cSJim Jagielski class B2DVector; 38*b1cdbd2cSJim Jagielski class B2DPoint; 39*b1cdbd2cSJim Jagielski } 40*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { namespace rendering 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski struct RenderState; 43*b1cdbd2cSJim Jagielski } } } } 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski namespace cppcanvas 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski namespace internal 49*b1cdbd2cSJim Jagielski { 50*b1cdbd2cSJim Jagielski struct OutDevState; 51*b1cdbd2cSJim Jagielski } 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski namespace tools 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski /** Init render state from OutDevState 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski This method initializes the given render state object, 58*b1cdbd2cSJim Jagielski sets up the transformation and the clip from the 59*b1cdbd2cSJim Jagielski OutDevState. 60*b1cdbd2cSJim Jagielski */ 61*b1cdbd2cSJim Jagielski void initRenderState( ::com::sun::star::rendering::RenderState& renderState, 62*b1cdbd2cSJim Jagielski const ::cppcanvas::internal::OutDevState& outdevState ); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski /** Calc output offset relative to baseline 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski The XCanvas API always renders text relative to its 67*b1cdbd2cSJim Jagielski baseline. This method calculates an offset in logical 68*b1cdbd2cSJim Jagielski coordinates, depending on the OutDevState's 69*b1cdbd2cSJim Jagielski textReferencePoint and the font currently set, to offset 70*b1cdbd2cSJim Jagielski the text from the baseline. 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski @param outdevState 73*b1cdbd2cSJim Jagielski State to take textReferencePoint from 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski @param rVDev 76*b1cdbd2cSJim Jagielski VDev to obtain font metrics from. 77*b1cdbd2cSJim Jagielski */ 78*b1cdbd2cSJim Jagielski ::Size getBaselineOffset( const ::cppcanvas::internal::OutDevState& outdevState, 79*b1cdbd2cSJim Jagielski const VirtualDevice& rVDev ); 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski /** Construct a matrix that converts from logical to pixel 82*b1cdbd2cSJim Jagielski coordinate system. 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski This method calculates a matrix that approximates the 85*b1cdbd2cSJim Jagielski VirtualDevice's LogicToPixel conversion (disregarding any 86*b1cdbd2cSJim Jagielski offset components, thus the 'linear' in the method name - 87*b1cdbd2cSJim Jagielski the returned matrix is guaranteed to be linear). 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski @param o_rMatrix 90*b1cdbd2cSJim Jagielski This matrix will receive the calculated transform, and is 91*b1cdbd2cSJim Jagielski also returned from this method. 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski @return the calculated transformation matrix. 94*b1cdbd2cSJim Jagielski */ 95*b1cdbd2cSJim Jagielski ::basegfx::B2DHomMatrix& calcLogic2PixelLinearTransform( ::basegfx::B2DHomMatrix& o_rMatrix, 96*b1cdbd2cSJim Jagielski const VirtualDevice& rVDev ); 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski /** Construct a matrix that converts from logical to pixel 99*b1cdbd2cSJim Jagielski coordinate system. 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski This method calculates a matrix that approximates the 102*b1cdbd2cSJim Jagielski VirtualDevice's LogicToPixel conversion. 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski @param o_rMatrix 105*b1cdbd2cSJim Jagielski This matrix will receive the calculated transform, and is 106*b1cdbd2cSJim Jagielski also returned from this method. 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski @return the calculated transformation matrix. 109*b1cdbd2cSJim Jagielski */ 110*b1cdbd2cSJim Jagielski ::basegfx::B2DHomMatrix& calcLogic2PixelAffineTransform( ::basegfx::B2DHomMatrix& o_rMatrix, 111*b1cdbd2cSJim Jagielski const VirtualDevice& rVDev ); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski /** This method modifies the clip, to cancel the given 114*b1cdbd2cSJim Jagielski transformation. 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski As the clip is relative to the render state 117*b1cdbd2cSJim Jagielski transformation, offsetting or scaling the render state 118*b1cdbd2cSJim Jagielski must modify the clip, to keep it at the same position 119*b1cdbd2cSJim Jagielski relative to the primitive at hand 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski @param o_rRenderState 122*b1cdbd2cSJim Jagielski Render state to change the clip in 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski @param rOutdevState 125*b1cdbd2cSJim Jagielski Input state. Is used to retrieve the original clip from 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski @param rOffset 128*b1cdbd2cSJim Jagielski The clip is offsetted by the negative of this value. 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski @param pScaling 131*b1cdbd2cSJim Jagielski The clip is inversely scaled by this value (if given) 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski @param pRotation 134*b1cdbd2cSJim Jagielski The clip is inversely rotated by this value (if given) 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski @return true, if the clip has changed, false if not 137*b1cdbd2cSJim Jagielski */ 138*b1cdbd2cSJim Jagielski bool modifyClip( ::com::sun::star::rendering::RenderState& o_rRenderState, 139*b1cdbd2cSJim Jagielski const struct ::cppcanvas::internal::OutDevState& rOutdevState, 140*b1cdbd2cSJim Jagielski const CanvasSharedPtr& rCanvas, 141*b1cdbd2cSJim Jagielski const ::Point& rOffset, 142*b1cdbd2cSJim Jagielski const ::basegfx::B2DVector* pScaling, 143*b1cdbd2cSJim Jagielski const double* pRotation ); 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski /** This method modifies the clip, to cancel the given 146*b1cdbd2cSJim Jagielski transformation. 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski As the clip is relative to the render state 149*b1cdbd2cSJim Jagielski transformation, offsetting or scaling the render state 150*b1cdbd2cSJim Jagielski must modify the clip, to keep it at the same position 151*b1cdbd2cSJim Jagielski relative to the primitive at hand 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski @param o_rRenderState 154*b1cdbd2cSJim Jagielski Render state to change the clip in 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski @param rOutdevState 157*b1cdbd2cSJim Jagielski Input state. Is used to retrieve the original clip from 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski @param rOffset 160*b1cdbd2cSJim Jagielski The clip is offsetted by the negative of this value. 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski @param pScaling 163*b1cdbd2cSJim Jagielski The clip is inversely scaled by this value (if given) 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski @param pRotation 166*b1cdbd2cSJim Jagielski The clip is inversely rotated by this value (if given) 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski @return true, if the clip has changed, false if not 169*b1cdbd2cSJim Jagielski */ 170*b1cdbd2cSJim Jagielski bool modifyClip( ::com::sun::star::rendering::RenderState& o_rRenderState, 171*b1cdbd2cSJim Jagielski const struct ::cppcanvas::internal::OutDevState& rOutdevState, 172*b1cdbd2cSJim Jagielski const CanvasSharedPtr& rCanvas, 173*b1cdbd2cSJim Jagielski const ::basegfx::B2DPoint& rOffset, 174*b1cdbd2cSJim Jagielski const ::basegfx::B2DVector* pScaling, 175*b1cdbd2cSJim Jagielski const double* pRotation ); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski /** This method modifies the clip, to cancel the given 178*b1cdbd2cSJim Jagielski transformation. 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski As the clip is relative to the render state 181*b1cdbd2cSJim Jagielski transformation, transforming the render state further must 182*b1cdbd2cSJim Jagielski modify the clip, to keep it at the same position relative 183*b1cdbd2cSJim Jagielski to the primitive at hand 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski @param o_rRenderState 186*b1cdbd2cSJim Jagielski Render state to change the clip in 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski @param rOutdevState 189*b1cdbd2cSJim Jagielski Input state. Is used to retrieve the original clip from 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski @param rTransform 192*b1cdbd2cSJim Jagielski The clip is transformed by the inverse of this value. 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski @return true, if the clip has changed, false if not 195*b1cdbd2cSJim Jagielski */ 196*b1cdbd2cSJim Jagielski bool modifyClip( ::com::sun::star::rendering::RenderState& o_rRenderState, 197*b1cdbd2cSJim Jagielski const struct ::cppcanvas::internal::OutDevState& rOutdevState, 198*b1cdbd2cSJim Jagielski const CanvasSharedPtr& rCanvas, 199*b1cdbd2cSJim Jagielski const ::basegfx::B2DHomMatrix& rTransform ); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski struct TextLineInfo 202*b1cdbd2cSJim Jagielski { TextLineInfocppcanvas::tools::TextLineInfo203*b1cdbd2cSJim Jagielski TextLineInfo( const double& rLineHeight, 204*b1cdbd2cSJim Jagielski const double& rOverlineHeight, 205*b1cdbd2cSJim Jagielski const double& rOverlineOffset, 206*b1cdbd2cSJim Jagielski const double& rUnderlineOffset, 207*b1cdbd2cSJim Jagielski const double& rStrikeoutOffset, 208*b1cdbd2cSJim Jagielski sal_Int8 nOverlineStyle, 209*b1cdbd2cSJim Jagielski sal_Int8 nUnderlineStyle, 210*b1cdbd2cSJim Jagielski sal_Int8 nStrikeoutStyle ) : 211*b1cdbd2cSJim Jagielski mnLineHeight( rLineHeight ), 212*b1cdbd2cSJim Jagielski mnOverlineHeight( rOverlineHeight ), 213*b1cdbd2cSJim Jagielski mnOverlineOffset( rOverlineOffset ), 214*b1cdbd2cSJim Jagielski mnUnderlineOffset( rUnderlineOffset ), 215*b1cdbd2cSJim Jagielski mnStrikeoutOffset( rStrikeoutOffset ), 216*b1cdbd2cSJim Jagielski mnOverlineStyle( nOverlineStyle ), 217*b1cdbd2cSJim Jagielski mnUnderlineStyle( nUnderlineStyle ), 218*b1cdbd2cSJim Jagielski mnStrikeoutStyle( nStrikeoutStyle ) 219*b1cdbd2cSJim Jagielski { 220*b1cdbd2cSJim Jagielski } 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski double mnLineHeight; 223*b1cdbd2cSJim Jagielski double mnOverlineHeight; 224*b1cdbd2cSJim Jagielski double mnOverlineOffset; 225*b1cdbd2cSJim Jagielski double mnUnderlineOffset; 226*b1cdbd2cSJim Jagielski double mnStrikeoutOffset; 227*b1cdbd2cSJim Jagielski sal_Int8 mnOverlineStyle; 228*b1cdbd2cSJim Jagielski sal_Int8 mnUnderlineStyle; 229*b1cdbd2cSJim Jagielski sal_Int8 mnStrikeoutStyle; 230*b1cdbd2cSJim Jagielski }; 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski /** Transform given bounds to device coordinate system. 233*b1cdbd2cSJim Jagielski */ 234*b1cdbd2cSJim Jagielski ::basegfx::B2DRange calcDevicePixelBounds( const ::basegfx::B2DRange& rBounds, 235*b1cdbd2cSJim Jagielski const ::com::sun::star::rendering::ViewState& viewState, 236*b1cdbd2cSJim Jagielski const ::com::sun::star::rendering::RenderState& renderState ); 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski /** Generate text underline/strikeout info struct from OutDev 239*b1cdbd2cSJim Jagielski state. 240*b1cdbd2cSJim Jagielski */ 241*b1cdbd2cSJim Jagielski TextLineInfo createTextLineInfo( const ::VirtualDevice& rVDev, 242*b1cdbd2cSJim Jagielski const ::cppcanvas::internal::OutDevState& rState ); 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski /** Create a poly-polygon representing the given combination 245*b1cdbd2cSJim Jagielski of overline, strikeout and underline. 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski @param rStartOffset 248*b1cdbd2cSJim Jagielski Offset in X direction, where the underline starts 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski @param rLineWidth 251*b1cdbd2cSJim Jagielski Width of the line of text to overline/strikeout/underline 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski @param rTextLineInfo 254*b1cdbd2cSJim Jagielski Common info needed for overline/strikeout/underline generation 255*b1cdbd2cSJim Jagielski */ 256*b1cdbd2cSJim Jagielski ::basegfx::B2DPolyPolygon createTextLinesPolyPolygon( const double& rStartOffset, 257*b1cdbd2cSJim Jagielski const double& rLineWidth, 258*b1cdbd2cSJim Jagielski const TextLineInfo& rTextLineInfo ); 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski ::basegfx::B2DPolyPolygon createTextLinesPolyPolygon( const ::basegfx::B2DPoint rStartPos, 261*b1cdbd2cSJim Jagielski const double& rLineWidth, 262*b1cdbd2cSJim Jagielski const TextLineInfo& rTextLineInfo ); 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski } 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski #endif /* _CPPCANVAS_RENDERER_MTFTOOLS_HXX */ 267