blob: a1cd62192d4a6dc384e2ea7ad77b8373ebe285c9 [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_filter.hxx"
#include <main.hxx>
#include <chart.hxx>
#include <outact.hxx>
#include <math.h>
using namespace ::com::sun::star;
double CGM::ImplGetOrientation( FloatPoint& rCenter, FloatPoint& rPoint )
{
double fOrientation;
double nX = rPoint.X - rCenter.X;
double nY = rPoint.Y - rCenter.Y;
fOrientation = acos( nX / sqrt( nX * nX + nY * nY ) ) * 57.29577951308;
if ( nY > 0 )
fOrientation = 360 - fOrientation;
return fOrientation;
}
// ---------------------------------------------------------------
void CGM::ImplSwitchStartEndAngle( double& rStartAngle, double& rEndAngle )
{
double nTemp;
nTemp = rStartAngle;
rStartAngle = rEndAngle;
rEndAngle = nTemp;
}
// ---------------------------------------------------------------
void CGM::ImplGetVector( double* pVector )
{
if ( pElement->eVDCType == VDC_REAL )
{
for ( sal_uInt32 i = 0; i < 4; i++ )
{
pVector[ i ] = (double)ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
}
}
else
{
for ( sal_uInt32 i = 0; i < 4; i++ )
{
pVector[ i ] = (double)ImplGetI( pElement->nVDCIntegerPrecision );
}
}
pVector[ 0 ] *= mnVDCXmul;
pVector[ 2 ] *= mnVDCXmul;
pVector[ 1 ] *= mnVDCYmul;
pVector[ 3 ] *= mnVDCYmul;
}
// ---------------------------------------------------------------
sal_Bool CGM::ImplGetEllipse( FloatPoint& rCenter, FloatPoint& rRadius, double& rAngle )
{
FloatPoint aPoint1, aPoint2;
double fRot1, fRot2;
ImplGetPoint( rCenter, sal_True );
ImplGetPoint( aPoint1, sal_True );
ImplGetPoint( aPoint2, sal_True );
fRot1 = ImplGetOrientation( rCenter, aPoint1 );
fRot2 = ImplGetOrientation( rCenter, aPoint2 );
rAngle = ImplGetOrientation( rCenter, aPoint1 );
aPoint1.X -= rCenter.X;
aPoint1.Y -= rCenter.Y;
rRadius.X = sqrt( aPoint1.X * aPoint1.X + aPoint1.Y * aPoint1.Y );
aPoint2.X -= rCenter.X;
aPoint2.Y -= rCenter.Y;
rRadius.Y = sqrt( aPoint2.X * aPoint2.X + aPoint2.Y * aPoint2.Y );
if ( fRot1 > fRot2 )
{
if ( ( fRot1 - fRot2 ) < 180 )
return sal_False;
}
else
{
if ( ( fRot2 - fRot1 ) > 180 )
return sal_False;
}
return sal_True;
}
void CGM::ImplDoClass4()
{
if ( mbFirstOutPut )
mpOutAct->FirstOutPut();
if ( mpBitmapInUse && ( mnElementID != 9 ) ) // vorhandene grafik verarbeiten,
{ // da jetzt nicht bitmap actions anstehen
CGMBitmapDescriptor* pBmpDesc = mpBitmapInUse->GetBitmap();
// irgendetwas mit der Bitmap anfangen
mpOutAct->DrawBitmap( pBmpDesc );
delete mpBitmapInUse;
mpBitmapInUse = NULL;
}
if ( ( mpChart == NULL ) || mpChart->IsAnnotation() )
{
switch ( mnElementID )
{
case 0x01 : ComOut( CGM_LEVEL1, "PolyLine" )
{
sal_uInt32 nPoints = mnElementSize / ImplGetPointSize();
Polygon aPolygon( (sal_uInt16)nPoints );
for ( sal_uInt16 i = 0; i < nPoints; i++)
{
FloatPoint aFloatPoint;
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point( (long)aFloatPoint.X, (long)aFloatPoint.Y ), i );
}
if ( mbFigure )
mpOutAct->RegPolyLine( aPolygon );
else
mpOutAct->DrawPolyLine( aPolygon );
}
break;
case 0x02 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Disjoint PolyLine" )
{
sal_uInt16 nPoints = sal::static_int_cast< sal_uInt16 >(
mnElementSize / ImplGetPointSize());
if ( ! ( nPoints & 1 ) )
{
nPoints >>= 1;
FloatPoint aFloatPoint;
if ( mbFigure )
{
Polygon aPolygon( nPoints );
for ( sal_uInt16 i = 0; i < nPoints; i++ )
{
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point( (long)aFloatPoint.X, (long)aFloatPoint.Y ), 0 );
}
mpOutAct->RegPolyLine( aPolygon );
}
else
{
mpOutAct->BeginGroup();
Polygon aPolygon( (sal_uInt16)2 );
for ( sal_uInt16 i = 0; i < nPoints; i++ )
{
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point( (long)aFloatPoint.X, (long)aFloatPoint.Y ), 0 );
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point( (long)aFloatPoint.X, (long)aFloatPoint.Y ), 1);
mpOutAct->DrawPolyLine( aPolygon );
}
mpOutAct->EndGroup();
}
}
}
break;
case 0x03 : ComOut( CGM_LEVEL1, "PolyMarker" ) break;
case 0x04 : ComOut( CGM_LEVEL1, "Text" )
{
FloatPoint aFloatPoint;
sal_uInt32 nType, nSize;
if ( mbFigure )
mpOutAct->CloseRegion();
ImplGetPoint ( aFloatPoint, sal_True );
nType = ImplGetUI16( 4 );
nSize = ImplGetUI( 1 );
mpSource[ mnParaSize + nSize ] = 0;
ComOut( CGM_DESCRIPTION, (char*)mpSource + mnParaSize );
awt::Size aSize;
awt::Point aPoint( (long)aFloatPoint.X, (long)aFloatPoint.Y );
mpOutAct->DrawText( aPoint, aSize,
(char*)mpSource + mnParaSize, nSize, (FinalFlag)nType );
// mnParaSize += nSize;
mnParaSize = mnElementSize;
}
break;
case 0x05 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Restricted Text" )
{
double dx, dy;
FloatPoint aFloatPoint;
sal_uInt32 nType, nSize;
if ( mbFigure )
mpOutAct->CloseRegion();
if ( pElement->eVDCType == VDC_REAL )
{
dx = ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
dy = ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
}
else
{
dx = (double)ImplGetI( pElement->nVDCIntegerPrecision );
dy = (double)ImplGetI( pElement->nVDCIntegerPrecision );
}
ImplMapDouble( dx );
ImplMapDouble( dy );
ImplGetPoint ( aFloatPoint, sal_True );
nType = ImplGetUI16( 4 );
nSize = ImplGetUI( 1 );
mpSource[ mnParaSize + nSize ] = 0;
ComOut( CGM_DESCRIPTION, (char*)mpSource + mnParaSize );
awt::Point aPoint( (long)aFloatPoint.X, (long)aFloatPoint.Y );
awt::Size aSize((long)dx, (long)dy);
mpOutAct->DrawText( aPoint, aSize ,
(char*)mpSource + mnParaSize, nSize, (FinalFlag)nType );
// mnParaSize += nSize;
mnParaSize = mnElementSize;
}
break;
case 0x06 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Append Text" )
{
sal_uInt32 nSize;
sal_uInt32 nType = ImplGetUI16( 4 );
nSize = ImplGetUI( 1 );
mpSource[ mnParaSize + nSize ] = 0;
ComOut( CGM_DESCRIPTION, (char*)mpSource + mnParaSize );
mpOutAct->AppendText( (char*)mpSource + mnParaSize, nSize, (FinalFlag)nType );
// mnParaSize += nSize;
mnParaSize = mnElementSize;
}
break;
case 0x07 : ComOut( CGM_LEVEL1, "Polygon" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
sal_uInt16 nPoints = sal::static_int_cast< sal_uInt16 >(
mnElementSize / ImplGetPointSize());
Polygon aPolygon( nPoints );
for ( sal_uInt16 i = 0; i < nPoints; i++)
{
FloatPoint aFloatPoint;
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point ( (long)( aFloatPoint.X ), (long)( aFloatPoint.Y ) ), i );
}
mpOutAct->DrawPolygon( aPolygon );
}
break;
case 0x08 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Polygon Set" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
sal_uInt16 nPoints = 0;
Point* pPoints = new Point[ 0x4000 ];
PolyPolygon aPolyPolygon;
FloatPoint aFloatPoint;
sal_uInt32 nEdgeFlag;
while ( mnParaSize < mnElementSize )
{
ImplGetPoint( aFloatPoint, sal_True );
nEdgeFlag = ImplGetUI16();
pPoints[ nPoints++ ] = Point( (long)aFloatPoint.X, (long)aFloatPoint.Y );
if ( ( nEdgeFlag & 2 ) || ( mnParaSize == mnElementSize ) )
{
Polygon aPolygon( nPoints );
for ( sal_uInt16 i = 0; i < nPoints; i++ )
{
aPolygon.SetPoint( pPoints[ i ], i );
}
aPolyPolygon.Insert( aPolygon, POLYPOLY_APPEND );
nPoints = 0;
}
}
delete[] pPoints;
mpOutAct->DrawPolyPolygon( aPolyPolygon );
}
break;
case 0x09 : ComOut( CGM_LEVEL1, "Cell Array" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
if ( mpBitmapInUse )
{
CGMBitmap* pBmpDesc = mpBitmapInUse->GetNext();
if ( pBmpDesc ) // eventuell bekommen wir eine bitmap zurück, die nicht
{ // zur vorherigen paßt -> diese müssen wir dann auch löschen
mpOutAct->DrawBitmap( pBmpDesc->GetBitmap() );
delete pBmpDesc;
}
}
else
{
mpBitmapInUse = new CGMBitmap( *this );
}
}
break;
case 0x0a : ComOut( CGM_LEVEL1, "Generalized Drawing Primitive" )
{
ImplGetI( pElement->nIntegerPrecision ); //-Wall is this needed
ImplGetUI( pElement->nIntegerPrecision ); //-Wall is this needed
mnParaSize = mnElementSize;
}
break;
case 0x0b : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Rectangle" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
FloatRect aFloatRect;
ImplGetRectangle( aFloatRect, sal_True );
mpOutAct->DrawRectangle( aFloatRect );
}
break;
case 0x0c : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Circle" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
double fRotation = 0;
FloatPoint aCenter, aRadius;
ImplGetPoint( aCenter, sal_True );
if ( pElement->eVDCType == VDC_REAL )
aRadius.X = ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
else
aRadius.X = (double)ImplGetI( pElement->nVDCIntegerPrecision );
ImplMapDouble( aRadius.X );
aRadius.Y = aRadius.X;
mpOutAct->DrawEllipse( aCenter, aRadius, fRotation );
}
break;
case 0x0d : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Circular Arc 3 Point" )
{
int nSwitch = 0;
FloatPoint aStartingPoint, aIntermediatePoint, aEndingPoint, aCenterPoint;
ImplGetPoint( aStartingPoint, sal_True );
ImplGetPoint( aIntermediatePoint, sal_True );
ImplGetPoint( aEndingPoint, sal_True );
double fA = aIntermediatePoint.X - aStartingPoint.X;
double fB = aIntermediatePoint.Y - aStartingPoint.Y;
double fC = aEndingPoint.X - aStartingPoint.X;
double fD = aEndingPoint.Y - aStartingPoint.Y;
double fE = fA * ( aStartingPoint.X + aIntermediatePoint.X ) + fB * ( aStartingPoint.Y + aIntermediatePoint.Y );
double fF = fC * ( aStartingPoint.X + aEndingPoint.X ) + fD * ( aStartingPoint.Y + aEndingPoint.Y );
double fG = 2.0 * ( fA * ( aEndingPoint.Y - aIntermediatePoint.Y ) - fB * ( aEndingPoint.X - aIntermediatePoint.X ) );
aCenterPoint.X = ( fD * fE - fB * fF ) / fG;
aCenterPoint.Y = ( fA * fF - fC * fE ) / fG;
if ( fG != 0 )
{
double fStartAngle = ImplGetOrientation( aCenterPoint, aStartingPoint );
double fInterAngle = ImplGetOrientation( aCenterPoint, aIntermediatePoint );
double fEndAngle = ImplGetOrientation( aCenterPoint, aEndingPoint );
if ( fStartAngle > fEndAngle )
{
nSwitch ^=1;
aIntermediatePoint = aEndingPoint;
aEndingPoint = aStartingPoint;
aStartingPoint = aIntermediatePoint;
fG = fStartAngle;
fStartAngle = fEndAngle;
fEndAngle = fG;
}
if ( ! ( fInterAngle > fStartAngle ) && ( fInterAngle < fEndAngle ) )
{
nSwitch ^=1;
aIntermediatePoint = aEndingPoint;
aEndingPoint = aStartingPoint;
aStartingPoint = aIntermediatePoint;
fG = fStartAngle;
fStartAngle = fEndAngle;
fEndAngle = fG;
}
double fRadius = sqrt( pow( ( aStartingPoint.X - aCenterPoint.X ), 2 ) + pow( ( aStartingPoint.Y - aCenterPoint.Y ), 2 ) ) ;
if ( mbFigure )
{
Rectangle aBoundingBox( Point( (long)( aCenterPoint.X - fRadius ), long( aCenterPoint.Y - fRadius ) ),
Size( ( static_cast< long >( 2 * fRadius ) ), (long)( 2 * fRadius) ) );
Polygon aPolygon( aBoundingBox, Point( (long)aStartingPoint.X, (long)aStartingPoint.Y ) ,Point( (long)aEndingPoint.X, (long)aEndingPoint.Y ), POLY_ARC );
if ( nSwitch )
mpOutAct->RegPolyLine( aPolygon, sal_True );
else
mpOutAct->RegPolyLine( aPolygon );
}
else
{
fG = 0;
FloatPoint aRadius;
aRadius.X = aRadius.Y = fRadius;
mpOutAct->DrawEllipticalArc( aCenterPoint, aRadius, fG, 2, fStartAngle, fEndAngle );
}
}
}
break;
case 0x0e : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Circular Arc 3 Point Close" )
{
int nSwitch = 0;
if ( mbFigure )
mpOutAct->CloseRegion();
FloatPoint aStartingPoint, aIntermediatePoint, aEndingPoint, aCenterPoint;
ImplGetPoint( aStartingPoint );
ImplGetPoint( aIntermediatePoint );
ImplGetPoint( aEndingPoint );
double fA = aIntermediatePoint.X - aStartingPoint.X;
double fB = aIntermediatePoint.Y - aStartingPoint.Y;
double fC = aEndingPoint.X - aStartingPoint.X;
double fD = aEndingPoint.Y - aStartingPoint.Y;
double fE = fA * ( aStartingPoint.X + aIntermediatePoint.X ) + fB * ( aStartingPoint.Y + aIntermediatePoint.Y );
double fF = fC * ( aStartingPoint.X + aEndingPoint.X ) + fD * ( aStartingPoint.Y + aEndingPoint.Y );
double fG = 2.0 * ( fA * ( aEndingPoint.Y - aIntermediatePoint.Y ) - fB * ( aEndingPoint.X - aIntermediatePoint.X ) );
aCenterPoint.X = ( fD * fE - fB * fF ) / fG;
aCenterPoint.Y = ( fA * fF - fC * fE ) / fG;
if ( fG != 0 )
{
double fStartAngle = ImplGetOrientation( aCenterPoint, aStartingPoint );
double fInterAngle = ImplGetOrientation( aCenterPoint, aIntermediatePoint );
double fEndAngle = ImplGetOrientation( aCenterPoint, aEndingPoint );
if ( fStartAngle > fEndAngle )
{
nSwitch ^=1;
aIntermediatePoint = aEndingPoint;
aEndingPoint = aStartingPoint;
aStartingPoint = aIntermediatePoint;
fG = fStartAngle;
fStartAngle = fEndAngle;
fEndAngle = fG;
}
if ( ! ( fInterAngle > fStartAngle ) && ( fInterAngle < fEndAngle ) )
{
nSwitch ^=1;
aIntermediatePoint = aEndingPoint;
aEndingPoint = aStartingPoint;
aStartingPoint = aIntermediatePoint;
fG = fStartAngle;
fStartAngle = fEndAngle;
fEndAngle = fG;
}
FloatPoint fRadius;
fRadius.Y = fRadius.X = sqrt( pow( ( aStartingPoint.X - aCenterPoint.X ), 2 ) + pow( ( aStartingPoint.Y - aCenterPoint.Y ), 2 ) ) ;
sal_uInt32 nType = ImplGetUI16();
if ( nType == 0 )
nType = 0; // is PIE
else
nType = 1; // is CHORD
double fOrientation = 0;
mpOutAct->DrawEllipticalArc( aCenterPoint, fRadius, fOrientation, nType, fStartAngle, fEndAngle );
}
}
break;
case 0x0f : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Circular Arc Centre" )
{
double fOrientation, fStartAngle, fEndAngle, vector[ 4 ];
FloatPoint aCenter, aRadius;
if ( mbFigure )
mpOutAct->CloseRegion();
ImplGetPoint( aCenter, sal_True );
ImplGetVector( &vector[ 0 ] );
if ( pElement->eVDCType == VDC_REAL )
{
aRadius.X = (double)ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
}
else
{
aRadius.X = (double)ImplGetI( pElement->nVDCIntegerPrecision );
}
ImplMapDouble( aRadius.X );
aRadius.Y = aRadius.X;
fStartAngle = acos( vector[ 0 ] / sqrt( vector[ 0 ] * vector[ 0 ] + vector[ 1 ] * vector[ 1 ] ) ) * 57.29577951308;
fEndAngle = acos( vector[ 2 ] / sqrt( vector[ 2 ] * vector[ 2 ] + vector[ 3 ] * vector[ 3 ] ) ) * 57.29577951308;
if ( vector[ 1 ] > 0 )
fStartAngle = 360 - fStartAngle;
if ( vector[ 3 ] > 0 )
fEndAngle = 360 - fEndAngle;
if ( mbAngReverse )
ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
if ( mbFigure )
{
Rectangle aBoundingBox(
Point( (long)( aCenter.X - aRadius.X ), long( aCenter.Y - aRadius.X ) ),
Size( static_cast< long >( 2 * aRadius.X ), (long)( 2 * aRadius.X ) ) );
Polygon aPolygon( aBoundingBox,
Point( (long)vector[ 0 ], (long)vector[ 1 ] ),
Point( (long)vector[ 2 ], (long)vector[ 3 ] ), POLY_ARC );
mpOutAct->RegPolyLine( aPolygon );
}
else
{
fOrientation = 0;
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation, 2, fStartAngle, fEndAngle );
}
mnParaSize = mnElementSize;
}
break;
case 0x10 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Circular Arc Centre Close" )
{
double fOrientation, fStartAngle, fEndAngle, vector[ 4 ];
FloatPoint aCenter, aRadius;
if ( mbFigure )
mpOutAct->CloseRegion();
ImplGetPoint( aCenter, sal_True );
ImplGetVector( &vector[ 0 ] );
if ( pElement->eVDCType == VDC_REAL )
{
aRadius.X = (double)ImplGetFloat( pElement->eVDCRealPrecision, pElement->nVDCRealSize );
}
else
{
aRadius.X = (double)ImplGetI( pElement->nVDCIntegerPrecision );
}
ImplMapDouble( aRadius.X );
aRadius.Y = aRadius.X;
fStartAngle = acos( vector[ 0 ] / sqrt( vector[ 0 ] * vector[ 0 ] + vector[ 1 ] * vector[ 1 ] ) ) * 57.29577951308;
fEndAngle = acos( vector[ 2 ] / sqrt( vector[ 2 ] * vector[ 2 ] + vector[ 3 ] * vector[ 3 ] ) ) * 57.29577951308;
if ( vector[ 1 ] > 0 )
fStartAngle = 360 - fStartAngle;
if ( vector[ 3 ] > 0 )
fEndAngle = 360 - fEndAngle;
if ( mbAngReverse )
ImplSwitchStartEndAngle( fStartAngle, fEndAngle );
sal_uInt32 nType = ImplGetUI16();
if ( nType == 0 )
nType = 0; // is PIE
else
nType = 1; // is CHORD
fOrientation = 0;
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
nType, fStartAngle, fEndAngle );
mnParaSize = mnElementSize;
}
break;
case 0x11 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Ellipse" )
{
double fOrientation;
FloatPoint aCenter, aRadius;
if ( mbFigure )
mpOutAct->CloseRegion();
ImplGetEllipse( aCenter, aRadius, fOrientation ) ;
mpOutAct->DrawEllipse( aCenter, aRadius, fOrientation ) ;
}
break;
case 0x12 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Elliptical Arc" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
double fOrientation, fStartAngle, fEndAngle, vector[ 4 ];
FloatPoint aCenter, aRadius;
if ( mbFigure )
mpOutAct->CloseRegion();
sal_Bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation );
ImplGetVector( &vector[ 0 ] );
fStartAngle = acos( vector[ 0 ] / sqrt( vector[ 0 ] * vector[ 0 ] + vector[ 1 ] * vector[ 1 ] ) ) * 57.29577951308;
fEndAngle = acos( vector[ 2 ] / sqrt( vector[ 2 ] * vector[ 2 ] + vector[ 3 ] * vector[ 3 ] ) ) * 57.29577951308;
if ( vector[ 1 ] > 0 )
fStartAngle = 360 - fStartAngle;
if ( vector[ 3 ] > 0 )
fEndAngle = 360 - fEndAngle;
if ( bDirection )
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
2, fStartAngle, fEndAngle );
else
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
2, fEndAngle, fStartAngle);
}
break;
case 0x13 : ComOut( CGM_LEVEL1 | CGM_EXTENDED_PRIMITIVES_SET, "Elliptical Arc Close" )
{
double fOrientation, fStartAngle, fEndAngle, vector[ 4 ];
FloatPoint aCenter, aRadius;
if ( mbFigure )
mpOutAct->CloseRegion();
sal_Bool bDirection = ImplGetEllipse( aCenter, aRadius, fOrientation );
ImplGetVector( &vector[ 0 ] );
fStartAngle = acos( vector[ 0 ] / sqrt( vector[ 0 ] * vector[ 0 ] + vector[ 1 ] * vector[ 1 ] ) ) * 57.29577951308;
fEndAngle = acos( vector[ 2 ] / sqrt( vector[ 2 ] * vector[ 2 ] + vector[ 3 ] * vector[ 3 ] ) ) * 57.29577951308;
if ( vector[ 1 ] > 0 )
fStartAngle = 360 - fStartAngle;
if ( vector[ 3 ] > 0 )
fEndAngle = 360 - fEndAngle;
sal_uInt32 nType = ImplGetUI16();
if ( nType == 0 )
nType = 0; // is PIE
else
nType = 1; // is CHORD
if ( bDirection )
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
nType, fStartAngle, fEndAngle );
else
mpOutAct->DrawEllipticalArc( aCenter, aRadius, fOrientation,
nType, fEndAngle, fStartAngle);
}
break;
case 0x14 : ComOut( CGM_LEVEL2, "Circular Arc Centre Reversed" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x15 : ComOut( CGM_LEVEL2, "Connection Edge" ) // NS
{
// if ( mbFigure )
// mpOutAct->CloseRegion();
}
break;
case 0x16 : ComOut( CGM_LEVEL3, "Hyperbolic Arc" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x17 : ComOut( CGM_LEVEL3, "Parabolic Arc" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x18 : ComOut( CGM_LEVEL3, "Non Uniform B-Spline" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x19 : ComOut( CGM_LEVEL3, "Non Uniform Rational B-Spline" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x1a : ComOut( CGM_LEVEL3, "Polybezier" )
{
sal_uInt32 nOrder = ImplGetI( pElement->nIntegerPrecision );
sal_uInt16 nNumberOfPoints = sal::static_int_cast< sal_uInt16 >(( mnElementSize - pElement->nIntegerPrecision ) / ImplGetPointSize());
Polygon aPolygon( nNumberOfPoints );
for ( sal_uInt16 i = 0; i < nNumberOfPoints; i++)
{
FloatPoint aFloatPoint;
ImplGetPoint( aFloatPoint, sal_True );
aPolygon.SetPoint( Point ( (long)( aFloatPoint.X ), (long)( aFloatPoint.Y ) ), i );
}
if ( nOrder & 4 )
{
for ( sal_uInt16 i = 0; i < nNumberOfPoints; i++ )
{
if ( ( i % 3 ) == 0 )
aPolygon.SetFlags( i, POLY_NORMAL );
else
aPolygon.SetFlags( i, POLY_CONTROL );
}
}
else
{
for ( sal_uInt16 i = 0; i < nNumberOfPoints; i++ )
{
switch ( i & 3 )
{
case 0 :
case 3 : aPolygon.SetFlags( i, POLY_NORMAL ); break;
default : aPolygon.SetFlags( i, POLY_CONTROL ); break;
}
}
}
if ( mbFigure )
mpOutAct->RegPolyLine( aPolygon );
else
mpOutAct->DrawPolybezier( aPolygon );
mnParaSize = mnElementSize;
}
break;
case 0x1b : ComOut( CGM_LEVEL3, "Polysymbol" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x1c : ComOut( CGM_LEVEL3, "Bitonal Tile" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x1d : ComOut( CGM_LEVEL3, "Tile" ) // NS
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0x1e : ComOut( CGM_UNKNOWN_LEVEL, "Insert Object" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xff : ComOut( CGM_GDSF_ONLY, "Polybezier" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xfe : ComOut( CGM_GDSF_ONLY, "Sharp Polybezier" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xfd : ComOut( CGM_GDSF_ONLY, "Polyspline" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xfc : ComOut( CGM_GDSF_ONLY, "Reounded Rectangle" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xfb : ComOut( CGM_GDSF_ONLY, "Begin Cell Array" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xfa : ComOut( CGM_GDSF_ONLY, "End Cell Array" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xf9 : ComOut( CGM_GDSF_ONLY, "Insert File" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xf8 : ComOut( CGM_GDSF_ONLY, "Block Text" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xf7 : ComOut( CGM_GDSF_ONLY, "Variable Width Polyline" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xf6 : ComOut( CGM_GDSF_ONLY, "Elliptical Arc 3 Point" )
{
if ( mbFigure )
mpOutAct->CloseRegion();
}
break;
case 0xf1 : ComOut( CGM_GDSF_ONLY, "Hyperlink Definition" ) break;
default: ComOut( CGM_UNKNOWN_COMMAND, "" ) break;
}
}
else
mnParaSize = mnElementSize;
};