svgtopt/gfx2d/src/GfxGeom/GfxRoundRectangleIteratorP.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 "GfxRoundRectangleIteratorP.h"
hgs
parents:
diff changeset
    20
#include "GfxRoundRectangle2D.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    24
// Constructor
hgs
parents:
diff changeset
    25
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    26
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    27
// CGfxRoundRectangleIteratorP::CGfxRoundRectangleIteratorP( TGfxRoundRectangle2D* aRoundRect,
hgs
parents:
diff changeset
    28
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    29
CGfxRoundRectangleIteratorP::CGfxRoundRectangleIteratorP( TGfxRoundRectangle2D* aRoundRect,
hgs
parents:
diff changeset
    30
                                                          TGfxAffineTransform* aAffine )
hgs
parents:
diff changeset
    31
    : iRoundRect( aRoundRect )
hgs
parents:
diff changeset
    32
    {
hgs
parents:
diff changeset
    33
    iTransform = aAffine;
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    TFloatFixPt invalid( -1 );
hgs
parents:
diff changeset
    38
    TFloatFixPt KZero;
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
    iRx = aRoundRect->iArcWidth;
hgs
parents:
diff changeset
    41
    iRy = aRoundRect->iArcHeight;
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
    if ( ( ( iRx == invalid ) && ( iRy == invalid ) ) ||
hgs
parents:
diff changeset
    44
        ( iRx < invalid ) || ( iRy < invalid ) )
hgs
parents:
diff changeset
    45
        {
hgs
parents:
diff changeset
    46
        iRx = KZero;
hgs
parents:
diff changeset
    47
        iRy = KZero;
hgs
parents:
diff changeset
    48
        }
hgs
parents:
diff changeset
    49
    else if ( iRx == invalid )
hgs
parents:
diff changeset
    50
        {
hgs
parents:
diff changeset
    51
        iRx = iRy;
hgs
parents:
diff changeset
    52
        }
hgs
parents:
diff changeset
    53
    else if ( iRy == invalid )
hgs
parents:
diff changeset
    54
        {
hgs
parents:
diff changeset
    55
        iRy = iRx;
hgs
parents:
diff changeset
    56
        }
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    if ( aRoundRect->iWidth < KZero )
hgs
parents:
diff changeset
    59
        aRoundRect->iWidth = KZero;
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
    if ( aRoundRect->iHeight < KZero )
hgs
parents:
diff changeset
    62
        aRoundRect->iHeight = KZero;
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
	#ifdef SVG_FLOAT_BUILD
hgs
parents:
diff changeset
    65
    TFloatFixPt hw = aRoundRect->iWidth * TFloatFixPt(.5f);
hgs
parents:
diff changeset
    66
    TFloatFixPt hh = aRoundRect->iHeight * TFloatFixPt(.5f);
hgs
parents:
diff changeset
    67
	#else
hgs
parents:
diff changeset
    68
    TFloatFixPt hw = aRoundRect->iWidth >> 1;
hgs
parents:
diff changeset
    69
    TFloatFixPt hh = aRoundRect->iHeight >> 1;
hgs
parents:
diff changeset
    70
	#endif
hgs
parents:
diff changeset
    71
    if ( iRx > hw )
hgs
parents:
diff changeset
    72
        iRx = hw;
hgs
parents:
diff changeset
    73
    if ( iRy > hh )
hgs
parents:
diff changeset
    74
        iRy = hh;
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
    aRoundRect->iArcWidth = iRx;
hgs
parents:
diff changeset
    77
    aRoundRect->iArcHeight = iRy;
hgs
parents:
diff changeset
    78
    }
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
// Destructor
hgs
parents:
diff changeset
    82
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    83
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    84
// CGfxRoundRectangleIteratorP::~CGfxRoundRectangleIteratorP()
hgs
parents:
diff changeset
    85
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    86
CGfxRoundRectangleIteratorP::~CGfxRoundRectangleIteratorP()
hgs
parents:
diff changeset
    87
{
hgs
parents:
diff changeset
    88
}
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
// TGfxSegType CGfxRoundRectangleIteratorP::CurrentSegment( TFloatFixPt* aCoords )
hgs
parents:
diff changeset
    92
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    93
TGfxSegType CGfxRoundRectangleIteratorP::CurrentSegment( TFloatFixPt* aCoords )
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
    TGfxSegType segtype;
hgs
parents:
diff changeset
    96
    TInt32 pts = 1;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
    switch ( iIdx )
hgs
parents:
diff changeset
    99
        {
hgs
parents:
diff changeset
   100
        case 0:
hgs
parents:
diff changeset
   101
            aCoords[0] = iRoundRect->iX + iRx;
hgs
parents:
diff changeset
   102
            aCoords[1] = iRoundRect->iY;
hgs
parents:
diff changeset
   103
            segtype = EGfxSegMoveTo;
hgs
parents:
diff changeset
   104
            break;
hgs
parents:
diff changeset
   105
        case 1:
hgs
parents:
diff changeset
   106
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth - iRx;
hgs
parents:
diff changeset
   107
            aCoords[1] = iRoundRect->iY ;
hgs
parents:
diff changeset
   108
            segtype = EGfxSegLineTo;
hgs
parents:
diff changeset
   109
            break;
hgs
parents:
diff changeset
   110
        case 2:
hgs
parents:
diff changeset
   111
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
hgs
parents:
diff changeset
   112
            aCoords[1] = iRoundRect->iY ;
hgs
parents:
diff changeset
   113
            aCoords[2] = iRoundRect->iX + iRoundRect->iWidth;
hgs
parents:
diff changeset
   114
            aCoords[3] = iRoundRect->iY + iRy;
hgs
parents:
diff changeset
   115
            segtype = EGfxSegQuadTo;
hgs
parents:
diff changeset
   116
            pts = 2;
hgs
parents:
diff changeset
   117
            break;
hgs
parents:
diff changeset
   118
        case 3:
hgs
parents:
diff changeset
   119
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
hgs
parents:
diff changeset
   120
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight - iRy;
hgs
parents:
diff changeset
   121
            segtype = EGfxSegLineTo;
hgs
parents:
diff changeset
   122
            break;
hgs
parents:
diff changeset
   123
        case 4:
hgs
parents:
diff changeset
   124
            aCoords[0] = iRoundRect->iX + iRoundRect->iWidth;
hgs
parents:
diff changeset
   125
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
hgs
parents:
diff changeset
   126
            aCoords[2] = iRoundRect->iX + iRoundRect->iWidth - iRx;
hgs
parents:
diff changeset
   127
            aCoords[3] = iRoundRect->iY + iRoundRect->iHeight;
hgs
parents:
diff changeset
   128
            segtype = EGfxSegQuadTo;
hgs
parents:
diff changeset
   129
            pts = 2;
hgs
parents:
diff changeset
   130
            break;
hgs
parents:
diff changeset
   131
        case 5:
hgs
parents:
diff changeset
   132
            aCoords[0] = iRoundRect->iX + iRx;
hgs
parents:
diff changeset
   133
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
hgs
parents:
diff changeset
   134
            segtype = EGfxSegLineTo;
hgs
parents:
diff changeset
   135
            break;
hgs
parents:
diff changeset
   136
        case 6:
hgs
parents:
diff changeset
   137
            aCoords[0] = iRoundRect->iX;
hgs
parents:
diff changeset
   138
            aCoords[1] = iRoundRect->iY + iRoundRect->iHeight;
hgs
parents:
diff changeset
   139
            aCoords[2] = iRoundRect->iX;
hgs
parents:
diff changeset
   140
            aCoords[3] = iRoundRect->iY + iRoundRect->iHeight - iRy;
hgs
parents:
diff changeset
   141
            segtype = EGfxSegQuadTo;
hgs
parents:
diff changeset
   142
            pts = 2;
hgs
parents:
diff changeset
   143
            break;
hgs
parents:
diff changeset
   144
        case 7:
hgs
parents:
diff changeset
   145
            aCoords[0] = iRoundRect->iX;
hgs
parents:
diff changeset
   146
            aCoords[1] = iRoundRect->iY + iRy;
hgs
parents:
diff changeset
   147
            segtype = EGfxSegLineTo;
hgs
parents:
diff changeset
   148
            break;
hgs
parents:
diff changeset
   149
        case 8:
hgs
parents:
diff changeset
   150
            aCoords[0] = iRoundRect->iX;
hgs
parents:
diff changeset
   151
            aCoords[1] = iRoundRect->iY;
hgs
parents:
diff changeset
   152
            aCoords[2] = iRoundRect->iX + iRx;
hgs
parents:
diff changeset
   153
            aCoords[3] = iRoundRect->iY;
hgs
parents:
diff changeset
   154
            segtype = EGfxSegQuadTo;
hgs
parents:
diff changeset
   155
            pts = 2;
hgs
parents:
diff changeset
   156
            break;
hgs
parents:
diff changeset
   157
        default:
hgs
parents:
diff changeset
   158
            segtype = EGfxSegClose;
hgs
parents:
diff changeset
   159
            pts = 0;
hgs
parents:
diff changeset
   160
        }
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    if ( !iTransform->IsIdentity() && pts > 0 )
hgs
parents:
diff changeset
   163
        {
hgs
parents:
diff changeset
   164
        iTransform->Transform( aCoords, aCoords, pts );
hgs
parents:
diff changeset
   165
        }
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    return segtype;
hgs
parents:
diff changeset
   168
    }
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   171
// TBool CGfxRoundRectangleIteratorP::IsDone()
hgs
parents:
diff changeset
   172
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   173
TBool CGfxRoundRectangleIteratorP::IsDone()
hgs
parents:
diff changeset
   174
    {
hgs
parents:
diff changeset
   175
    return ( iIdx > 9 );
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// void CGfxRoundRectangleIteratorP::Next()
hgs
parents:
diff changeset
   180
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
void CGfxRoundRectangleIteratorP::NextL()
hgs
parents:
diff changeset
   182
    {
hgs
parents:
diff changeset
   183
    iIdx++;
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185