diff -r 000000000000 -r 88edb906c587 svgtopt/gfx2d/src/GfxGeom/GfxGeneralPath.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtopt/gfx2d/src/GfxGeom/GfxGeneralPath.cpp Wed Nov 03 18:56:10 2010 +0200 @@ -0,0 +1,850 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Graphics Extension Library source file +* +*/ + + +#include "GfxGeneralPath.h" +#include "GfxGeneralPathIteratorP.h" +#include "GfxFlatteningPathIterator.h" + + + +// --------------------------------------------------------------------------- +// Constructors +// --------------------------------------------------------------------------- +// -------------------------------------------------------------------------- +// CGfxGeneralPath* CGfxGeneralPath::NewL() +// --------------------------------------------------------------------------- + CGfxGeneralPath* CGfxGeneralPath::NewL() + { + CGfxGeneralPath* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +// -------------------------------------------------------------------------- +// CGfxGeneralPath* CGfxGeneralPath::NewLC() +// --------------------------------------------------------------------------- + CGfxGeneralPath* CGfxGeneralPath::NewLC() + { + CGfxGeneralPath* self = new ( ELeave ) CGfxGeneralPath; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// -------------------------------------------------------------------------- +// CGfxGeneralPath::CGfxGeneralPath() +// --------------------------------------------------------------------------- +CGfxGeneralPath::CGfxGeneralPath() +{ +} + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::ConstructL() +// --------------------------------------------------------------------------- +void CGfxGeneralPath::ConstructL() + { + iPointTypes = new ( ELeave ) RArray( 4 ); + iPointTypes->AppendL(NULL); + iPointTypes->Remove(0); + iPointCoords = new ( ELeave ) RArray( 8 ); + iPointCoords->AppendL(NULL); + iPointCoords->Remove(0); + iPathSegmentTypeArray = NULL; + iCount = 0; + } + +// -------------------------------------------------------------------------- +// CGfxGeneralPath::~CGfxGeneralPath() +// --------------------------------------------------------------------------- + CGfxGeneralPath::~CGfxGeneralPath() + { + if ( iPointTypes ) + { + iPointTypes->Close(); + delete iPointTypes; + iPointTypes = NULL; + } + + if ( iPointCoords ) + { + iPointCoords->Close(); + delete iPointCoords; + iPointCoords = NULL; + } + if (iPathSegmentTypeArray) + { + delete [] iPathSegmentTypeArray; + iPathSegmentTypeArray = NULL; + } + } + +const TUint32 KSegClose = ( TUint32 ) EGfxSegClose; + +// -------------------------------------------------------------------------- +// TFloatFixPt CGfxGeneralPath::AreaSize() +// --------------------------------------------------------------------------- +TFloatFixPt CGfxGeneralPath::AreaSize() + { + return TFloatFixPt(0); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::ClosePathL() +// --------------------------------------------------------------------------- + void CGfxGeneralPath::ClosePathL() + { + TInt count = iPointTypes->Count(); + if ( count > 0 && (*iPointTypes)[count - 1] != KSegClose ) + { + iPointTypes->AppendL( KSegClose ); + } + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::HorizonToL( TFloatFixPt& aX, TBool aAbsolute ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::HorizonToL( TFloatFixPt& aX, TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + aX += iLastX; + } + else + { + aX += iPointCoords->operator[]( iPointCoords->Count() - 2 ); + } + } + + TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo; // const + + iPointTypes->AppendL( KSegLineto ); + iPointCoords->AppendL( aX ); + TFloatFixPt tmpY = ( iPointCoords->Count() < 2 ) ? TFloatFixPt( 0 ) : iPointCoords->operator[]( iPointCoords->Count() - 2 ); + iPointCoords->AppendL( tmpY ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::VertToL( TFloatFixPt& aY, TBool aAbsolute ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::VertToL( TFloatFixPt& aY, TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + aY += iLastY; + } + else + { + aY += iPointCoords->operator[]( iPointCoords->Count() - 1 ); + } + } + + TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo; // const + + iPointTypes->AppendL( KSegLineto ); + TFloatFixPt tmpX = ( iPointCoords->Count() < 2 ) ? TFloatFixPt( 0 ) : iPointCoords->operator[]( iPointCoords->Count() - 2 ); + iPointCoords->AppendL( tmpX ); + iPointCoords->AppendL( aY ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::LineToL( TFloatFixPt& aX, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::LineToL( TFloatFixPt& aX, + TFloatFixPt& aY, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 ); + TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 ); + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + lastX = iLastX; + lastY = iLastY; + } + aX += lastX; + aY += lastY; + } + + TUint32 KSegLineto = ( TUint32 ) EGfxSegLineTo; // const + + iPointTypes->AppendL( KSegLineto ); + iPointCoords->AppendL( aX ); + iPointCoords->AppendL( aY ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::RemoveLastPathCommand() +// --------------------------------------------------------------------------- + void CGfxGeneralPath::RemoveLastPathCommand() + { + TInt aTypeCount = iPointTypes->Count(); + TInt aPointCount = iPointCoords->Count(); + + if ( aPointCount >= 2 ) + { + //we need to remove the last amount from iLastX + iLastX -= (*iPointCoords)[aPointCount - 2]; + iLastY -= (*iPointCoords)[aPointCount - 1]; + } + + if ( aTypeCount > 0 ) + { + iPointTypes->Remove( aTypeCount - 1 ); + + if ( aPointCount >= 2 ) + { + iPointCoords->Remove( aPointCount - 1 ); + iPointCoords->Remove( aPointCount - 2 ); + } + } + } +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::MoveToL( TFloatFixPt& aX, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::MoveToL( TFloatFixPt& aX, + TFloatFixPt& aY, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + aX += iLastX; + aY += iLastY; + } + else + { + TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - + 2 ); + TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - + 1 ); + aX += lastX; + aY += lastY; + } + } + + TUint32 KSegMoveto = ( TUint32 ) EGfxSegMoveTo; // const + + iPointTypes->AppendL( KSegMoveto ); + iPointCoords->AppendL( aX ); + iPointCoords->AppendL( aY ); + // Save initial point of a new segment + // Could be the next initial point + iLastX = aX; + iLastY = aY; + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::QuadToL( TFloatFixPt& aX1, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::QuadToL( TFloatFixPt& aX1, + TFloatFixPt& aY1, + TFloatFixPt& aX2, + TFloatFixPt& aY2, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 ); + TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 ); + + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + lastX = iLastX; + lastY = iLastY; + } + + aX1 += lastX; + aY1 += lastY; + aX2 += lastX; + aY2 += lastY; + } + + TUint32 KSegQuadto = ( TUint32 ) EGfxSegQuadTo; + iPointTypes->AppendL( KSegQuadto ); + iPointCoords->AppendL( aX1 ); + iPointCoords->AppendL( aY1 ); + iPointCoords->AppendL( aX2 ); + iPointCoords->AppendL( aY2 ); + + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::CubicToL( TFloatFixPt& aX1, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::CubicToL( TFloatFixPt& aX1, + TFloatFixPt& aY1, + TFloatFixPt& aX2, + TFloatFixPt& aY2, + TFloatFixPt& aX3, + TFloatFixPt& aY3, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 ); + TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 ); + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + lastX = iLastX; + lastY = iLastY; + } + aX1 += lastX; + aY1 += lastY; + aX2 += lastX; + aY2 += lastY; + aX3 += lastX; + aY3 += lastY; + } + + TUint32 KSegCubicto = ( TUint32 ) EGfxSegCubicTo; // const + + iPointTypes->AppendL( KSegCubicto ); + iPointCoords->AppendL( aX1 ); + iPointCoords->AppendL( aY1 ); + iPointCoords->AppendL( aX2 ); + iPointCoords->AppendL( aY2 ); + iPointCoords->AppendL( aX3 ); + iPointCoords->AppendL( aY3 ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::ShortQuadToL( TFloatFixPt& aX2, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::ShortQuadToL( TFloatFixPt& aX2, + TFloatFixPt& aY2, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + aX2 += iLastX; + aY2 += iLastY; + } + else + { + aX2 += iPointCoords->operator[]( iPointCoords->Count() - 2 ); + aY2 += iPointCoords->operator[]( iPointCoords->Count() - 1 ); + } + } + + TFloatFixPt aX1, aY1; + GetCurveRefPoint( aX1, aY1 ); + QuadToL( aX1, aY1, aX2, aY2, ETrue ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::ShortCubicToL( TFloatFixPt& aX2, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::ShortCubicToL( TFloatFixPt& aX2, + TFloatFixPt& aY2, + TFloatFixPt& aX3, + TFloatFixPt& aY3, + TBool aAbsolute ) + { + if ( !aAbsolute && iPointCoords->Count() >= 2 ) + { + TFloatFixPt lastX = iPointCoords->operator[]( iPointCoords->Count() - 2 ); + TFloatFixPt lastY = iPointCoords->operator[]( iPointCoords->Count() - 1 ); + // If the last command was 'Z'/'z' + // the current point is the initial point + // of the previous segment - 'M'/'m' usually + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) == KSegClose ) + { + lastX = iLastX; + lastY = iLastY; + } + aX2 += lastX; + aY2 += lastY; + aX3 += lastX; + aY3 += lastY; + } + TFloatFixPt aX1, aY1; + GetCurveRefPoint( aX1, aY1 ); + // If there is no previous command or if the previous command + // was not an C, c, S or s, the first control point shall be coincident + // with the current point. + TUint32 KSegCubicto = ( TUint32 ) EGfxSegCubicTo; // const + if ( iPointTypes->operator[]( iPointTypes->Count() - 1 ) != KSegCubicto ) + { + aX1 = iLastX; + aY1 = iLastY; + } + + CubicToL( aX1, aY1, aX2, aY2, aX3, aY3, ETrue ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::GetCurveRefPoint( TFloatFixPt& aX, TFloatFixPt& aY ) +// --------------------------------------------------------------------------- +void CGfxGeneralPath::GetCurveRefPoint( TFloatFixPt& aX, TFloatFixPt& aY ) + { + if ( iPointCoords->Count() < 4 ) + { + aX = TFloatFixPt( 0 ); + aY = TFloatFixPt( 0 ); + return; + } + TFloatFixPt x0 = iPointCoords->operator[]( iPointCoords->Count() - 4 ); + TFloatFixPt y0 = iPointCoords->operator[]( iPointCoords->Count() - 3 ); + TFloatFixPt x1 = iPointCoords->operator[]( iPointCoords->Count() - 2 ); + TFloatFixPt y1 = iPointCoords->operator[]( iPointCoords->Count() - 1 ); + aX = x1 + x1 - x0; + aY = y1 + y1 - y0; + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::Reset() +// --------------------------------------------------------------------------- + void CGfxGeneralPath::Reset() + { + iPointTypes->Reset(); + iPointCoords->Reset(); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::AppendL( CGfxPathIterator* aItr ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::AppendL( CGfxPathIterator* aItr ) + { + TFloatFixPt tmpcoords[6]; + + // Set path data... + while ( !aItr->IsDone() ) + { + switch ( aItr->CurrentSegment( tmpcoords ) ) + { + case EGfxSegMoveTo: + MoveToL( tmpcoords[0], tmpcoords[1], ETrue ); + break; + case EGfxSegLineTo: + LineToL( tmpcoords[0], tmpcoords[1], ETrue ); + break; + case EGfxSegQuadTo: + QuadToL( tmpcoords[0], + tmpcoords[1], + tmpcoords[2], + tmpcoords[3], + ETrue ); + break; + case EGfxSegCubicTo: + CubicToL( tmpcoords[0], + tmpcoords[1], + tmpcoords[2], + tmpcoords[3], + tmpcoords[4], + tmpcoords[5], + ETrue ); + break; + case EGfxSegClose: + ClosePathL(); + } + aItr->NextL(); + } + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::GetBounds( const TGfxAffineTransform& aAt, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::GetBounds( const TGfxAffineTransform& aAt, + TGfxRectangle2D& aRect ) + { + TFloatFixPt xMin(KMAXFLOATFIX), yMin(KMAXFLOATFIX), xMax(KMINFLOATFIX), yMax(KMINFLOATFIX); + for (TInt i=0; iCount(); i+=2) + { + TGfxPoint2D p((*iPointCoords)[i], (*iPointCoords)[i+1]); + aAt.Transform(&p, &p, 1); + if (p.iX < xMin) xMin = p.iX; + if (p.iX > xMax) xMax = p.iX; + if (p.iY < yMin) yMin = p.iY; + if (p.iY > yMax) yMax = p.iY; + } + aRect.iX = xMin; + aRect.iY = yMin; + aRect.iWidth = xMax - xMin; + aRect.iHeight = yMax - yMin; + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt, + CGfxPathIterator*& aPitr ) + { + aPitr = new ( ELeave ) CGfxGeneralPathIteratorP( this, aAt ); + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt, +// --------------------------------------------------------------------------- + void CGfxGeneralPath::GetPathIteratorL( TGfxAffineTransform* aAt, + TInt aLimit, + CGfxPathIterator*& aPitr ) + { + aPitr = CGfxFlatteningPathIterator::NewL( this, aAt, aLimit ); + + } + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::SetPointTypeArrayL( RArray* aTypesArray ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::SetPointTypeArrayL( RArray* aTypesArray ) + { + TInt count = aTypesArray->Count(); + iPointTypes->Reset(); + + for ( TInt i = 0; i < count; i++ ) + { + iPointTypes->AppendL( (*aTypesArray)[i] ); + } + } + + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::SetPointTypeArrayRef( RArray*& aTypesArray ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::SetPointTypeArrayRef( RArray*& aTypesArray ) + { + if (iPointTypes) + { + iPointTypes->Reset(); + delete iPointTypes; + iPointTypes= NULL; + } + iPointTypes= aTypesArray; + } + + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::SetPointCoordsArrayRef( RArray*& aPointCoords ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::SetPointCoordsArrayRef( RArray*& aPointCoords ) + { + TInt count = aPointCoords->Count(); + if (iPointCoords) + { + iPointCoords->Reset(); + delete iPointCoords; + iPointCoords= NULL; + } + iPointCoords= aPointCoords; + } + + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::SetPointCoordsArrayL( RArray* aPointCoords ) +// --------------------------------------------------------------------------- + void CGfxGeneralPath::SetPointCoordsArrayL( RArray* aPointCoords ) + { + TInt count = aPointCoords->Count(); + iPointCoords->Reset(); + + for ( TInt i = 0; (i+1) < count; i+=2 ) + { + iPointCoords->AppendL( (*aPointCoords)[i] ); + iPointCoords->AppendL( (*aPointCoords)[i+1] ); + } + } + +// -------------------------------------------------------------------------- +// RArray* CGfxGeneralPath::PointTypeArray() +// --------------------------------------------------------------------------- + RArray* CGfxGeneralPath::PointTypeArray() + { + return iPointTypes; + } + + unsigned char* CGfxGeneralPath::PathSegmentTypeArray() + { + return iPathSegmentTypeArray; + } + + void CGfxGeneralPath::PathSegmentTypeArray(unsigned char* aSegmentTypeArray) + { + iPathSegmentTypeArray = aSegmentTypeArray; + } +// -------------------------------------------------------------------------- +// TFloatFixPt* CGfxGeneralPath::PointCoordsArray() +// --------------------------------------------------------------------------- + TFloatFixPt* CGfxGeneralPath::PointCoordsArray() + { + if((iPointCoords) && (iPointCoords->Count() > 0)) + return &( iPointCoords->operator[]( 0 ) ); + else + return NULL; + } + +// -------------------------------------------------------------------------- +// RArray* CGfxGeneralPath::PointCoordsArrayAll() +// --------------------------------------------------------------------------- + RArray* CGfxGeneralPath::PointCoordsArrayAll() + { + return iPointCoords; + } +// -------------------------------------------------------------------------- +// TInt CGfxGeneralPath::GetSegmentCount() +// --------------------------------------------------------------------------- + TInt CGfxGeneralPath::GetSegmentCount() + { + return iPointTypes->Count(); + } +// -------------------------------------------------------------------------- +// TInt CGfxGeneralPath::GetSegmentType(TInt aSegmentIndex) +// --------------------------------------------------------------------------- + TInt CGfxGeneralPath::GetSegmentType(TInt aSegmentIndex) + { + if(aSegmentIndex > 0 && aSegmentIndex <= iPointTypes->Count()) + { + TInt SegmentType = iPointTypes->operator[]( aSegmentIndex - 1 ); + TInt KSegLineto = ( TInt ) EGfxSegLineTo; + if( SegmentType == KSegLineto) + { + // differentiate between vertical and horizontal lines. + TBool isVertical = EFalse; + TBool isHorizontal = EFalse; + // the following function will tel us that this line segment is horizontal + // or vertical. + IsHorizontalLineOrVertical(aSegmentIndex-1, isHorizontal, isVertical); + if( !isHorizontal ) + { + if(isVertical) + { + TUint32 KVertical = 6; + return KVertical ; + } + } + else + { + TUint32 KHorizontal = 5; + return KHorizontal ; + } + return SegmentType; + } + return SegmentType; + } + else + { + return KErrBadHandle; + } + } +// -------------------------------------------------------------------------- +// TReal32 CGfxGeneralPath::GetSegmentParameter(TInt aSegmentIndex , TInt aParameterIndex) +// --------------------------------------------------------------------------- + TReal32 CGfxGeneralPath::GetSegmentParameter(TInt aSegmentIndex , TInt aParameterIndex) +{ + if( aSegmentIndex <= 0 && aSegmentIndex >= iPointTypes->Count()) + { + return 0.0; + } + + TInt count =0; + TInt Param = 0; + + while(count < (aSegmentIndex -1)) + { + + switch(iPointTypes->operator[]( count)) + { + + case EGfxSegClose: + break; + case EGfxSegLineTo: + Param+=2; + break; + case EGfxSegQuadTo: + Param+= 4; + break; + case EGfxSegCubicTo: + Param +=6; + break; + case EGfxSegMoveTo: + Param+= 2; + break; + default: + break; + } + count++; + } + + Param--; + + if((Param + aParameterIndex) >= iPointCoords->Count()) + { + return 0; + } + + return (TReal32)iPointCoords->operator[](Param + aParameterIndex); +} +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::IsHorizontalLineOrVertical(TInt aSegmentIndex, TBool& aHorizontal, TBool& aVertical) +// --------------------------------------------------------------------------- +void CGfxGeneralPath::IsHorizontalLineOrVertical(TInt aSegmentIndex, TBool& aHorizontal, TBool& aVertical) +{ + // see the previous segment. + if( aSegmentIndex <= 0 && aSegmentIndex >= iPointTypes->Count()) + { + return; + } + TInt count =0; + TInt Param =0; + TInt LastPram = 0; + while(count <= aSegmentIndex ) + { + // this will contain the Index to the last Segment. + LastPram= Param; + + // search for the current segment. + switch(iPointTypes->operator[]( count)) + { + // here increment the Param based on the number of attribute each command needs. + case EGfxSegClose: + break; + case EGfxSegLineTo: + Param+=2; + break; + case EGfxSegQuadTo: + Param+= 4; + break; + case EGfxSegCubicTo: + Param +=6; + break; + case EGfxSegMoveTo: + Param+= 2; + break; + default: + break; + } + count++; + } + + + Param--; + LastPram--; + + if ( ( (Param-1) >= 0) && ( (LastPram - 1) >= 0) ) + { + + if(iPointCoords->operator[](Param-1) == iPointCoords->operator[](LastPram-1)) + { + aVertical = ETrue; + return; + } + if(iPointCoords->operator[](Param) == iPointCoords->operator[](LastPram)) + { + aHorizontal = ETrue; + return; + } + } + else if ( (Param - 1 ) >= 0 ) + { + //this is the case where there is just a LineTo and nothing else + if ( iPointCoords->operator[](Param - 1) >= TFloatFixPt(0) ) + { + aHorizontal = ETrue; + return; + } + else if ( iPointCoords->operator[](Param) >= TFloatFixPt(0) ) + { + aVertical = ETrue; + return; + } + } +} + +TUint8 CGfxGeneralPath::Count() +{ + return iCount; +} + +void CGfxGeneralPath::Count(TUint8 aCount) +{ + iCount = aCount; +} +// -------------------------------------------------------------------------- +// CGfxGeneralPath* CGfxGeneralPath::CloneL() +// --------------------------------------------------------------------------- + CGfxGeneralPath* CGfxGeneralPath::CloneL() +{ + CGfxGeneralPath* path = CGfxGeneralPath::NewLC(); + TInt index = 0; + + for( index = 0; index < iPointTypes->Count(); index++ ) + { + path->iPointTypes->AppendL( iPointTypes->operator[]( index ) ); + } + for( index = 0; index < iPointCoords->Count(); index++ ) + { + path->iPointCoords->AppendL( iPointCoords->operator[]( index ) ); + } + path->iLastX = iLastX; + path->iLastY = iLastY; + if(TUint8 count = path->Count()) + { + path->iPathSegmentTypeArray = new unsigned char[count]; + for(int i =0; iiPathSegmentTypeArray[i] = iPathSegmentTypeArray[i]; + } + else + { + path->iPathSegmentTypeArray = NULL; + } + CleanupStack::Pop(); + return path; +} + +// -------------------------------------------------------------------------- +// void CGfxGeneralPath::QuadToLWithNoControlPoint() +// If there is no previous command or if the previous command was not a +// Q, q, T or t, the control point shall be current point. +// --------------------------------------------------------------------------- +void CGfxGeneralPath::QuadToLWithNoControlPoint(TFloatFixPt aX, TFloatFixPt aY) +{ + TUint32 KSegQuadto = ( TUint32 ) EGfxSegQuadTo; + iPointTypes->AppendL( KSegQuadto ); + iPointCoords->AppendL( iLastX ); + iPointCoords->AppendL( iLastY ); + iPointCoords->AppendL( aX ); + iPointCoords->AppendL( aY ); +}