summaryrefslogtreecommitdiff
path: root/cppcanvas
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2005-09-23 13:30:27 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2005-09-23 13:30:27 +0000
commit5a4a42e63eaadea498bbdb0e0f1ef3d2558298b9 (patch)
tree4112948d0a972525bc4e37b612fa5b0218c7d57a /cppcanvas
parent7ac00ce9ed3c290c478b4b89126f5a025adf4296 (diff)
INTEGRATION: CWS thb09 (1.10.8); FILE MERGED
2005/08/22 17:01:30 thb 1.10.8.4: #i52608# VCL rect clips always include one pixel more to the right and the bottom - correctly converting to polygon now. 2005/08/22 16:59:52 thb 1.10.8.3: #i52608# Always setting up font matrix, also if mapmode scales anisotrophically 2005/08/22 16:58:55 thb 1.10.8.2: #i51558# Correctly scaling EPS action, when rendering to XCanvas 2005/08/22 16:48:15 thb 1.10.8.1: #i47157# Implementing TEXTRECT meta action
Diffstat (limited to 'cppcanvas')
-rw-r--r--cppcanvas/source/mtfrenderer/implrenderer.cxx170
1 files changed, 117 insertions, 53 deletions
diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx
index 8e9811e2a0e6..133d2fbf2678 100644
--- a/cppcanvas/source/mtfrenderer/implrenderer.cxx
+++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: implrenderer.cxx,v $
*
- * $Revision: 1.11 $
+ * $Revision: 1.12 $
*
- * last change: $Author: rt $ $Date: 2005-09-08 08:18:25 $
+ * last change: $Author: hr $ $Date: 2005-09-23 14:30:27 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -881,10 +881,6 @@ namespace cppcanvas
rParms.maFontLetterForm.getValue() :
(rFont.GetItalic() == ITALIC_NONE) ? 0 : 9;
- // TODO(F2): use correct scale direction, font
- // height might be width or anything else
- aFontRequest.CellSize = rVDev.LogicToPixel( rFont.GetSize() ).Height();
-
// setup state-local text transformation,
// if the font be rotated
const short nFontAngle( rFont.GetOrientation() );
@@ -902,18 +898,41 @@ namespace cppcanvas
geometry::Matrix2D aFontMatrix;
::canvas::tools::setIdentityMatrix2D( aFontMatrix );
- // check if the font is stretched or squeezed
- long nFontWidth = rFont.GetSize().Width();
- if( nFontWidth != 0 )
+ // TODO(F2): use correct scale direction, font
+ // height might be width or anything else
+ const ::Size rFontSizeLog( rFont.GetSize() );
+ const sal_Int32 nFontWidthLog = rFontSizeLog.Width();
+ if( nFontWidthLog != 0 )
{
::Font aTestFont = rFont;
aTestFont.SetWidth( 0 );
- int nNormalWidth = rVDev.GetFontMetric( aTestFont ).GetWidth();
- if( nNormalWidth != nFontWidth )
+ sal_Int32 nNormalWidth = rVDev.GetFontMetric( aTestFont ).GetWidth();
+ if( nNormalWidth != nFontWidthLog )
if( nNormalWidth )
- aFontMatrix.m00 = (double)nFontWidth / nNormalWidth;
+ aFontMatrix.m00 = (double)nFontWidthLog / nNormalWidth;
+ }
+
+ // #i52608# apply map mode scale also to font matrix - an
+ // anisotrophic mapmode must be reflected in an
+ // anisotrophic font matrix scale.
+ const ::Size& rScale10000(
+ rVDev.LogicToPixel( Size(100000L,
+ 100000L) ) );
+ const sal_Int32 nWidth( rScale10000.Width() );
+ const sal_Int32 nHeight( rScale10000.Height() );
+ if( nWidth != nHeight )
+ {
+ // note: no reason to check for division by zero, we
+ // always have the value closer (or equal) to zero as
+ // the nominator.
+ if( abs(nWidth) < abs(nHeight) )
+ aFontMatrix.m00 *= (double)nWidth / nHeight;
+ else
+ aFontMatrix.m11 *= (double)nHeight / nWidth;
}
+ aFontRequest.CellSize = rVDev.LogicToPixel( rFontSizeLog ).Height();
+
return rCanvas->getUNOCanvas()->createFont( aFontRequest,
uno::Sequence< beans::PropertyValue >(),
aFontMatrix );
@@ -1054,10 +1073,13 @@ namespace cppcanvas
// to general polygon clipping here.
rState.clip = ::basegfx::B2DPolyPolygon(
::basegfx::tools::createPolygonFromRect(
+ // #121100# VCL rectangular clips always
+ // include one more pixel to the right
+ // and the bottom
::basegfx::B2DRectangle( rState.clipRect.Left(),
rState.clipRect.Top(),
- rState.clipRect.Right(),
- rState.clipRect.Bottom() ) ) );
+ rState.clipRect.Right()+1,
+ rState.clipRect.Bottom()+1 ) ) );
}
rState.clip = ::basegfx::tools::correctOrientations( rState.clip );
@@ -1089,10 +1111,13 @@ namespace cppcanvas
rCanvas->getUNOCanvas()->getDevice(),
::basegfx::B2DPolyPolygon(
::basegfx::tools::createPolygonFromRect(
+ // #121100# VCL rectangular clips
+ // always include one more pixel to
+ // the right and the bottom
::basegfx::B2DRectangle( rState.clipRect.Left(),
rState.clipRect.Top(),
- rState.clipRect.Right(),
- rState.clipRect.Bottom() ) ) ) );
+ rState.clipRect.Right()+1,
+ rState.clipRect.Bottom()+1 ) ) ) );
}
}
else
@@ -1171,10 +1196,13 @@ namespace cppcanvas
rCanvas->getUNOCanvas()->getDevice(),
::basegfx::B2DPolyPolygon(
::basegfx::tools::createPolygonFromRect(
+ // #121100# VCL rectangular clips
+ // always include one more pixel to
+ // the right and the bottom
::basegfx::B2DRectangle( rState.clipRect.Left(),
rState.clipRect.Top(),
- rState.clipRect.Right(),
- rState.clipRect.Bottom() ) ) ) );
+ rState.clipRect.Right()+1,
+ rState.clipRect.Bottom()+1 ) ) ) );
}
}
else
@@ -1196,7 +1224,6 @@ namespace cppcanvas
/* TODO(P2): interpret mtf-comments
================================
- - bitmap fillings (do that via comments)
- gradient fillings (do that via comments)
- think about mapping. _If_ we do everything in logical
@@ -1530,36 +1557,46 @@ namespace cppcanvas
case META_EPS_ACTION:
{
MetaEPSAction* pAct = static_cast<MetaEPSAction*>(pCurrAct);
- const GDIMetaFile& pSubstitute = pAct->GetSubstitute();
-
- const Size aMtfSizePix( rVDev.LogicToPixel( pSubstitute.GetPrefSize(),
- pSubstitute.GetPrefMapMode() ) );
+ const GDIMetaFile& rSubstitute = pAct->GetSubstitute();
+
+ const Size aMtfSize( rSubstitute.GetPrefSize() );
+ const Size aMtfSizePixPre( rVDev.LogicToPixel( aMtfSize,
+ rSubstitute.GetPrefMapMode() ) );
+
+ // #i44110# correct null-sized output - there
+ // are metafiles which have zero size in at
+ // least one dimension
+ const Size aMtfSizePix( ::std::max( aMtfSizePixPre.Width(), 1L ),
+ ::std::max( aMtfSizePixPre.Height(), 1L ) );
+
+ const Point aEmptyPt;
+ const Point aMtfOriginPix( rVDev.LogicToPixel( aEmptyPt,
+ rSubstitute.GetPrefMapMode() ) );
+
+ // Setup local transform, such that the
+ // metafile renders itself into the given
+ // output rectangle
+ pushState( rStates, PUSH_ALL );
+
+ const ::Point& rPos( rVDev.LogicToPixel( pAct->GetPoint() ) );
+ const ::Size& rSize( rVDev.LogicToPixel( pAct->GetSize() ) );
+
+ getState( rStates ).transform.translate( rPos.X(),
+ rPos.Y() );
+ getState( rStates ).transform.scale( (double)rSize.Width() / aMtfSizePix.Width(),
+ (double)rSize.Height() / aMtfSizePix.Height() );
+
+ rVDev.Push();
+ rVDev.SetMapMode( rSubstitute.GetPrefMapMode() );
+
+ createActions( rCanvas, rVDev,
+ const_cast<GDIMetaFile&>(pAct->GetSubstitute()),
+ rStates, rParms,
+ bSubsettableActions,
+ io_rCurrActionIndex );
- // skip null-sized output
- if( aMtfSizePix.Width() != 0 &&
- aMtfSizePix.Height() != 0 )
- {
- const Point aEmptyPt;
- const Point aMtfOriginPix( rVDev.LogicToPixel( aEmptyPt,
- pSubstitute.GetPrefMapMode() ) );
-
- // Setup local transform, such that the
- // metafile renders itself into the given
- // output rectangle
- pushState( rStates, PUSH_ALL );
-
- getState( rStates ).transform.translate( -aMtfOriginPix.X(), -aMtfOriginPix.Y() );
- getState( rStates ).transform.scale( 1.0 / aMtfSizePix.Width(),
- 1.0 / aMtfSizePix.Height() );
-
- createActions( rCanvas, rVDev,
- const_cast<GDIMetaFile&>(pAct->GetSubstitute()),
- rStates, rParms,
- bSubsettableActions,
- io_rCurrActionIndex );
-
- popState( rStates );
- }
+ rVDev.Pop();
+ popState( rStates );
}
break;
@@ -1850,12 +1887,22 @@ namespace cppcanvas
break;
case META_RECT_ACTION:
+ {
+ Rectangle aPixelRect(
+ rVDev.LogicToPixel( static_cast<MetaRectAction*>(pCurrAct)->GetRect() ) );
+
+ // #121100# OutputDevice::DrawRect() fills
+ // rectangles Apple-like, i.e. with one
+ // additional pixel to the right and bottom.
+ aPixelRect.setWidth( aPixelRect.getWidth()+1 );
+ aPixelRect.setHeight( aPixelRect.getHeight()+1 );
+
createFillAndStroke( ::PolyPolygon(
- ::Polygon(
- rVDev.LogicToPixel( static_cast<MetaRectAction*>(pCurrAct)->GetRect() ) ) ),
+ ::Polygon( aPixelRect ) ),
rCanvas, io_rCurrActionIndex,
rStates );
break;
+ }
case META_ROUNDRECT_ACTION:
createFillAndStroke( rVDev.LogicToPixel( Polygon( static_cast<MetaRoundRectAction*>(pCurrAct)->GetRect(),
@@ -2387,10 +2434,27 @@ namespace cppcanvas
break;
case META_TEXTRECT_ACTION:
- // TODO(F2): NYI
- OSL_ENSURE( false,
- "META_TEXTRECT not yet supported" );
+ {
+ MetaTextRectAction* pAct = static_cast<MetaTextRectAction*>(pCurrAct);
+
+ pushState( rStates, PUSH_ALL );
+
+ // use the VDev to break up the text rect
+ // action into readily formatted lines
+ GDIMetaFile aTmpMtf;
+ rVDev.AddTextRectActions( pAct->GetRect(),
+ pAct->GetText(),
+ pAct->GetStyle(),
+ aTmpMtf );
+
+ createActions( rCanvas, rVDev, aTmpMtf, rStates,
+ rParms, bSubsettableActions,
+ io_rCurrActionIndex );
+
+ popState( rStates );
+
break;
+ }
case META_STRETCHTEXT_ACTION:
{