summaryrefslogtreecommitdiff
path: root/canvas
diff options
context:
space:
mode:
authorOliver Bolte <obo@openoffice.org>2005-04-18 08:11:25 +0000
committerOliver Bolte <obo@openoffice.org>2005-04-18 08:11:25 +0000
commitda63ef866b4b3eb6f58d644f1e60a7cd6a732f5a (patch)
tree3a3466976128afd96d4e8f701f95f5b6a7d6b6ae /canvas
parentc9706acf976e5834955619b5048368ee1a724e90 (diff)
INTEGRATION: CWS presfixes03 (1.5.2); FILE MERGED
2005/04/12 03:21:23 thb 1.5.2.2: #i44807# Added preliminary version for VCL canvas transformed sprites (taking the slow Set/GetPixel affine transformater from impltools for the time being) 2005/04/01 15:48:09 thb 1.5.2.1: #i36190#, #i37793#, #i39245#, #i46023# Fixes for open/close polygon stroking; beefed up the canvas tools; moved try/catch block around configuration in cf_factory (to facilitate canvasdemo with broken/incomplete services.rdb; enhanced TextLayout to cope with new Action::getBounds() functionality in cppcanvas (needed for proper mtf bounds calculation); removed extra pixel right and bottom for filled polygons; avoiding uno::Sequence::operator[] for non-const cases, but using the naked mem ptr instead (performance)
Diffstat (limited to 'canvas')
-rw-r--r--canvas/source/vcl/impltools.cxx70
1 files changed, 47 insertions, 23 deletions
diff --git a/canvas/source/vcl/impltools.cxx b/canvas/source/vcl/impltools.cxx
index c3dbcc3f443b..ce48cf9827a9 100644
--- a/canvas/source/vcl/impltools.cxx
+++ b/canvas/source/vcl/impltools.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: impltools.cxx,v $
*
- * $Revision: 1.5 $
+ * $Revision: 1.6 $
*
- * last change: $Author: rt $ $Date: 2005-03-30 07:37:42 $
+ * last change: $Author: obo $ $Date: 2005-04-18 09:11:25 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -158,25 +158,49 @@ namespace vclcanvas
{
::basegfx::B2DPolyPolygon polyPolygonFromXPolyPolygon2D( const uno::Reference< rendering::XPolyPolygon2D >& xPoly )
{
- uno::Reference< lang::XServiceInfo > xRef( xPoly,
- uno::UNO_QUERY );
+ LinePolyPolygon* pPolyImpl = dynamic_cast< LinePolyPolygon* >( xPoly.get() );
- if( xRef.is() &&
- xRef->getImplementationName().equals( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(LINEPOLYPOLYGON_IMPLEMENTATION_NAME))) )
+ if( pPolyImpl )
{
- // TODO(Q1): Maybe use dynamic_cast here
-
- // TODO(F1): Provide true beziers here!
- return static_cast<LinePolyPolygon*>(xPoly.get())->getPolyPolygon();
+ return pPolyImpl->getPolyPolygon();
}
else
{
- // TODO(F1): extract points from polygon interface
- ENSURE_AND_THROW( false,
- "polyPolygonFromXPolyPolygon2D(): could not extract points" );
- }
+ const sal_Int32 nPolys( xPoly->getNumberOfPolygons() );
+
+ // not a known implementation object - try data source
+ // interfaces
+ uno::Reference< rendering::XBezierPolyPolygon2D > xBezierPoly(
+ xPoly,
+ uno::UNO_QUERY );
- return ::basegfx::B2DPolyPolygon();
+ if( xBezierPoly.is() )
+ {
+ return ::basegfx::unotools::polyPolygonFromBezier2DSequenceSequence(
+ xBezierPoly->getBezierSegments( 0,
+ nPolys,
+ 0,
+ -1 ) );
+ }
+ else
+ {
+ uno::Reference< rendering::XLinePolyPolygon2D > xLinePoly(
+ xPoly,
+ uno::UNO_QUERY );
+
+ // no implementation class and no data provider
+ // found - contract violation.
+ CHECK_AND_THROW( xLinePoly.is(),
+ "VCLCanvas::polyPolygonFromXPolyPolygon2D(): Invalid input "
+ "poly-polygon, cannot retrieve vertex data" );
+
+ return ::basegfx::unotools::polyPolygonFromPoint2DSequenceSequence(
+ xLinePoly->getPoints( 0,
+ nPolys,
+ 0,
+ -1 ) );
+ }
+ }
}
::BitmapEx bitmapExFromXBitmap( const uno::Reference< rendering::XBitmap >& xBitmap )
@@ -372,11 +396,11 @@ namespace vclcanvas
bool bCopyBack( false );
// calc effective transformation for bitmap
+ const ::basegfx::B2DRectangle aSrcRect( 0, 0,
+ aBmpSize.Width(),
+ aBmpSize.Height() );
::canvas::tools::calcTransformedRectBounds( aDestRect,
- ::basegfx::B2DRectangle(0,
- 0,
- aBmpSize.Width(),
- aBmpSize.Height()),
+ aSrcRect,
rTransform );
// re-center bitmap, such that it's left, top border is
@@ -385,7 +409,7 @@ namespace vclcanvas
// this rectangle unscaled to the origin.
::basegfx::B2DHomMatrix aLocalTransform;
::canvas::tools::calcRectToOriginTransform( aLocalTransform,
- aDestRect,
+ aSrcRect,
rTransform );
const bool bModulateColors( eModulationMode == MODULATE_WITH_DEVICECOLOR &&
@@ -451,8 +475,8 @@ namespace vclcanvas
}
// else: mapping table is not used
- const Size aDestBmpSize( ::basegfx::fround( aDestRect.getMaxX() ),
- ::basegfx::fround( aDestRect.getMaxY() ) );
+ const Size aDestBmpSize( ::basegfx::fround( aDestRect.getWidth() ),
+ ::basegfx::fround( aDestRect.getHeight() ) );
if( aDestBmpSize.Width() == 0 || aDestBmpSize.Height() == 0 )
return BitmapEx();
@@ -479,7 +503,7 @@ namespace vclcanvas
// we're doing inverse mapping here, i.e. mapping
// points from the destination bitmap back to the
// source
- ::basegfx::B2DHomMatrix aTransform( rTransform );
+ ::basegfx::B2DHomMatrix aTransform( aLocalTransform );
aTransform.invert();
// for the time being, always read as ARGB