svgtopt/gfx2d/src/GfxGeom/GfxRoundRectangleIteratorP.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:46 +0100
branchRCL_3
changeset 39 1902ade171ab
parent 0 d46562c3d99d
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201026 Kit: 201035

/*
* 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 "GfxRoundRectangleIteratorP.h"
#include "GfxRoundRectangle2D.h"


// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
// --------------------------------------------------------------------------
// CGfxRoundRectangleIteratorP::CGfxRoundRectangleIteratorP( TGfxRoundRectangle2D* aRoundRect,
// ---------------------------------------------------------------------------
CGfxRoundRectangleIteratorP::CGfxRoundRectangleIteratorP( TGfxRoundRectangle2D* aRoundRect,
                                                          TGfxAffineTransform* aAffine )
    : iRoundRect( aRoundRect )
    {
    iTransform = aAffine;



    TFloatFixPt invalid( -1 );
    TFloatFixPt KZero;

    iRx = aRoundRect->iArcWidth;
    iRy = aRoundRect->iArcHeight;

    if ( ( ( iRx == invalid ) && ( iRy == invalid ) ) ||
        ( iRx < invalid ) || ( iRy < invalid ) )
        {
        iRx = KZero;
        iRy = KZero;
        }
    else if ( iRx == invalid )
        {
        iRx = iRy;
        }
    else if ( iRy == invalid )
        {
        iRy = iRx;
        }

    if ( aRoundRect->iWidth < KZero )
        aRoundRect->iWidth = KZero;

    if ( aRoundRect->iHeight < KZero )
        aRoundRect->iHeight = KZero;

	#ifdef SVG_FLOAT_BUILD
    TFloatFixPt hw = aRoundRect->iWidth * TFloatFixPt(.5f);
    TFloatFixPt hh = aRoundRect->iHeight * TFloatFixPt(.5f);
	#else
    TFloatFixPt hw = aRoundRect->iWidth >> 1;
    TFloatFixPt hh = aRoundRect->iHeight >> 1;
	#endif
    if ( iRx > hw )
        iRx = hw;
    if ( iRy > hh )
        iRy = hh;

    aRoundRect->iArcWidth = iRx;
    aRoundRect->iArcHeight = iRy;
    }

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
// --------------------------------------------------------------------------
// CGfxRoundRectangleIteratorP::~CGfxRoundRectangleIteratorP()
// ---------------------------------------------------------------------------
CGfxRoundRectangleIteratorP::~CGfxRoundRectangleIteratorP()
{
}

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

    switch ( iIdx )
        {
        case 0:
            aCoords[0] = iRoundRect->iX + iRx;
            aCoords[1] = iRoundRect->iY;
            segtype = EGfxSegMoveTo;
            break;
        case 1:
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth - iRx;
            aCoords[1] = iRoundRect->iY ;
            segtype = EGfxSegLineTo;
            break;
        case 2:
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
            aCoords[1] = iRoundRect->iY ;
            aCoords[2] = iRoundRect->iX + iRoundRect->iWidth;
            aCoords[3] = iRoundRect->iY + iRy;
            segtype = EGfxSegQuadTo;
            pts = 2;
            break;
        case 3:
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight - iRy;
            segtype = EGfxSegLineTo;
            break;
        case 4:
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
            aCoords[2] = iRoundRect->iX + iRoundRect->iWidth - iRx;
            aCoords[3] = iRoundRect->iY + iRoundRect->iHeight;
            segtype = EGfxSegQuadTo;
            pts = 2;
            break;
        case 5:
            aCoords[0] = iRoundRect->iX + iRx;
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
            segtype = EGfxSegLineTo;
            break;
        case 6:
            aCoords[0] = iRoundRect->iX;
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
            aCoords[2] = iRoundRect->iX;
            aCoords[3] = iRoundRect->iY + iRoundRect->iHeight - iRy;
            segtype = EGfxSegQuadTo;
            pts = 2;
            break;
        case 7:
            aCoords[0] = iRoundRect->iX;
            aCoords[1] = iRoundRect->iY + iRy;
            segtype = EGfxSegLineTo;
            break;
        case 8:
            aCoords[0] = iRoundRect->iX;
            aCoords[1] = iRoundRect->iY;
            aCoords[2] = iRoundRect->iX + iRx;
            aCoords[3] = iRoundRect->iY;
            segtype = EGfxSegQuadTo;
            pts = 2;
            break;
        default:
            segtype = EGfxSegClose;
            pts = 0;
        }

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

    return segtype;
    }

// --------------------------------------------------------------------------
// TBool CGfxRoundRectangleIteratorP::IsDone()
// ---------------------------------------------------------------------------
TBool CGfxRoundRectangleIteratorP::IsDone()
    {
    return ( iIdx > 9 );
    }

// --------------------------------------------------------------------------
// void CGfxRoundRectangleIteratorP::Next()
// ---------------------------------------------------------------------------
void CGfxRoundRectangleIteratorP::NextL()
    {
    iIdx++;
    }