svgtopt/gfx2d/src/GfxGeom/GfxGeneralPathIteratorP.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044

/*
* 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 "GfxGeneralPathIteratorP.h"
#include "GfxGeneralPath.h"



// --------------------------------------------------------------------------
//  CGfxGeneralPathIteratorP::CGfxGeneralPathIteratorP( CGfxGeneralPath* aPath,
// ---------------------------------------------------------------------------
 CGfxGeneralPathIteratorP::CGfxGeneralPathIteratorP( CGfxGeneralPath* aPath,
                                                             TGfxAffineTransform* aTransform )
    {
    iPath = aPath;
    iTransform = aTransform;
    }

//
// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
// --------------------------------------------------------------------------
//  CGfxGeneralPathIteratorP::~CGfxGeneralPathIteratorP()
// ---------------------------------------------------------------------------
 CGfxGeneralPathIteratorP::~CGfxGeneralPathIteratorP()
    {
    }



// --------------------------------------------------------------------------
//  TGfxSegType CGfxGeneralPathIteratorP::CurrentSegment( TFloatFixPt* aCoords )
// ---------------------------------------------------------------------------
 TGfxSegType CGfxGeneralPathIteratorP::CurrentSegment( TFloatFixPt* aCoords )
    {
    TGfxSegType segtype = EGfxSegClose;
    TInt32 pts = 1;

    TFloatFixPt* pd = aCoords;
    if(iPath->iPointCoords->Count() <= 0)
		{
		return segtype;
		}
    TFloatFixPt* ps = &( iPath->iPointCoords->operator[]( 0 ) );
    switch ( ( TGfxSegType ) ( *( iPath->iPointTypes ) )[iTypeIdx] )
        {
        case EGfxSegMoveTo:
            pd[0] = ps[iPointIdx];
            pd[1] = ps[iPointIdx + 1];
            iStartPoint.iX = pd[0];
            iStartPoint.iY = pd[1];
            segtype = EGfxSegMoveTo;
            break;
        case EGfxSegLineTo:
            pd[0] = ps[iPointIdx];
            pd[1] = ps[iPointIdx + 1];
            segtype = EGfxSegLineTo;
            break;
        case EGfxSegQuadTo:
            pd[0] = ps[iPointIdx];
            pd[1] = ps[iPointIdx + 1];
            pd[2] = ps[iPointIdx + 2];
            pd[3] = ps[iPointIdx + 3];
            segtype = EGfxSegQuadTo;
            pts = 2;
            break;
        case EGfxSegCubicTo:
            pd[0] = ps[iPointIdx];
            pd[1] = ps[iPointIdx + 1];
            pd[2] = ps[iPointIdx + 2];
            pd[3] = ps[iPointIdx + 3];
            pd[4] = ps[iPointIdx + 4];
            pd[5] = ps[iPointIdx + 5];
            segtype = EGfxSegCubicTo;
            pts = 3;
            break;
        case EGfxSegClose:
            pd[0] = iStartPoint.iX;
            pd[1] = iStartPoint.iY;
            segtype = EGfxSegClose;
            break;
        default:
            segtype = EGfxSegClose;
            pts = 0;
            break;
        }

    if ( !iTransform->IsIdentity() && pts > 0 )
        {
        iTransform->Transform( aCoords, aCoords, pts );
        }

    return segtype;
    }

// --------------------------------------------------------------------------
//  TBool CGfxGeneralPathIteratorP::IsDone()
// ---------------------------------------------------------------------------
 TBool CGfxGeneralPathIteratorP::IsDone()
    {
    return ( iPath->iPointTypes->Count() <= iTypeIdx );
    }

// --------------------------------------------------------------------------
//  void CGfxGeneralPathIteratorP::Next()
// ---------------------------------------------------------------------------
 void CGfxGeneralPathIteratorP::NextL()
    {
    if ( iPath->iPointTypes->Count() <= iTypeIdx - 1 )
        {
        return;
        }
    switch ( ( TGfxSegType ) ( *( iPath->iPointTypes ) )[iTypeIdx] )
        {
        case EGfxSegMoveTo:
            iPointIdx += 2;
            break;
        case EGfxSegLineTo:
            iPointIdx += 2;
            break;
        case EGfxSegQuadTo:
            iPointIdx += 4;
            break;
        case EGfxSegCubicTo:
            iPointIdx += 6;
            break;
        default:
            break;
        }

    iTypeIdx++;
    }