svgtopt/gfx2d/src/GfxGeom/GfxEllipseIteratorP.cpp
changeset 46 88edb906c587
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/gfx2d/src/GfxGeom/GfxEllipseIteratorP.cpp	Wed Nov 03 18:56:10 2010 +0200
@@ -0,0 +1,155 @@
+/*
+* 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 "GfxEllipseIteratorP.h"
+#include "GfxEllipse2D.h"
+
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+// --------------------------------------------------------------------------
+// CGfxEllipseIteratorP::CGfxEllipseIteratorP( TGfxEllipse2D* aEllipse,
+// ---------------------------------------------------------------------------
+CGfxEllipseIteratorP::CGfxEllipseIteratorP( TGfxEllipse2D* aEllipse,
+                                            TGfxAffineTransform* aTransform )
+    {
+    TFloatFixPt KZero;
+    if ( aEllipse->iWidth < KZero )
+        aEllipse->iWidth = KZero;
+
+    if ( aEllipse->iHeight < KZero )
+        aEllipse->iHeight = KZero;
+
+    iEllipse = aEllipse;
+    iTransform = aTransform;
+    }
+
+// --------------------------------------------------------------------------
+// TGfxSegType CGfxEllipseIteratorP::CurrentSegment( TFloatFixPt* aCoords )
+// ---------------------------------------------------------------------------
+TGfxSegType CGfxEllipseIteratorP::CurrentSegment( TFloatFixPt* aCoords )
+    {
+    TGfxSegType segtype;
+
+    TInt32 pts = 3;
+
+    TFloatFixPt px[12], py[12];
+
+	#ifdef SVG_FLOAT_BUILD    
+    TFloatFixPt cx = iEllipse->iX + (iEllipse->iWidth * TFloatFixPt(.5f));
+    TFloatFixPt cy = iEllipse->iY + (iEllipse->iHeight * TFloatFixPt(.5f));
+    TFloatFixPt offx = iEllipse->iWidth * TFloatFixPt(.257f);
+    TFloatFixPt offy = iEllipse->iHeight * TFloatFixPt(.257f);
+	#else	
+    TFloatFixPt cx = iEllipse->iX + (iEllipse->iWidth >> 1);
+    TFloatFixPt cy = iEllipse->iY + (iEllipse->iHeight >> 1);
+    TFloatFixPt offx = TFloatFixPt( 0x41ca, ETrue ) * iEllipse->iWidth;
+    TFloatFixPt offy = TFloatFixPt( 0x41ca, ETrue ) * iEllipse->iHeight;
+	#endif
+
+    px[0] = px[1] = px[11] = iEllipse->iX;
+    px[2] = px[10] = cx - offx;
+    px[3] = px[9] = cx;
+    px[4] = px[8] = cx + offx;
+    px[5] = px[6] = px[7] = iEllipse->iX + iEllipse->iWidth;
+
+    py[2] = py[3] = py[4] = iEllipse->iY;
+    py[1] = py[5] = cy - offy;
+    py[0] = py[6] = cy;
+    py[7] = py[11] = cy + offy;
+    py[8] = py[9] = py[10] = iEllipse->iY + iEllipse->iHeight;
+
+    TFloatFixPt* p = aCoords;
+    switch ( iIdx )
+        {
+        case 0:
+            p[0] = px[0];
+            p[1] = py[0];
+            segtype = EGfxSegMoveTo;
+            pts = 1;
+            break;
+        case 1:
+            p[0] = px[1];
+            p[1] = py[1];
+            p[2] = px[2];
+            p[3] = py[2];
+            p[4] = px[3];
+            p[5] = py[3];
+            segtype = EGfxSegCubicTo;
+            break;
+        case 2:
+            p[0] = px[4];
+            p[1] = py[4];
+            p[2] = px[5];
+            p[3] = py[5];
+            p[4] = px[6];
+            p[5] = py[6];
+            segtype = EGfxSegCubicTo;
+            break;
+        case 3:
+            p[0] = px[7];
+            p[1] = py[7];
+            p[2] = px[8];
+            p[3] = py[8];
+            p[4] = px[9];
+            p[5] = py[9];
+            segtype = EGfxSegCubicTo;
+            break;
+        case 4:
+            p[0] = px[10];
+            p[1] = py[10];
+            p[2] = px[11];
+            p[3] = py[11];
+            p[4] = px[0];
+            p[5] = py[0];
+            segtype = EGfxSegCubicTo;
+            break;
+        default:
+            segtype = EGfxSegClose;
+            pts = 0;
+        }
+
+
+
+    if ( !iTransform->IsIdentity() && pts > 0 )
+        {
+        iTransform->Transform( aCoords, aCoords, pts );
+        }
+
+    return segtype;
+    }
+
+// --------------------------------------------------------------------------
+// TBool CGfxEllipseIteratorP::IsDone()
+// ---------------------------------------------------------------------------
+TBool CGfxEllipseIteratorP::IsDone()
+    {
+    return ( iIdx > 4 );
+    }
+
+// --------------------------------------------------------------------------
+// void CGfxEllipseIteratorP::NextL()
+// ---------------------------------------------------------------------------
+void CGfxEllipseIteratorP::NextL()
+    {
+    iIdx++;
+    }
+
+