INTEGRATION: CWS thbpp6 (1.15.6); FILE MERGED
2006/12/21 18:27:17 thb 1.15.6.2: RESYNC: (1.15-1.16); FILE MERGED 2006/12/21 17:20:54 thb 1.15.6.1: #121806# Now keeping full precision of the mtf logic coordinates across mtf->XCanvas conversion
This commit is contained in:
@@ -4,9 +4,9 @@
|
||||
*
|
||||
* $RCSfile: textaction.cxx,v $
|
||||
*
|
||||
* $Revision: 1.17 $
|
||||
* $Revision: 1.18 $
|
||||
*
|
||||
* last change: $Author: vg $ $Date: 2007-01-18 14:19:34 $
|
||||
* last change: $Author: obo $ $Date: 2007-01-22 11:51:50 $
|
||||
*
|
||||
* The Contents of this file are made available subject to
|
||||
* the terms of GNU Lesser General Public License Version 2.1.
|
||||
@@ -188,27 +188,32 @@ namespace cppcanvas
|
||||
rTextLineInfo );
|
||||
}
|
||||
|
||||
uno::Sequence< double > setupDXArray( const sal_Int32* pCharWidths,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev )
|
||||
uno::Sequence< double > setupDXArray( const sal_Int32* pCharWidths,
|
||||
sal_Int32 nLen,
|
||||
const OutDevState& rState )
|
||||
{
|
||||
// convert character widths from logical units
|
||||
uno::Sequence< double > aCharWidthSeq( nLen );
|
||||
double* pOutputWidths( aCharWidthSeq.getArray() );
|
||||
|
||||
// #143885# maintain (nearly) full precision of DX
|
||||
// array, by circumventing integer-based
|
||||
// OutDev-mapping
|
||||
const double nScale( rState.mapModeTransform.get(0,0) );
|
||||
for( int i = 0; i < nLen; ++i )
|
||||
{
|
||||
// TODO(F2): use correct scale direction
|
||||
const Size aSize( ::basegfx::fround( *pCharWidths++ + .5 ), 0 );
|
||||
*pOutputWidths++ = rVDev.LogicToPixel( aSize ).Width();
|
||||
*pOutputWidths++ = *pCharWidths++ * nScale;
|
||||
}
|
||||
|
||||
return aCharWidthSeq;
|
||||
}
|
||||
|
||||
uno::Sequence< double > setupDXArray( const ::String& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev )
|
||||
uno::Sequence< double > setupDXArray( const ::String& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev,
|
||||
const OutDevState& rState )
|
||||
{
|
||||
// no external DX array given, create one from given
|
||||
// string
|
||||
@@ -218,7 +223,7 @@ namespace cppcanvas
|
||||
static_cast<USHORT>(nStartPos),
|
||||
static_cast<USHORT>(nLen) );
|
||||
|
||||
return setupDXArray( pCharWidths.get(), nLen, rVDev );
|
||||
return setupDXArray( pCharWidths.get(), nLen, rState );
|
||||
}
|
||||
|
||||
::basegfx::B2DPoint adaptStartPoint( const ::basegfx::B2DPoint& rStartPoint,
|
||||
@@ -284,16 +289,17 @@ namespace cppcanvas
|
||||
o_rTextLayout->applyLogicalAdvancements( rOffsets );
|
||||
}
|
||||
|
||||
sal_Int32 getLineWidth( ::VirtualDevice& rVDev,
|
||||
const rendering::StringContext& rStringContext )
|
||||
double getLineWidth( ::VirtualDevice& rVDev,
|
||||
const OutDevState& rState,
|
||||
const rendering::StringContext& rStringContext )
|
||||
{
|
||||
// TODO(F2): use correct scale direction
|
||||
const ::Size aSize( rVDev.GetTextWidth( rStringContext.Text,
|
||||
static_cast<USHORT>(rStringContext.StartPosition),
|
||||
static_cast<USHORT>(rStringContext.Length) ),
|
||||
const ::basegfx::B2DSize aSize( rVDev.GetTextWidth( rStringContext.Text,
|
||||
static_cast<USHORT>(rStringContext.StartPosition),
|
||||
static_cast<USHORT>(rStringContext.Length) ),
|
||||
0 );
|
||||
|
||||
return rVDev.LogicToPixel( aSize ).Width();
|
||||
return (rState.mapModeTransform * aSize).getX();
|
||||
}
|
||||
|
||||
uno::Sequence< double >
|
||||
@@ -509,9 +515,9 @@ namespace cppcanvas
|
||||
const rendering::ViewState& /*rViewState*/,
|
||||
const uno::Reference< rendering::XCanvas >& xCanvas,
|
||||
const ::Color& rShadowColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rReliefOffset )
|
||||
const ::basegfx::B2DSize& rReliefOffset )
|
||||
{
|
||||
::Color aEmptyColor( COL_AUTO );
|
||||
|
||||
@@ -521,8 +527,8 @@ namespace cppcanvas
|
||||
rendering::RenderState aShadowState( rRenderState );
|
||||
::basegfx::B2DHomMatrix aTranslate;
|
||||
|
||||
aTranslate.translate( rShadowOffset.Width(),
|
||||
rShadowOffset.Height() );
|
||||
aTranslate.translate( rShadowOffset.getX(),
|
||||
rShadowOffset.getY() );
|
||||
|
||||
::canvas::tools::appendToRenderState(aShadowState, aTranslate);
|
||||
|
||||
@@ -539,8 +545,8 @@ namespace cppcanvas
|
||||
rendering::RenderState aReliefState( rRenderState );
|
||||
::basegfx::B2DHomMatrix aTranslate;
|
||||
|
||||
aTranslate.translate( rReliefOffset.Width(),
|
||||
rReliefOffset.Height() );
|
||||
aTranslate.translate( rReliefOffset.getX(),
|
||||
rReliefOffset.getY() );
|
||||
|
||||
::canvas::tools::appendToRenderState(aReliefState, aTranslate);
|
||||
|
||||
@@ -560,8 +566,8 @@ namespace cppcanvas
|
||||
|
||||
::basegfx::B2DRange calcEffectTextBounds( const ::basegfx::B2DRange& rTextBounds,
|
||||
const ::basegfx::B2DRange& rLineBounds,
|
||||
const ::Size& rReliefOffset,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const rendering::RenderState& rRenderState,
|
||||
const rendering::ViewState& rViewState )
|
||||
{
|
||||
@@ -573,15 +579,15 @@ namespace cppcanvas
|
||||
// TODO(Q3): Provide this functionality at the B2DRange
|
||||
::basegfx::B2DRange aTotalBounds( aBounds );
|
||||
aTotalBounds.expand(
|
||||
::basegfx::B2DRange( aBounds.getMinX() + rReliefOffset.Width(),
|
||||
aBounds.getMinY() + rReliefOffset.Height(),
|
||||
aBounds.getMaxX() + rReliefOffset.Width(),
|
||||
aBounds.getMaxY() + rReliefOffset.Height() ) );
|
||||
::basegfx::B2DRange( aBounds.getMinX() + rReliefOffset.getX(),
|
||||
aBounds.getMinY() + rReliefOffset.getY(),
|
||||
aBounds.getMaxX() + rReliefOffset.getX(),
|
||||
aBounds.getMaxY() + rReliefOffset.getY() ) );
|
||||
aTotalBounds.expand(
|
||||
::basegfx::B2DRange( aBounds.getMinX() + rShadowOffset.Width(),
|
||||
aBounds.getMinY() + rShadowOffset.Height(),
|
||||
aBounds.getMaxX() + rShadowOffset.Width(),
|
||||
aBounds.getMaxY() + rShadowOffset.Height() ) );
|
||||
::basegfx::B2DRange( aBounds.getMinX() + rShadowOffset.getX(),
|
||||
aBounds.getMinY() + rShadowOffset.getY(),
|
||||
aBounds.getMaxX() + rShadowOffset.getX(),
|
||||
aBounds.getMaxY() + rShadowOffset.getY() ) );
|
||||
|
||||
return tools::calcDevicePixelBounds( aTotalBounds,
|
||||
rViewState,
|
||||
@@ -609,7 +615,7 @@ namespace cppcanvas
|
||||
void initEffectLinePolyPolygon( ::basegfx::B2DSize& o_rOverallSize,
|
||||
uno::Reference< rendering::XPolyPolygon2D >& o_rTextLines,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
sal_Int32 nLineWidth,
|
||||
double nLineWidth,
|
||||
const tools::TextLineInfo rLineInfo )
|
||||
{
|
||||
const ::basegfx::B2DPolyPolygon aPoly(
|
||||
@@ -629,14 +635,14 @@ namespace cppcanvas
|
||||
class TextAction : public Action, private ::boost::noncopyable
|
||||
{
|
||||
public:
|
||||
TextAction( const ::Point& rStartPoint,
|
||||
TextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
|
||||
TextAction( const ::Point& rStartPoint,
|
||||
TextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -669,7 +675,7 @@ namespace cppcanvas
|
||||
const sal_Int8 maTextDirection;
|
||||
};
|
||||
|
||||
TextAction::TextAction( const ::Point& rStartPoint,
|
||||
TextAction::TextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -682,14 +688,14 @@ namespace cppcanvas
|
||||
maTextDirection( rState.textDirection )
|
||||
{
|
||||
init( maState, mxFont,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState, rCanvas );
|
||||
|
||||
ENSURE_AND_THROW( mxFont.is(),
|
||||
"::cppcanvas::internal::TextAction(): Invalid font" );
|
||||
}
|
||||
|
||||
TextAction::TextAction( const ::Point& rStartPoint,
|
||||
TextAction::TextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -703,7 +709,7 @@ namespace cppcanvas
|
||||
maTextDirection( rState.textDirection )
|
||||
{
|
||||
init( maState, mxFont,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState, rCanvas, rTextTransform );
|
||||
|
||||
ENSURE_AND_THROW( mxFont.is(),
|
||||
@@ -787,22 +793,22 @@ namespace cppcanvas
|
||||
private ::boost::noncopyable
|
||||
{
|
||||
public:
|
||||
EffectTextAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
|
||||
EffectTextAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -839,33 +845,33 @@ namespace cppcanvas
|
||||
rendering::RenderState maState;
|
||||
const tools::TextLineInfo maTextLineInfo;
|
||||
::basegfx::B2DSize maLinesOverallSize;
|
||||
const sal_Int32 mnLineWidth;
|
||||
const double mnLineWidth;
|
||||
uno::Reference< rendering::XPolyPolygon2D > mxTextLines;
|
||||
const ::Size maReliefOffset;
|
||||
const ::basegfx::B2DSize maReliefOffset;
|
||||
const ::Color maReliefColor;
|
||||
const ::Size maShadowOffset;
|
||||
const ::basegfx::B2DSize maShadowOffset;
|
||||
const ::Color maShadowColor;
|
||||
const sal_Int8 maTextDirection;
|
||||
};
|
||||
|
||||
EffectTextAction::EffectTextAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState ) :
|
||||
EffectTextAction::EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState ) :
|
||||
mxFont( rState.xFont ),
|
||||
maStringContext( rText, nStartPos, nLen ),
|
||||
mpCanvas( rCanvas ),
|
||||
maState(),
|
||||
maTextLineInfo( tools::createTextLineInfo( rVDev, rState ) ),
|
||||
maLinesOverallSize(),
|
||||
mnLineWidth( getLineWidth( rVDev, maStringContext ) ),
|
||||
mnLineWidth( getLineWidth( rVDev, rState, maStringContext ) ),
|
||||
mxTextLines(),
|
||||
maReliefOffset( rReliefOffset ),
|
||||
maReliefColor( rReliefColor ),
|
||||
@@ -880,17 +886,17 @@ namespace cppcanvas
|
||||
maTextLineInfo );
|
||||
|
||||
init( maState, mxFont,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState, rCanvas );
|
||||
|
||||
ENSURE_AND_THROW( mxFont.is() && mxTextLines.is(),
|
||||
"::cppcanvas::internal::EffectTextAction(): Invalid font or lines" );
|
||||
}
|
||||
|
||||
EffectTextAction::EffectTextAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextAction::EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -905,7 +911,7 @@ namespace cppcanvas
|
||||
maState(),
|
||||
maTextLineInfo( tools::createTextLineInfo( rVDev, rState ) ),
|
||||
maLinesOverallSize(),
|
||||
mnLineWidth( getLineWidth( rVDev, maStringContext ) ),
|
||||
mnLineWidth( getLineWidth( rVDev, rState, maStringContext ) ),
|
||||
mxTextLines(),
|
||||
maReliefOffset( rReliefOffset ),
|
||||
maReliefColor( rReliefColor ),
|
||||
@@ -920,7 +926,7 @@ namespace cppcanvas
|
||||
maTextLineInfo );
|
||||
|
||||
init( maState, mxFont,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState, rCanvas, rTextTransform );
|
||||
|
||||
ENSURE_AND_THROW( mxFont.is() && mxTextLines.is(),
|
||||
@@ -1027,7 +1033,7 @@ namespace cppcanvas
|
||||
class TextArrayAction : public Action, private ::boost::noncopyable
|
||||
{
|
||||
public:
|
||||
TextArrayAction( const ::Point& rStartPoint,
|
||||
TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -1035,7 +1041,7 @@ namespace cppcanvas
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
|
||||
TextArrayAction( const ::Point& rStartPoint,
|
||||
TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -1067,7 +1073,7 @@ namespace cppcanvas
|
||||
rendering::RenderState maState;
|
||||
};
|
||||
|
||||
TextArrayAction::TextArrayAction( const ::Point& rStartPoint,
|
||||
TextArrayAction::TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -1080,7 +1086,7 @@ namespace cppcanvas
|
||||
{
|
||||
initArrayAction( maState,
|
||||
mxTextLayout,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rString,
|
||||
nStartPos,
|
||||
nLen,
|
||||
@@ -1089,7 +1095,7 @@ namespace cppcanvas
|
||||
rState, NULL );
|
||||
}
|
||||
|
||||
TextArrayAction::TextArrayAction( const ::Point& rStartPoint,
|
||||
TextArrayAction::TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::rtl::OUString& rString,
|
||||
sal_Int32 nStartPos,
|
||||
sal_Int32 nLen,
|
||||
@@ -1103,7 +1109,7 @@ namespace cppcanvas
|
||||
{
|
||||
initArrayAction( maState,
|
||||
mxTextLayout,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rString,
|
||||
nStartPos,
|
||||
nLen,
|
||||
@@ -1222,10 +1228,10 @@ namespace cppcanvas
|
||||
private ::boost::noncopyable
|
||||
{
|
||||
public:
|
||||
EffectTextArrayAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -1234,10 +1240,10 @@ namespace cppcanvas
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
EffectTextArrayAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -1275,16 +1281,16 @@ namespace cppcanvas
|
||||
const tools::TextLineInfo maTextLineInfo;
|
||||
::basegfx::B2DSize maLinesOverallSize;
|
||||
uno::Reference< rendering::XPolyPolygon2D > mxTextLines;
|
||||
const ::Size maReliefOffset;
|
||||
const ::basegfx::B2DSize maReliefOffset;
|
||||
const ::Color maReliefColor;
|
||||
const ::Size maShadowOffset;
|
||||
const ::basegfx::B2DSize maShadowOffset;
|
||||
const ::Color maShadowColor;
|
||||
};
|
||||
|
||||
EffectTextArrayAction::EffectTextArrayAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextArrayAction::EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -1312,7 +1318,7 @@ namespace cppcanvas
|
||||
|
||||
initArrayAction( maState,
|
||||
mxTextLayout,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rText,
|
||||
nStartPos,
|
||||
nLen,
|
||||
@@ -1321,10 +1327,10 @@ namespace cppcanvas
|
||||
rState, NULL );
|
||||
}
|
||||
|
||||
EffectTextArrayAction::EffectTextArrayAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
EffectTextArrayAction::EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::rtl::OUString& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -1353,7 +1359,7 @@ namespace cppcanvas
|
||||
|
||||
initArrayAction( maState,
|
||||
mxTextLayout,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rText,
|
||||
nStartPos,
|
||||
nLen,
|
||||
@@ -1558,24 +1564,24 @@ namespace cppcanvas
|
||||
private ::boost::noncopyable
|
||||
{
|
||||
public:
|
||||
OutlineAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::Rectangle& rOutlineBounds,
|
||||
const ::basegfx::B2DRectangle& rOutlineBounds,
|
||||
const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly,
|
||||
const ::std::vector< sal_Int32 >& rPolygonGlyphMap,
|
||||
const uno::Sequence< double >& rOffsets,
|
||||
VirtualDevice& rVDev,
|
||||
const CanvasSharedPtr& rCanvas,
|
||||
const OutDevState& rState );
|
||||
OutlineAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::Rectangle& rOutlineBounds,
|
||||
const ::basegfx::B2DRectangle& rOutlineBounds,
|
||||
const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly,
|
||||
const ::std::vector< sal_Int32 >& rPolygonGlyphMap,
|
||||
const uno::Sequence< double >& rOffsets,
|
||||
@@ -1623,31 +1629,32 @@ namespace cppcanvas
|
||||
const uno::Sequence< double > maFillColor;
|
||||
const tools::TextLineInfo maTextLineInfo;
|
||||
::basegfx::B2DSize maLinesOverallSize;
|
||||
const ::Rectangle maOutlineBounds;
|
||||
const ::basegfx::B2DRectangle maOutlineBounds;
|
||||
uno::Reference< rendering::XPolyPolygon2D > mxTextLines;
|
||||
const ::Size maReliefOffset;
|
||||
const ::basegfx::B2DSize maReliefOffset;
|
||||
const ::Color maReliefColor;
|
||||
const ::Size maShadowOffset;
|
||||
const ::basegfx::B2DSize maShadowOffset;
|
||||
const ::Color maShadowColor;
|
||||
};
|
||||
|
||||
double calcOutlineWidth( VirtualDevice& rVDev )
|
||||
double calcOutlineWidth( const OutDevState& rState,
|
||||
VirtualDevice& rVDev )
|
||||
{
|
||||
const ::Size aFontSize( 0,
|
||||
rVDev.GetFont().GetHeight() / 32 );
|
||||
const ::basegfx::B2DSize aFontSize( 0,
|
||||
rVDev.GetFont().GetHeight() / 32.0 );
|
||||
|
||||
const double nOutlineWidth(
|
||||
rVDev.LogicToPixel( aFontSize ).Height() );
|
||||
(rState.mapModeTransform * aFontSize).getY() );
|
||||
|
||||
return nOutlineWidth < 1.0 ? 1.0 : nOutlineWidth;
|
||||
}
|
||||
|
||||
OutlineAction::OutlineAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
OutlineAction::OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::Rectangle& rOutlineBounds,
|
||||
const ::basegfx::B2DRectangle& rOutlineBounds,
|
||||
const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly,
|
||||
const ::std::vector< sal_Int32 >& rPolygonGlyphMap,
|
||||
const uno::Sequence< double >& rOffsets,
|
||||
@@ -1659,7 +1666,7 @@ namespace cppcanvas
|
||||
maOffsets( rOffsets ),
|
||||
mpCanvas( rCanvas ),
|
||||
maState(),
|
||||
mnOutlineWidth( calcOutlineWidth(rVDev) ),
|
||||
mnOutlineWidth( calcOutlineWidth(rState,rVDev) ),
|
||||
maFillColor(
|
||||
::vcl::unotools::colorToDoubleSequence( rCanvas->getUNOCanvas()->getDevice(),
|
||||
::Color( COL_WHITE ) ) ),
|
||||
@@ -1679,17 +1686,17 @@ namespace cppcanvas
|
||||
maTextLineInfo );
|
||||
|
||||
init( maState,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState,
|
||||
rCanvas );
|
||||
}
|
||||
|
||||
OutlineAction::OutlineAction( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
OutlineAction::OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const ::Rectangle& rOutlineBounds,
|
||||
const ::basegfx::B2DRectangle& rOutlineBounds,
|
||||
const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly,
|
||||
const ::std::vector< sal_Int32 >& rPolygonGlyphMap,
|
||||
const uno::Sequence< double >& rOffsets,
|
||||
@@ -1702,7 +1709,7 @@ namespace cppcanvas
|
||||
maOffsets( rOffsets ),
|
||||
mpCanvas( rCanvas ),
|
||||
maState(),
|
||||
mnOutlineWidth( calcOutlineWidth(rVDev) ),
|
||||
mnOutlineWidth( calcOutlineWidth(rState,rVDev) ),
|
||||
maFillColor(
|
||||
::vcl::unotools::colorToDoubleSequence( rCanvas->getUNOCanvas()->getDevice(),
|
||||
::Color( COL_WHITE ) ) ),
|
||||
@@ -1722,7 +1729,7 @@ namespace cppcanvas
|
||||
maTextLineInfo );
|
||||
|
||||
init( maState,
|
||||
::vcl::unotools::b2DPointFromPoint( rStartPoint ),
|
||||
rStartPoint,
|
||||
rState,
|
||||
rCanvas,
|
||||
rTextTransform );
|
||||
@@ -1908,8 +1915,7 @@ namespace cppcanvas
|
||||
rendering::RenderState aLocalState( maState );
|
||||
::canvas::tools::prependToRenderState(aLocalState, rTransformation);
|
||||
|
||||
return calcEffectTextBounds( ::vcl::unotools::b2DRectangleFromRectangle(
|
||||
maOutlineBounds ),
|
||||
return calcEffectTextBounds( maOutlineBounds,
|
||||
::basegfx::B2DRange( 0,0,
|
||||
maLinesOverallSize.getX(),
|
||||
maLinesOverallSize.getY() ),
|
||||
@@ -1947,10 +1953,10 @@ namespace cppcanvas
|
||||
text, and creates a properly setup OutlineAction from
|
||||
it.
|
||||
*/
|
||||
ActionSharedPtr createOutline( const ::Point& rStartPoint,
|
||||
const ::Size& rReliefOffset,
|
||||
ActionSharedPtr createOutline( const ::basegfx::B2DPoint& rStartPoint,
|
||||
const ::basegfx::B2DSize& rReliefOffset,
|
||||
const ::Color& rReliefColor,
|
||||
const ::Size& rShadowOffset,
|
||||
const ::basegfx::B2DSize& rShadowOffset,
|
||||
const ::Color& rShadowColor,
|
||||
const String& rText,
|
||||
sal_Int32 nStartPos,
|
||||
@@ -1977,8 +1983,8 @@ namespace cppcanvas
|
||||
|
||||
// TODO(F3): Don't understand parameter semantics of
|
||||
// GetTextOutlines()
|
||||
::PolyPolygon aResultingVCLPolyPolygon;
|
||||
PolyPolyVector aVCLPolyPolyVector;
|
||||
::basegfx::B2DPolyPolygon aResultingPolyPolygon;
|
||||
PolyPolyVector aVCLPolyPolyVector;
|
||||
const bool bHaveOutlines( rVDev.GetTextOutlines( aVCLPolyPolyVector, rText,
|
||||
static_cast<USHORT>(nStartPos),
|
||||
static_cast<USHORT>(nStartPos),
|
||||
@@ -1994,67 +2000,44 @@ namespace cppcanvas
|
||||
// first glyph starts at polygon index 0
|
||||
aPolygonGlyphMap.push_back( 0 );
|
||||
|
||||
// temporarily remove offsetting from mapmode
|
||||
// (outline polygons must stay at origin, only
|
||||
// need to be scaled)
|
||||
const ::MapMode aOldMapMode( rVDev.GetMapMode() );
|
||||
|
||||
::MapMode aScaleOnlyMapMode( aOldMapMode );
|
||||
aScaleOnlyMapMode.SetOrigin( ::Point() );
|
||||
rVDev.SetMapMode( aScaleOnlyMapMode );
|
||||
// remove offsetting from mapmode transformation
|
||||
// (outline polygons must stay at origin, only need to
|
||||
// be scaled)
|
||||
::basegfx::B2DHomMatrix aMapModeTransform(
|
||||
rState.mapModeTransform );
|
||||
aMapModeTransform.set(0,2, 0.0);
|
||||
aMapModeTransform.set(1,2, 0.0);
|
||||
|
||||
PolyPolyVector::const_iterator aIter( aVCLPolyPolyVector.begin() );
|
||||
const PolyPolyVector::const_iterator aEnd( aVCLPolyPolyVector.end() );
|
||||
for( ; aIter!= aEnd; ++aIter )
|
||||
{
|
||||
::PolyPolygon aVCLPolyPolygon;
|
||||
::basegfx::B2DPolyPolygon aPolyPolygon;
|
||||
|
||||
aVCLPolyPolygon = rVDev.LogicToPixel( *aIter );
|
||||
aPolyPolygon = aIter->getB2DPolyPolygon();
|
||||
aPolyPolygon.transform( aMapModeTransform );
|
||||
|
||||
// append result to collecting polypoly
|
||||
for( USHORT i=0; i<aVCLPolyPolygon.Count(); ++i )
|
||||
for( sal_uInt32 i=0; i<aPolyPolygon.count(); ++i )
|
||||
{
|
||||
// #i47795# Ensure closed polygons (since
|
||||
// FreeType returns the glyph outlines
|
||||
// open)
|
||||
const ::Polygon& rPoly( aVCLPolyPolygon.GetObject( i ) );
|
||||
const USHORT nCount( rPoly.GetSize() );
|
||||
const ::basegfx::B2DPolygon& rPoly( aPolyPolygon.getB2DPolygon( i ) );
|
||||
const sal_uInt32 nCount( rPoly.count() );
|
||||
if( nCount<3 ||
|
||||
rPoly[0] == rPoly[nCount-1] )
|
||||
rPoly.isClosed() )
|
||||
{
|
||||
// polygon either degenerate, or
|
||||
// already closed.
|
||||
aResultingVCLPolyPolygon.Insert( rPoly );
|
||||
aResultingPolyPolygon.append( rPoly );
|
||||
}
|
||||
else
|
||||
{
|
||||
::Polygon aPoly(nCount+1);
|
||||
::basegfx::B2DPolygon aPoly(rPoly);
|
||||
aPoly.setClosed(true);
|
||||
|
||||
// close polygon explicitely
|
||||
if( rPoly.HasFlags() )
|
||||
{
|
||||
for( USHORT j=0; j<nCount; ++j )
|
||||
{
|
||||
aPoly[j] = rPoly[j];
|
||||
aPoly.SetFlags(j, rPoly.GetFlags(j));
|
||||
}
|
||||
|
||||
// duplicate first point
|
||||
aPoly[nCount] = rPoly[0];
|
||||
aPoly.SetFlags(nCount, POLY_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
for( USHORT j=0; j<nCount; ++j )
|
||||
{
|
||||
aPoly[j] = rPoly[j];
|
||||
}
|
||||
|
||||
// duplicate first point
|
||||
aPoly[nCount] = rPoly[0];
|
||||
}
|
||||
|
||||
aResultingVCLPolyPolygon.Insert( aPoly );
|
||||
aResultingPolyPolygon.append( aPoly );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2062,24 +2045,22 @@ namespace cppcanvas
|
||||
// GetTextOutlines(), this here is wrong!
|
||||
|
||||
// calc next glyph index
|
||||
aPolygonGlyphMap.push_back( aResultingVCLPolyPolygon.Count() );
|
||||
aPolygonGlyphMap.push_back( aResultingPolyPolygon.count() );
|
||||
}
|
||||
|
||||
rVDev.SetMapMode( aOldMapMode );
|
||||
|
||||
const uno::Sequence< double > aCharWidthSeq(
|
||||
pDXArray ?
|
||||
setupDXArray( pDXArray, nLen, rVDev ) :
|
||||
setupDXArray( pDXArray, nLen, rState ) :
|
||||
setupDXArray( rText,
|
||||
nStartPos,
|
||||
nLen,
|
||||
rVDev ) );
|
||||
rVDev,
|
||||
rState ));
|
||||
const uno::Reference< rendering::XPolyPolygon2D > xTextPoly(
|
||||
::vcl::unotools::xPolyPolygonFromPolyPolygon(
|
||||
::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
|
||||
rCanvas->getUNOCanvas()->getDevice(),
|
||||
aResultingVCLPolyPolygon ) );
|
||||
aResultingPolyPolygon ) );
|
||||
|
||||
::Point aEmptyPoint;
|
||||
if( rParms.maTextTransformation.isValid() )
|
||||
{
|
||||
return ActionSharedPtr(
|
||||
@@ -2089,7 +2070,7 @@ namespace cppcanvas
|
||||
rReliefColor,
|
||||
rShadowOffset,
|
||||
rShadowColor,
|
||||
aResultingVCLPolyPolygon.GetBoundRect(),
|
||||
::basegfx::tools::getRange(aResultingPolyPolygon),
|
||||
xTextPoly,
|
||||
aPolygonGlyphMap,
|
||||
aCharWidthSeq,
|
||||
@@ -2107,7 +2088,7 @@ namespace cppcanvas
|
||||
rReliefColor,
|
||||
rShadowOffset,
|
||||
rShadowColor,
|
||||
aResultingVCLPolyPolygon.GetBoundRect(),
|
||||
::basegfx::tools::getRange(aResultingPolyPolygon),
|
||||
xTextPoly,
|
||||
aPolygonGlyphMap,
|
||||
aCharWidthSeq,
|
||||
@@ -2139,12 +2120,17 @@ namespace cppcanvas
|
||||
{
|
||||
const ::Size aBaselineOffset( tools::getBaselineOffset( rState,
|
||||
rVDev ) );
|
||||
const ::Point aStartPoint( rVDev.LogicToPixel(
|
||||
::Point(
|
||||
rStartPoint.X() + aBaselineOffset.Width(),
|
||||
rStartPoint.Y() + aBaselineOffset.Height() ) ) );
|
||||
const ::Size aReliefOffset( rVDev.LogicToPixel( rReliefOffset ) );
|
||||
const ::Size aShadowOffset( rVDev.LogicToPixel( rShadowOffset ) );
|
||||
// #143885# maintain (nearly) full precision positioning,
|
||||
// by circumventing integer-based OutDev-mapping
|
||||
const ::basegfx::B2DPoint aStartPoint(
|
||||
rState.mapModeTransform *
|
||||
::basegfx::B2DPoint(rStartPoint.X() + aBaselineOffset.Width(),
|
||||
rStartPoint.Y() + aBaselineOffset.Height()) );
|
||||
|
||||
const ::basegfx::B2DSize aReliefOffset(
|
||||
rState.mapModeTransform * ::vcl::unotools::b2DSizeFromSize( rReliefOffset ) );
|
||||
const ::basegfx::B2DSize aShadowOffset(
|
||||
rState.mapModeTransform * ::vcl::unotools::b2DSizeFromSize( rShadowOffset ) );
|
||||
|
||||
if( rState.isTextOutlineModeSet )
|
||||
{
|
||||
@@ -2168,11 +2154,12 @@ namespace cppcanvas
|
||||
// create it in the first place, if pDXArray is NULL)
|
||||
const uno::Sequence< double > aCharWidths(
|
||||
pDXArray ?
|
||||
setupDXArray( pDXArray, nLen, rVDev ) :
|
||||
setupDXArray( pDXArray, nLen, rState ) :
|
||||
setupDXArray( rText,
|
||||
nStartPos,
|
||||
nLen,
|
||||
rVDev ) );
|
||||
rVDev,
|
||||
rState ));
|
||||
|
||||
// determine type of text action to create
|
||||
// =======================================
|
||||
|
Reference in New Issue
Block a user