svgtopt/gfx2d/src/GfxGeom/GfxEllipseIteratorP.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Graphics Extension Library source file
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "GfxEllipseIteratorP.h"
hgs
parents:
diff changeset
    20
#include "GfxEllipse2D.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    25
// Constructor
hgs
parents:
diff changeset
    26
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    27
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    28
// CGfxEllipseIteratorP::CGfxEllipseIteratorP( TGfxEllipse2D* aEllipse,
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
CGfxEllipseIteratorP::CGfxEllipseIteratorP( TGfxEllipse2D* aEllipse,
hgs
parents:
diff changeset
    31
                                            TGfxAffineTransform* aTransform )
hgs
parents:
diff changeset
    32
    {
hgs
parents:
diff changeset
    33
    TFloatFixPt KZero;
hgs
parents:
diff changeset
    34
    if ( aEllipse->iWidth < KZero )
hgs
parents:
diff changeset
    35
        aEllipse->iWidth = KZero;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    if ( aEllipse->iHeight < KZero )
hgs
parents:
diff changeset
    38
        aEllipse->iHeight = KZero;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
    iEllipse = aEllipse;
hgs
parents:
diff changeset
    41
    iTransform = aTransform;
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
// TGfxSegType CGfxEllipseIteratorP::CurrentSegment( TFloatFixPt* aCoords )
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
TGfxSegType CGfxEllipseIteratorP::CurrentSegment( TFloatFixPt* aCoords )
hgs
parents:
diff changeset
    48
    {
hgs
parents:
diff changeset
    49
    TGfxSegType segtype;
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    TInt32 pts = 3;
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    TFloatFixPt px[12], py[12];
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	#ifdef SVG_FLOAT_BUILD    
hgs
parents:
diff changeset
    56
    TFloatFixPt cx = iEllipse->iX + (iEllipse->iWidth * TFloatFixPt(.5f));
hgs
parents:
diff changeset
    57
    TFloatFixPt cy = iEllipse->iY + (iEllipse->iHeight * TFloatFixPt(.5f));
hgs
parents:
diff changeset
    58
    TFloatFixPt offx = iEllipse->iWidth * TFloatFixPt(.257f);
hgs
parents:
diff changeset
    59
    TFloatFixPt offy = iEllipse->iHeight * TFloatFixPt(.257f);
hgs
parents:
diff changeset
    60
	#else	
hgs
parents:
diff changeset
    61
    TFloatFixPt cx = iEllipse->iX + (iEllipse->iWidth >> 1);
hgs
parents:
diff changeset
    62
    TFloatFixPt cy = iEllipse->iY + (iEllipse->iHeight >> 1);
hgs
parents:
diff changeset
    63
    TFloatFixPt offx = TFloatFixPt( 0x41ca, ETrue ) * iEllipse->iWidth;
hgs
parents:
diff changeset
    64
    TFloatFixPt offy = TFloatFixPt( 0x41ca, ETrue ) * iEllipse->iHeight;
hgs
parents:
diff changeset
    65
	#endif
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    px[0] = px[1] = px[11] = iEllipse->iX;
hgs
parents:
diff changeset
    68
    px[2] = px[10] = cx - offx;
hgs
parents:
diff changeset
    69
    px[3] = px[9] = cx;
hgs
parents:
diff changeset
    70
    px[4] = px[8] = cx + offx;
hgs
parents:
diff changeset
    71
    px[5] = px[6] = px[7] = iEllipse->iX + iEllipse->iWidth;
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    py[2] = py[3] = py[4] = iEllipse->iY;
hgs
parents:
diff changeset
    74
    py[1] = py[5] = cy - offy;
hgs
parents:
diff changeset
    75
    py[0] = py[6] = cy;
hgs
parents:
diff changeset
    76
    py[7] = py[11] = cy + offy;
hgs
parents:
diff changeset
    77
    py[8] = py[9] = py[10] = iEllipse->iY + iEllipse->iHeight;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
    TFloatFixPt* p = aCoords;
hgs
parents:
diff changeset
    80
    switch ( iIdx )
hgs
parents:
diff changeset
    81
        {
hgs
parents:
diff changeset
    82
        case 0:
hgs
parents:
diff changeset
    83
            p[0] = px[0];
hgs
parents:
diff changeset
    84
            p[1] = py[0];
hgs
parents:
diff changeset
    85
            segtype = EGfxSegMoveTo;
hgs
parents:
diff changeset
    86
            pts = 1;
hgs
parents:
diff changeset
    87
            break;
hgs
parents:
diff changeset
    88
        case 1:
hgs
parents:
diff changeset
    89
            p[0] = px[1];
hgs
parents:
diff changeset
    90
            p[1] = py[1];
hgs
parents:
diff changeset
    91
            p[2] = px[2];
hgs
parents:
diff changeset
    92
            p[3] = py[2];
hgs
parents:
diff changeset
    93
            p[4] = px[3];
hgs
parents:
diff changeset
    94
            p[5] = py[3];
hgs
parents:
diff changeset
    95
            segtype = EGfxSegCubicTo;
hgs
parents:
diff changeset
    96
            break;
hgs
parents:
diff changeset
    97
        case 2:
hgs
parents:
diff changeset
    98
            p[0] = px[4];
hgs
parents:
diff changeset
    99
            p[1] = py[4];
hgs
parents:
diff changeset
   100
            p[2] = px[5];
hgs
parents:
diff changeset
   101
            p[3] = py[5];
hgs
parents:
diff changeset
   102
            p[4] = px[6];
hgs
parents:
diff changeset
   103
            p[5] = py[6];
hgs
parents:
diff changeset
   104
            segtype = EGfxSegCubicTo;
hgs
parents:
diff changeset
   105
            break;
hgs
parents:
diff changeset
   106
        case 3:
hgs
parents:
diff changeset
   107
            p[0] = px[7];
hgs
parents:
diff changeset
   108
            p[1] = py[7];
hgs
parents:
diff changeset
   109
            p[2] = px[8];
hgs
parents:
diff changeset
   110
            p[3] = py[8];
hgs
parents:
diff changeset
   111
            p[4] = px[9];
hgs
parents:
diff changeset
   112
            p[5] = py[9];
hgs
parents:
diff changeset
   113
            segtype = EGfxSegCubicTo;
hgs
parents:
diff changeset
   114
            break;
hgs
parents:
diff changeset
   115
        case 4:
hgs
parents:
diff changeset
   116
            p[0] = px[10];
hgs
parents:
diff changeset
   117
            p[1] = py[10];
hgs
parents:
diff changeset
   118
            p[2] = px[11];
hgs
parents:
diff changeset
   119
            p[3] = py[11];
hgs
parents:
diff changeset
   120
            p[4] = px[0];
hgs
parents:
diff changeset
   121
            p[5] = py[0];
hgs
parents:
diff changeset
   122
            segtype = EGfxSegCubicTo;
hgs
parents:
diff changeset
   123
            break;
hgs
parents:
diff changeset
   124
        default:
hgs
parents:
diff changeset
   125
            segtype = EGfxSegClose;
hgs
parents:
diff changeset
   126
            pts = 0;
hgs
parents:
diff changeset
   127
        }
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    if ( !iTransform->IsIdentity() && pts > 0 )
hgs
parents:
diff changeset
   132
        {
hgs
parents:
diff changeset
   133
        iTransform->Transform( aCoords, aCoords, pts );
hgs
parents:
diff changeset
   134
        }
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    return segtype;
hgs
parents:
diff changeset
   137
    }
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   140
// TBool CGfxEllipseIteratorP::IsDone()
hgs
parents:
diff changeset
   141
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   142
TBool CGfxEllipseIteratorP::IsDone()
hgs
parents:
diff changeset
   143
    {
hgs
parents:
diff changeset
   144
    return ( iIdx > 4 );
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   148
// void CGfxEllipseIteratorP::NextL()
hgs
parents:
diff changeset
   149
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   150
void CGfxEllipseIteratorP::NextL()
hgs
parents:
diff changeset
   151
    {
hgs
parents:
diff changeset
   152
    iIdx++;
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155